FTLab RadonEye RD200

Begonnen von DL3HRT, 25. Februar 2024, 10:54

⏪ vorheriges - nächstes ⏩

silfox

#30
Ich besitze mehrere RD200.
Ein Gerät habe ich umgebaut, den Mikrokontroller entfernt und lese den eigentlichen Detektor über die serielle Schnittstelle aus.
Die anderen lesen ich via Bluetooth über die crontab alle 10min mit Hilfe eines expect-Skripts auf einem RaspberryPi aus.

Man muss in dem unten stehenden Skript "1C:9D:C2:51:7F:5A" durch die Kennung des eigenen RD200 ersetzen.
Diese kann man erfragen mittels: sudo hcitool -i hci0 lescan


Das expect-Skript:
#!/usr/bin/expect -f
#
## remove output from STDOUT, except for puts
log_user 0
#
set timeout 4
#
spawn gatttool -b 1C:9D:C2:51:7F:5A -I
#
match_max 100000
#
expect "> "
#
while (1) {
  send -- "connect\r"
  expect "Connection successful"  break
  sleep 1
# puts "next attempt\n"
}
#
send -- "mtu 507\r"
expect "MTU was exchanged successfully" {

    sleep 1
    send -- "char-write-cmd 0x002a 50\r"

    set systemTime [clock seconds]
    puts "Time [clock format $systemTime -format %Y-%m-%dT%H:%M:%S]"
    set message1 ""

    expect {
            -re "Notification handle = 0x002c value: (.+\n)" {
              set message1 ${message1}$expect_out(1,string)
              exp_continue
        }
      }
      puts "$message1"
  }

send -- "exit\r"
#
expect eof

Dsl71

wow, sooo einfach geht das? Was ist da der output?

Ich kämpf ja mit meim esp32 ordentlich rum... SD Interface war nicht stabil, jetzt asynchroner Webserver schwächelt manchmal, JTAG debugger ist bestellt. Aber gut, ich will ja auch was lernen.

silfox

Der Output sieht so aus:

Time 2024-04-20T08:01:17
50 0a 0a 00 06 00 07 00 01 00 00 00 ^M

Time 2024-04-20T08:06:11
50 0a 08 00 07 00 07 00 01 00 01 00 ^M

Ich schreibe diesen Text in eine Datei und kopiere sie dann auf den Rechner, auf dem die Datenbank liegt.
Dort wandle ich die Datei mit einem C-Programm wie folgt um
(wichtig ist nur die Zeile mit der Hex-Umwandlung):

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* main  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(int argc, char *argv[])
{
  int      n;
  FILE    *ifp;
  char     cstop[30];
  char     its [256];

  char     s1 [80],s2[80],s3[80];
  int      x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11;


  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  char ifn[256];

  if (argc>1)
    strcpy(ifn,argv[1]);
  else
    sprintf(ifn,"rd200.log"); // so heisst die Datei mit dem Log-Output

  if ((ifp=fopen(ifn,"r"))==NULL)
  {
    fprintf(stderr,"unable to open %s\n",ifn);
    exit(1);
  }

  while (fgets(its,sizeof(its),ifp)) // read all lines
  {
    n=sscanf(its,"%s%s%s",s1,s2,s3);

    if (n<2) continue;

    if (strncasecmp(s1,"Time",4)==0) // read line with time
    {
      strncpy(cstop,s2,20);          // and remember date
    }
    else                             // read the hex data
    {
      n=sscanf(its,
              "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
                         &x0,&x1,&x2,&x3,&x4,&x5,&x6,&x7,&x8,&x9,&x10,&x11);

      double v1     = x1 *256 + x0;
      double rn_val = x3 *256 + x2;
      double v2     = x5 *256 + x4;
      double v3     = x7 *256 + x6;
      double v4     = x9 *256 + x8;
      double v5     = x11*256 + x10;

      // insup(cstop,rn_val); // insert in database at server

      fprintf(stderr,"n=%d date=%s rn=%7.0lf %.0lf %.0lf %.0lf %.0lf %.0lf\n",
                                               n,cstop,rn_val,v1,v2,v3,v4,v5);
    }
  }
  fclose(ifp);

  exit(0);
}

Dsl71

versteh, coole Lösung