Daten aus Arduino Webserver auslesen (unsupported URL Scheme)

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 :slight_smile:
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 :slight_smile:

@Manni: Wenn Du mir den Code für den JSON-Abruf gibst, dann wäre ich schon fast fertig - mit Michaels input :wink:

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 :wink:
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