Messwerte (Strom, Spannung, Temperatur) über HC05 (Bluetooth) versenden

Hallo Gemeinde;

ich bin neu und brauch eure Hilfe. Mein Projekt ist ein Fernsteuerung, welche einen Servo über Bluetooth ansteuert. Das läuft auch soweit, da es dieses Thema als youtube-tutorial gibt und ja ich gebe auch gleich zu, dass ich noch einer der vielen drag and drop Programmierer bin. Wobei ich echt versuche zu lernen, da mich das selber nervt.
Jetzt könnte man am slave ja auch noch was messen (strom spannung..)und wieder zurück zum Master senden um es dort auf einem kleinen OLED auszugeben. Aber da hört es bei mir schon auf.

Nun fange ich gerade an das Ganze in einzelne Projekte zu unterteilen um Schritt für Schritt die Programmierung zu lernen.

Wie versende ich mehrere Daten seriell. Muss ich die Messwerte zur Datenpakete selber zusammenfassen und dann wieder entschlüsseln ? oder sendet man jedes einzeln.......wie erkennt man dann das ein Datenpaket zusammen gehört ?

Oder ist das so gar nicht so einfach möglich. Am schönsten wäre es da wenn es dazu eine Libary geben würde.

Ich verwende 2 Nano und 2 HC05. Code kann ich gerne posten, aber der ist so einfach da lacht Ihr alle drüber.

Danke schon mal im Voraus

Stefan

hoetzi:
Wie versende ich mehrere Daten seriell. Muss ich die Messwerte zur Datenpakete selber zusammenfassen und dann wieder entschlüsseln ? oder sendet man jedes einzeln.......wie erkennt man dann das ein Datenpaket zusammen gehört ?

Da gibt es ganz viele Möglichkeiten.

Du könntest beispielsweise Text übertragen: STX "005,3" CR "025,5" LF mit STX=0x2, CR=0x13 und LF=0x10. Dabei könnte der erste Wert des Datenpakets der Strom und der zweite die Spannung sein, aber auch umgekehrt.

Oder Du unterscheidest nach Inhalt durch Voranstellen eines Buchstabens: STX "U005,3" LF für die Spannung und "I025,5" LF für den Strom. Dann kannst Du nach Bedarf die Werte getrennt übermitteln.

Okay, erst mal danke. Hast du evtl. noch einen Tip wo es ein tutorial oder so gibt wo ich mir das ansehen kann?

STefan

Leider nein :frowning:

Aber dieses Forum besteht ja aus vielen Leuten, die die unglaublichsten Dinge wissen :smiley:

Sowas kannst du mit dem seriellen Monitor testen. Da gibst du ein was du empfangen willst. z.B. 3 Float Werte als String übertragen:

const int SERIAL_BUFFER_SIZE = 21;
char serialBuffer[SERIAL_BUFFER_SIZE];

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (readSerial(Serial))      //liefert true wenn das LF eingelesen wurde
  {
    float value1 = atof(strtok(serialBuffer, ";,"));
    float value2 = atof(strtok(NULL, ";,"));
    float value3 = atof(strtok(NULL, ";,"));

    Serial.println(value1);
    Serial.println(value2);
    Serial.println(value3);
    Serial.println();
  }
}


bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c == '\n' && index > 0)       //wenn LF eingelesen und String länger als 0 ist
    {
      serialBuffer[index] = '\0';     //String terminieren
      index = 0;
      return true;                    //melden dass String fertig eingelesen wurde
    }
    else if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)   //solange noch Platz im Puffer ist
    {
      serialBuffer[index++] = c;    //Zeichen abspeichern und Index inkrementieren
    }
  }
  return false;        //noch nicht fertig
}

strtok() (string tokenizer) und atof() (ascii to float) kannst du bei Google nachschlagen

Eingabe so:

12.3;45.6;78.9

3 Werte durch einen Strichpunkt oder Komma getrennt

Und dabei am Ende ein Linefeed senden! Sonst geht es nicht! Das kannst du unten rechts einstellen

Man kann auch die drei Werte einzeln senden und einen Buchstaben voranstellen um sie zu unterscheiden. z.B. "T12.5" für die Temperatur. Das Einlesen geschieht dann genauso. Nur den Parser muss man ändern. Da kann man einfach mit switch/case auf das erste Zeichen abfragen. Und dann atof(serialBuffer + 1) für den Wert

Super !!! vielen Dank !!! jetzt kann ich weiter machen und hab eine Richtung die funktioniert.

Gruss Stefan

Geht übrigens auch mit anderen Datentypen. Für die Konvertierung in Integer gibt es atoi(), bzw. atol()

Wobei man das für die reine Anzeige nicht unbedingt braucht. strtok() liefert einen Zeiger auf einen Teil-String. Den kannst du auch direkt ausgeben. Andererseits ist auf auf LCDs oft nötig Zahlen auf eine konstante Breite zu formatieren (z.B. mit führenden oder nachfolgenden Leerzeichen), damit nicht alter Text stehen bleibt. Dafür braucht man wiederum Zahlen. Oder du machst das schon auf der Sender-Seite.