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