Ja fix, warum hast du das Problem dann nicht?
Gesendet von meinem D6633 mit Tapatalk
Ja fix, warum hast du das Problem dann nicht?
Gesendet von meinem D6633 mit Tapatalk
Weil ich permanent die Verbindungen halte, egal ob ich einen Client oder Server nutze.
Solange kein reconnect erfolgt, gibt es keinen Broadcast
Michael
Dh wenn ich am Arduino die Verbindung zu IPS aufbaue und kein disconnect am Ende mache wäre das ja das gleiche? Oder wieder falsxhe Bahnhof? [emoji1]
Gesendet von meinem D6633 mit Tapatalk
Naja… Etwas mehr musst du schon machen.
Das Objekt TCPClient muss vor dem loop bekannt sein.
Und im loop musst du dann prüfen ob Verbindung vorhanden, wenn nein Aufbauen, wenn ja senden.
Kann ja sein, das IPS Mal offline ist und dann musst du ja irgendwie die Verbindung von Arduino zu IPS wieder aufbauen.
Michael
@Michael: Ehm ich habe gerade geguckt - die ist für den Arduino oder? Ich denke die Berechnung sollte ja auch in IPS keine große Sache sein.
Mein Problem ist folgendes:
Wenn die Spannung <0,5V ist, dann ist der Sensor defekt, wenn sie >4,5V ist befinde ich mich ausserhalb des Messbereichs.
Das kann ich dann jeweils als Text aus dem Arduino ausspucken, aber ich fände es komfortabler wenn ich nur Zahlen einlesen muss. Das ist bei der Spannung / dem 10bit Signal immer der Fall. Bei Der umgerechneten variable nicht. Ansonsten wären je nachdem was mit dem Sensor ist auch Texte dabei.
Zudem kann ich später auch die anderen Eingände nutzen ohne den Code im Arduino umzuflashen.
Es gibt aber doch sicher eine Funktion die 0,5V-4,5V zu 0-5bar umrechnet oder?
Ich kenne sie nur nicht - Ihr aber sicher - Ihr sprecht ja fließend PHP
@Manni: Wenn Du mir den Code für den JSON-Abruf gibst, dann wäre ich schon fast fertig - mit Michaels input
Matthias
PS: Ich habe diesen kurzen und einfachen Code benutzt: Arduino Server for JSON-P pin values · GitHub
In IPS reicht ein einfaches json_decode($IPS[‚VALUE‘],true) um an ein Array mit den Werten zu kommen.
Umrechnen müsste aus dem Kopf ja dann 5/4* (Wert -0,5) sein.
Michael
Super, Danke!
Mit dem 5/4 hätte ich auch selbst drauf kommen können. Ich dachte es gäbe eine Funktion mit der ich quasi sage:
0,5V=0bar, 4,5V=5bar, dazwischen interpolieren.
Ja mit dem IPS-Befehlt rufe ich das aber nicht vom Arduino ab oder? Ich meine ich muss dem Ja irgendwie die IP geben usw.
Get das mit httpGet oder so in der Richtung?
Matthias
Entweder WWW Reader mit Registervariable oder direkt im Script mit Sys_GetURLContent
Und das sollte auch gehen:
http://php.net/manual/de/function.file-get-contents.php
Michael
Warum nicht die Berechnungen im Arduino direkt machen?
Arg schonwieda im Stau, die Belgier sind einfach zu b… zum fahren
Gesendet von meinem D6633 mit Tapatalk
Damit der Sketch universell einsetzbar ist für die analog Eingänge.
Michael
Aso aha na so hab ich das noch nicht betrachtet mhm
Gesendet von meinem D6633 mit Tapatalk
Also GetUrlContents geht - der Rest übrigens nichts.
Dabei kommt dan wie gewünscht
arduinoEthernetComCallback('{"A0": 337,"A1": 348,"A2": 335,"A3": 344,"A4": 299,"A5": 312}')
raus.
Ich muss mal sehen wie ich das weiter verarbeite… Hat jemand adhoc nen Code-Schnipsel?
@Manni: So kann ich einfach irgendwas anklemmen ohne die Kiste neu zu flashen
Okay, I2C geht weniger - aber einfaches Zeug wäre drin…
So, ich befinde mich gerade auf einer Odysse. Ich versuche den String mit „explode“ auseinander zu reißen.
Das geht aber nicht - in dem String sind Anführungszeichen enthalten, die kann ich mit Explode nicht abschneiden.
Weiß jemand wie ich
arduinoEthernetComCallback('{"A0": 349,"A1": 343,"A2": 334,"A3": 344,"A4": 298,"A5": 310}')
zerpflücken kann?
Wenn explode ginge wäre es ja flott erledigt.
Ich benötige halt jeden Wert von A0-A4 einzeln…
Gruß,
Matthias
Ändere Mal den Sketch, so dass nur das JSON übrig bleibt.
// output the value of each analog input pin as a json-p object
// client.print(callback);
client.print("{");
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print("\"A");
client.print(analogChannel);
client.print("\":");
client.print(analogRead(analogChannel));
if (analogChannel != 5) {
client.print(",");
}
}
client.println("}");
Und dann nimmst du das Ergebnis von dem GetURLContent für json_decode.
// $ret = .... Daten holen
$data = json_decode($ret, true);
var_dump($data);
Dann solltest du in $data ein Array mit den Keys A0 bis A5 haben.
Michael
Das wars, danke Michael!
Ich bekomme mit:
<?
$arduino = file_get_contents('http://192.168.1.241');
$data = json_decode($arduino, true);
$A0 = $data['A0'];
$voltA0 = $A0 * (5/1024);
$druck=($voltA0 - 0.5)*5/4;
$druck=round($druck, 2);
?>
Jetzt einen Druck, gerundet auf die 2. Stelle!
Na da habt ihr mir ja die ganze Arbeit abgenommen. Dann kann ixh mir den Post mit meinen Beispielen sparen. [emoji6]
Gesendet von meinem D6633 mit Tapatalk
Hallo zusammen,
könntest ihr bitte noch mal das gesammte Arduino Skript, den Symcon Code und die anzulegenden Variablen posten.
Danke und Gruß
Christian
Hey, hat leider was gedauert, da ich erst Heute aus Shanghai zurück gekommen bin.
Ich habe das noch weiter modifiziert um einen anderen Sensor hinzuzufügen, aber für den Arduino so wie besprochen sollte es das sein (also das nicht-modifizierte):
/*
Web Server returning data as JSON-P, adapted from http://arduino.cc/en/Tutorial/WebServer
A simple web server that returns the value of the analog input pins as
a JSON-P object, using an Arduino Wiznet Ethernet shield.
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13 (standard configuration)
* Analog inputs attached to pins A0 through A5 (optional)
* Example of reading LM35 on pin A0:
LM35 pins: {1: 5V, 2: A0, 3: gnd}
created 18 Dec 2009
by David A. Mellis
modified 19 Mar 2012
by Sam Fentress
*/
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,241);
char callback[27] = "arduinoEthernetComCallback";
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup()
{
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}
void loop()
{
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '
' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();
// output the value of each analog input pin as a json-p object
//client.print(callback);
client.print("{");
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
client.print("\"A");
client.print(analogChannel);
client.print("\": ");
client.print(analogRead(analogChannel));
if (analogChannel != 5) {
client.print(",");
}
}
client.println("}");
break;
}
if (c == '
') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}
Hier aus IPS, musst halt nur eine Variable für den Druck Anlegen (bei mir die 15676).
<?
$arduino = file_get_contents('http://192.168.1.241');
$data = json_decode($arduino, true);
$A0 = $data['A0'];
$voltA0 = $A0 * (5/1024);
$druck=($voltA0 - 0.5)*5/4;
$druck1=round($druck, 2);
SetValueFloat(15676 /*[Messsystem\Arduino Druck- und Temperaturmessung Heizung\Druck Heizungssystem]*/, $druck1);
?>
Gruß,
Matthias