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.
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.
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
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.