Arduino UDP und Analogwerte

In den Beiträgen Loxone UDP Kommunikation und Arduino UDP Kommunikation ging es bisher nur um die Übertragung von einfachen Befehlen. Mit wenigen Anpassungen können mit dem Arduino über das UDP Protokoll auch mehrere und zudem noch analoge Werte von Temperatursensoren, Lichtsensoren, etc. übertragen werden.

Sketch

Da dieser Beitrag eigentlich nur eine kleine Erweiterung des bekannten Skripts ist, habe ich mich nur auf die angepassten Zeilen beschränkt.

In der Loop Schleife wird jetzt an die Funktion sendUDP eine sensorID (Im Beispiel “S01”) zusätzlich zur Variable sensorValue (Im Beispiel 22) übergeben. Die SensorID dient der späteren Identifizierung und sollte, wenn mehrere Sensoren verwendet werden, natürlich einzigartig sein.

String sensorID = "S01";
int SensorValue = 22;
sendUDP(sensorID,SensorValue);  # Wer will kann auch abkürzen und gleich sendUDP("S01",SensorValue); schreiben

Die Funktion sendUDP, die für das Senden der UDP Pakete zuständig ist, wird leicht erweitert damit sensorID  und sensorValue an das nachfolgende System übergeben werden kann.

void sendUDP (String sensorID, int sensorValue)
{
Udp.beginPacket(RecipientIP, RecipientPort);
Udp.print(sensorID);
Udp.print(sensorValue);
Udp.endPacket();
delay(10);
}

Wenn wir davon ausgehen, dass die Variable value den Wert 22 beinhaltet, dann sollte beim Empfänger ein UDP Paket mit dem Inhalt S0122 ankommen.

Loxone

In der Loxone Config wird dann das UDP Paket mit der Befehlserkennung wieder in SensorID und sensorValue “zerlegt”.  Dazu wird im Feld Befehlserkennung im Virtueller UDP Eingang Befehl die vergebene SensorID gefolgt von einem \v eingetragen. Dem “Arduino Sensor 01” wird damit der Sensor S01 vom Arduino zugewiesen.Arduino UDP und Analogwerte - Loxone Befehlserkennung

Wenn wir beim Beispiel von oben bleiben, dann sollte im Virtueller UDP Eingang Befehl das Objekt “Arduino Sensor 01” den Wert 22 anzeigen.Arduino UDP und Analogwerte - Loxone Objekt

