Lightweight Arduino Datenübertragung

Servus zusammen

Es gibt hier ja schon einige Arduino Datenübertragungsscripte.
Manche sind richtig schön und Alleskönner. Hier hätte ich mal das komplette Gegenteil anzubieten:
Einfach simpel und minimalistisch, dafür unkaputtbar und stabil.
Frei nach dem Motto: Alles was nicht da ist, kann auch nicht kaputtgehen.

Also, wir brauchen:

  • eine Server Socket Instanz auf einen beliebigen freien Port. bei mir 1101
  • eine Registervariable welche als Übergergeordnete Instanz auf diesen Server Socket zeigt.
    als Target Script ist diese Script eingetragen:
# called from regVar
$data = trim($IPS_VALUE);
#Dataformat: B DataA0,DataA1,DataA2,DataA3 E
if ((substr($data,0,1) == "B") && (substr($data,strlen($data)-1,1)) == "E"){

$data = substr($data,1,strlen($data));  // "B" wegschneiden
$data = substr($data,0,strlen($data)-1); // "E" wegschneiden

$mydataArray = explode(",",$data);
SetValueInteger(19306 /*[Energie\PV\ext.Strommessung\Rohdaten von Arduino\AD0]*/,intval($mydataArray[0]));
SetValueInteger(30166 /*[Energie\PV\ext.Strommessung\Rohdaten von Arduino\AD1]*/,intval($mydataArray[1]));
SetValueInteger(58123 /*[Energie\PV\ext.Strommessung\Rohdaten von Arduino\AD2]*/,intval($mydataArray[2]));
SetValueInteger(44189 /*[Energie\PV\ext.Strommessung\Rohdaten von Arduino\AD3]*/,intval($mydataArray[3]));
}

Ich denke mal das ist ziemlich selbsterklärend: das Script erwartet Daten in dieser Form:
„B Data0,Data1,Data2,Data3 E“
Die Daten kommen im Klartext getrennt mit „,“ wobei B und E die Trennzeichen sind.

Der zugehörige Sketch im Arduino sieht so aus:


#include <SPI.h>
#include <Ethernet.h>
EthernetClient client;

int samples =0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0XEF, 0XFE, 0xEC};
byte ip[] = {10,0,0,50}; //eigene IP
byte subnet[] = {255,255,255,0};
byte server[] = { 10, 0, 0, 1 }; //IPSServer

void setup() {

Ethernet.begin(mac,ip,subnet);
Serial.begin(9600);

if (client.connect(server, 1101)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
 }
 delay(1000);
}

void loop() {
String TxtToSend; 

delay(10000);
TxtToSend = "B"+String(analogRead(A0)) + "," + String(analogRead(A1)) + "," + String(analogRead(A2))+ "," + String(analogRead(A3)) + "E";
Serial.println(TxtToSend);
client.println(TxtToSend);
  
// reconnect if necessary  
if (!client.connected()) {
    client.stop();
    delay (1000);
    client.connect(server, 1101);  
 }
  
  
}

Es sendet alle 10sec die Daten von A0-A3 im erwarteten Format an Port 1101 des IPS Rechner (bei mir 10.0.0.1)

Natürlich kann man noch wesentlich erweitern. bspw. lokal am Arduino averagen oder so.
Es soll hier aber erstmal nur als minimalistisches Beispiel dienen.

Bei mir funktioniert dieses übrigens seit etwa 3 Wochen absolut zuverlässig und problemlos. Ganz egal welche Störung ich provoziere, die Verbindung wird immer wieder sauber neu aufgebaut.
Übrigens hängt der Arduino nicht direkt im LAN, sondern es ist mit einem TP-Link TL-WR702N eine Wlan Bridge zur Potentialtrennung aufgebaut. Auch das klappt bis jetzt ohne Mecker.

Schönen Dank übrigens an Bayaro welcher mich von ersten Irrwegen mit Modbus auf den „richtigen“ Weg geleitet hat.

greez
bb

Hallo Bernhard,
Du solltest vielleicht noch die Bauteile erwähnen, die Ardunioversion und das Schild :wink:

Gruß Helmut

Ja, klar:
Es geht natürlich um Anbindung per LAN bzw. WLAN.

Ganz normale Arduino UNO und LAN Sheeld vom freundlichen Chinesen irgendwas um 25€ das Set. Sollte aber grundsätzlich 1:1 mit allen Arduinivarianten gehen.
Der erwähnte Mini WLAN Router liegt auch in der Preisklasse. Schön ist das alles mit einer gemeinsamen 5V Versorgung läuft.
Hatte übrigens auch mal ein WLAN Teil vom Chinamann - das war Schrott.

gruß
bb

Cool, das muss ich mal Testen. Hab grade einen Radino bekommen ist ein Leonardo mit WLAN Chip und integrierter Antennen alles auf einer kleinen Platine.

Hey,

super Sache hab schon viel probiert nen Arduino mit dem IPS zu verbinden, was bis jetzt ohne Probleme geklappt hat war direkt über USB.

Beim Arduino kommt die Meldung „connektion failed“, wenn ich das Script im IPS starte kommt diese Meldung

„Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\42023.ips.php on line 3“

ich muss doch bestimmt für „$IPS_VALUE“ etwas einsetzen oder?

Gruß und Danke

Stefan

Nein, das Script kannst du nicht „von hand“ starten.
Es wird automatisch bei einlangen eines Datenpaketes durch die Registervariable gestartet. Der Inhalt der Registervariable - das sind die empfangenen Daten - landen dann in der „$IPS_Value“ Variable.

Hast du den Serversocket angelegt ? Einen freien Port gesucht ? Dann den Arduino Sketch entsprechend angepasst ?
Zeigt das Target der Registervariable auf das Script ?

gruß
bb

Hm…Ok.
Ja das habe ich so gemacht wie du es oben beschrieben hast, ich schick nachher mal ein paar Bilder.

Gruß

Ich habe hier mal meine Version veröffentlicht, funktioniert quasi auf gleicher Basis, da kann man sich bei Bedarf noch die ein oder andere Zeile Code klauen :slight_smile:

Arduino über LAN in IPS einbinden (2-Wege Kommunikation)

Grüße,
Chris