Servus
Hab mir vor einiger Zeit eine Handvoll Ethernet Sheelds vom Chinesen kommen lassen. Die genaue Type weiß ich ehrlich gesagt nicht. Haben den gleichen Formfaktor wie die Sheelds fürn ArduinoUno.
Hier mal ein wenig Beispielcode
Dieser Sketch verwaltet Arduino seitig 5 Analoge Eingänge, er bildet aus den ADC Werten den runningAverage und schickt ihn dann in regelmäßigen Abständen an IPS. Die Skalierung und Umrechnung in die jeweiligen Einheiten erfolgt in IPS.
#include <SPI.h>
#include <Ethernet.h>
#include <RunningAverage.h>
// Pin für LED
int LED = 13;
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, 101 };
RunningAverage myA0(10);
RunningAverage myA1(10);
RunningAverage myA2(10);
RunningAverage myA3(10);
void setup() {
pinMode(LED, OUTPUT);
Ethernet.begin(mac, ip, subnet);
Serial.begin(9600);
Serial.println("Start Ethernet");
delay(5000);
if (client.connect(server, 1101)) {
Serial.println("connected");
} else {
Serial.println("connection failed");
}
myA0.clear();
myA1.clear();
myA2.clear();
myA3.clear();
}
void loop() {
String TxtToSend;
myA0.addValue(analogRead(A0));
myA1.addValue(analogRead(A1));
myA2.addValue(analogRead(A2));
myA3.addValue(analogRead(A3));
samples++;
digitalWrite(LED, LOW);
if (samples == 5000)
{
digitalWrite(LED, HIGH);
delay(1000);
TxtToSend = "B" + String(myA0.getAverage()) + "," + String(myA1.getAverage()) + "," + String(myA2.getAverage()) + "," + String(myA3.getAverage()) + "E";
Serial.println(TxtToSend);
client.println(TxtToSend);
samples = 0;
myA0.clear();
myA1.clear();
myA2.clear();
myA3.clear();
if (!client.connected()) {
client.stop();
delay (1000);
if (client.connect(server, 1101)) {
Serial.println("connected");
} else {
Serial.println("connection failed");
}
}
}
}
In IPS ist ein ServerSocket auf Port 1101 und eine entsprechende Registervariable angelegt.
Die Registervariable empfängt die Daten und leitet sie an dieses Script weiter:
<?
# 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"){
#echo $data;
$data = substr($data,1,strlen($data)); // "B" wegschneiden
$data = substr($data,0,strlen($data)-1); // "E" wegschneiden
$mydataArray = explode(",",$data);
SetValueInteger(19306,intval($mydataArray[0]));
SetValueInteger(30166,intval($mydataArray[1]));
SetValueInteger(58123,intval($mydataArray[2]));
SetValueInteger(44189,intval($mydataArray[3]));
}
?>
Soweit mal als rudimentäres Beispiel. Die Richtung Arduino -> IPS
Natürlich kann man auch Daten in die andere Richtung schicken und so was auch immer am Arduino machen. bspw. Porst setzen, oder gezielt einzelne Werte abfragen oder was auch immer.
Auch dafür hätte ich Beispiele, is aber etwas schwieriger zu erklären. Daher oben mal die einfachste Variante zum warmwerden.
viele Erfolg
Bernhard