13 Gedanken zu „Arduino UDP und Analogwerte“

    1. Hallo David,

      der Sketch ist natürlich nicht vollständig! Das ist eine kleine Erweiterung vom Arduino UDP Sketch den du ja bereits kennst. Du kannst jeden Sensor benutzen. Klassisch fängt man mit einem Potentiometer (10k, linear) an zu basteln.

      Viele Grüße
      Stefan

    1. Hallo David,

      in dem Beispiel kommt kein DHT11 Sensor vor?! Der Wert kommt aus der Variable SensorValue.

      Wenn ich einfach mal davon ausgehe das du die Adafruit Library für den DHT11 Sensor verwendest, dann kannst du fast jeden Pin nutzen, im Beispiel ist es Pin 2. Wenn ich mich nicht irre, dann müsstest du um z. B. die Temperatur zu übertragen die Variable SensorValue wie folgt füllen.

      SensorValue = dht.readTemperature();

      Viele Grüße
      Stefan

  1. Hallo,

    geht das eigentlich auch im umgekehrten Sinne? Also einen Analogwert aus Loxone per UDP Befehl versenden?
    Leider habe ich noch nicht herausgefunden wie der Befehl dann aussehen muss.

    Grüße

    Alfred

    1. Hallo Alfred,

      das geht natürlich auch! Du musst nur wie im Beitrag Loxone UDP Kommunikation beschrieben, einen Virtuellen Ausgang Befehl anlegen und diesen mit deinem Sensor verbinden. Wenn du z. B. Temperaturdaten übertragen willst, musst du im Befehl bei EIN eintragen. Spätestens wenn du mehrere Werte übertragen willst, solltest du eine SensorID wie z. B. 01 für den ersten Sensor, mitgeben. Damit stellst du sicher, dass du die Werte am Arduino unterschieden kannst. Wenn du eine Zahl mit Nachkommastellen übertragen möchtest, würde ich diese durch eine einfach Multiplikation (23,9 Grad x 10 = 239) vor der Übertragung “entfernen”.

      Am Arduino trennst du die empfangenen Daten dann in SensorID und den Wert auf. Wenn also 01239 am Arduino ankommt, ist das der Sensor 1 mit 239/10 = 23,9 Grad.

      Ich hoffe, ich konnte dir weiterhelfen?!

      Viele Grüße
      Stefan

  2. Hallo Stefan,

    Ich hab es jetzt mit DHT22 versucht, aber ich hab problem das es zu loxone schickt nur 22 value und nicht 22.5 wie auf LCD display. Wo kann das problem sein?
    Auf loxone UDP monitor sehe ich nur T0122 fur 22C oder auf display 22.5C.
    Auch was hab ich gemerkt das ist egal ob ist sensorID oder sensorID2 es schickt data so wie so
    Danke


    h = dht.readHumidity();
    t = dht.readTemperature();
    Serial.println(t);
    Serial.println(h);
    lcd.setCursor(0, 0); lcd.print("Humy (%): "); lcd.print(h);
    //lcd.print(dht.readHumidity());
    lcd.setCursor(0, 1); lcd.print("Temp (C): "); lcd.print(t);
    //lcd.print(dht.readTemperature());
    String sensorID1 = "H01"; // Humidity
    String sensorID2 = "T01"; // Temperature
    float SensorValue1 = dht.readHumidity(); // dht.readHumidity() or (h) sends only full number 22 - not 22.5
    int SensorValue2 = (t); // int / float same result
    sendUDP ("H01", SensorValue1); // # Wer will kann auch abkürzen und gleich sendUDP("S01",SensorValue); schreiben
    sendUDP (sensorID2, SensorValue2);

    1. Hallo David,

      ich bin mir nicht sicher aber wenn du den Float Wert sendest interpretiert die Loxone die Nachkommastelle falsch. Du kannst den Wert aber mal 10 oder bei zwei Nachkommastellen mal 100 rechnen und auf der Loxone Seite den Wert entsprechend durch eine Formel wieder teilen. Nicht schön aber es funktioniert.

      Viele Grüße
      Stefan

  3. Hallo Stefan,
    erstmal vielen Dank für die so perfekt dargestellten Tipps.
    Ich möchte gern etwas mehr Daten an eine S7 senden, bzw. welche empfangen. Vom Prinzip her hat das auch schon perfekt geklappt. Mit einem UDP Eingang habe ich 4 Bytes empfangen und diese dann an 4 Binärdekoder geschrieben. Aber ich benötige 8. (4*4*8=128 Bits). Weßit du wieviel ich maximal mit einem UDP Befehl übertragen kann? Bei Loxone ist das nicht richtig beschrieben. Außer dass sie schreiben, dass man das Byte herausziehen kann (1 2 3 4).

    Vielen Dank!

    1. Hallo Torben,

      leider kann ich dir auf deine Frage keine Antwort geben, dafür habe ich mich nicht ausreichend in das Thema eingearbeitet. Ich hoffe du bekommst es trotzdem irgendwie raus! Deine Daten auf mehrere UDP Pakete aufteilen ist keine Lösung?

      Viele Grüße
      Stefan

      1. Hallo Stefan,
        danke für deine Antwort.
        Ich habs inzwischen zusamnen mit dem Loxone Support teilweise gelöst.
        Ich kann mit . Die Bytes verschieben. Also empfangen geht super. Nun versuche ich noch aus 8 bits ein byte zu machen. Quasi einen Binärcodierer. Und das mit möglichst wenig Bausteinen, denn ich brauche das ein paar mal.

        Grüße,
        Torben

  4. Hallo !
    Ich habe ein problem beim umrechen bei float …
    Es kommt hier 0 an

    float phValue = -5.70 * pHVol + calibration;

    sprintf ( msg, ” %d”, phValue);
    Serial.println(msg);
    sendUDP(msg);

    ich bitte um hilfe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert