Arduino Serielle Client-Server Kommunikation

Ich habe einen NodeMCU mit einem Arduino Pro-Mini über die RX und TX Pins verbunden.
Die Kommunikation klappt auch super. Client sendet, Server empfängt und schickt eine Antwort.
Siehe hier:
http://www.airspayce.com/mikem/arduino/RadioHead/serial_reliable_datagram_client_8pde-example.html
http://www.airspayce.com/mikem/arduino/RadioHead/serial_reliable_datagram_server_8pde-example.html

Jetzt will ich an den Server ein Byte Array mit Befehlen senden.
z.B. {0x01, 0x15, 0x01} = schalte Relais an Pin D5 ein
oder {0x02, 0x13, 0x00} = gib mir den Messwert an Pin A0.
Das erste Byte enthält den Befehl, das zweite den Pin, das dritte den Status für die digitalen Pins (HIGH or LOW).

Nun die Frage:
Wie kann ich die PINS A0, A1, A2.... D0, D1, D2... in HEX-Werte und wieder zurück umwandeln?
Nur 0x01, 0x02 usw. gehen nicht, da ja A oder D mit übergeben werden muss.

Ich finde einfach keine Lösung

Gehören zu den analogen Eingängen nicht auch andere Kommandos und Wertebereiche als zu den digitalen?

Warum nimmst Du nicht die Pinnummern? A0 geht bei max. Dx+1 weiter.
Wenn also zum Beispiel die digitalen Pins von 0 bis 13 (D0-D13) gehen, dann ist die 14 = A0 usw.

Gruß Tommy

Ich finde einfach keine Lösung

Was du suchst/benötigst, nennt sich "Protokoll"
Siehe dazu: "OSI Schichtenmodell"

Tipp:
CmdMessenger

Gehören zu den analogen Eingängen nicht auch andere Kommandos und Wertebereiche als zu den digitalen?

Ich brauche nur die reinen Zahlen von 0-1023. Den Rest übernimmt dann wieder der NodeMCU.

Warum nimmst Du nicht die Pinnummern? A0 geht bei max. Dx+1 weiter.
Wenn also zum Beispiel die digitalen Pins von 0 bis 13 (D0-D13) gehen, dann ist die 14 = A0 usw.

Die Pins sind im Client fest definiert, da der auch schon einige Arbeiten erledigt.
z.B. const byte MT_PWR_PIN = D5;
Mir sind nur die Pins am NodeMCU ausgegangen, deshalb der Arduino.
Sind die Pins für jeden Arduino so durchnummeriert und werden nur zur besseren Übersicht als Dx und Ax unterschieden?
Erkennt das eventuell der Compiler durch die Auswahl des Boards in der Arduino IDE?
Das wäre dann schon mal ein guter Ansatz.

Was du suchst/benötigst, nennt sich “Protokoll”
Siehe dazu: “OSI Schichtenmodell”

Bin ich auch schon drüber gestolpert, muss aber bei RadioHead bleiben, da der ganze Spaß in die Pimatic integriert werden soll.

Erkennt das eventuell der Compiler durch die Auswahl des Boards in der Arduino IDE?

Für jedes Board gibts eine pins_arduino.h

freddy64:
Sind die Pins für jeden Arduino so durchnummeriert und werden nur zur besseren Übersicht als Dx und Ax unterschieden?

Soweit ich weiß ja. Probiere es doch einfach aus. Schließe eine LED mit Vorwiderstand an A0 an und nutze digitalWrite mit der Pinnummer.

Warum nutzt Du eigentlich eine serielle Verbindung? Ich finde I2C deutlich entspannter. Ein Beispiel für Nodemcu + UNO habe ich hier veröffentlicht.

Gruß Tommy

freddy64:
Das wäre dann schon mal ein guter Ansatz.

Ersetze "wäre" durch "ist" - dann stimmts :slight_smile:

freddy64:
..., muss aber bei RadioHead bleiben, da der ganze Spaß in die Pimatic integriert werden soll.

Okay, wenn an Deiner seriellen Schnittstelle noch weitere Teilnehmer hängen (werden). Die Kommunikation zwischen Deiner NodeMCU und dem Arduino als "Porterweiterung" ist aber doch Deine Privatsache - damit kannst Du die Interpretation der über die RH-Library als Transportlayer verschickten Daten selbst bestimmen; das bleibt gegenüber der Außenwelt verborgen.

Außerdem würde ich in einem Protokoll immer logische Funktionen definieren und enkodieren (NodeMCU: "Relais X on/off") und auf der Gegenseite passend dekodieren (Arduino: "Schalte Port-Pin für Relais X"). Damit gewinnst Du auch die Freiheit, am Arduino mal anders zu verdrahten ohne den NodeMCU ändern zu müssen.

Nebenbemerkung zur "Datensparsamkeit": Der Befehl "Messwert an A0" braucht eigentlich kein drittes Byte. Wenn alle Befehle jeweils eine feste Länge haben, brauchst Du nach dem Schreiben bzw. Erkennen des Befehls nur die restlichen Bytes schreiben und lesen; ansonsten ist ein Längenbyte vorneweg auch keine schlechte Lösung.

Gruß Walter

Hab jetzt schon mal folgendes:
NodeMCU startet und sendet: "1,14,1" an den RH_Server
bedeutet Arduino->D5 = HIGH;
dann:
1,12,0
bedeutet Arduino->D6 = LOW;
dann:
1,13,0
bedeutet Arduino->D7 = LOW;
dann:
3,17
bedeutet gib mir den Wert am Arduino->A0;

Die Reihenfolge der Pins am NodeMCU D5=GPIO14, D6=GPIO12, D7=GPIO13 muss ja nicht zwangsläufig am Arduino die gleiche sein. ich finde diese pins_arduino.h nirgens.
Dann könnte ich am Server mit switch case die gesendeten Daten in die Arduino Pins konvertieren.

Wo muss ich die GPIO Definitionen für die jeweiligen Boards suchen.

Hi

Mit den Definitionen hast Du normal Nichts am Hut.
Das ist Arduino-spezifisch, daß Du an JEDEM Arduino D2 schreiben kannst, schei* egal, welcher µC darunter verbaut ist und an welchem Pin dann wirklich 'D2' hängt.

Wie ist Dein Protokoll zu interpretieren?
Was bedeuten die Zahlen 1 und 2? 3 wird WRITE HIGH/LOW sein.

MfG

freddy64:
Wo muss ich die GPIO Definitionen für die jeweiligen Boards suchen.

Zum Beispiel in

D:\Arduino\hardware\arduino\avr\variants

Gruß Tommy

freddy64:
...
ich finde diese pins_arduino.h nirgens.
...
Wo muss ich die GPIO Definitionen für die jeweiligen Boards suchen.

HIER
Oder natürlich auf deinem Rechner, da gibts die Datei auch, sonst würde es nicht kompilieren

OK, hab die Pin-Definitionen für die jeweiligen AVR's gefunden und mir eine function translate_pin in dem Arduino Sketch geschrieben.
Jetzt rennt die Gaudi wia'd Sau. Alle Messwerte an den Analog Pins des Arduino werden korrekt an den NodeMCU übergeben und die Relais am Arduino schalten wie es sein soll.
Jetzt muss ich nur noch eine Fehlerbehandlung einbauen, falls der Arduino mal abkackt und der NodeMCU nichts davon weiß.

Dank noch mal an alle, die mir geholfen haben.