Webserver einen Korrekturwert übermitteln

Hallo,
ich möchte gerne ein auf dem Arduino laufenden Webserver einen Korrekturwert mitgeben (Zählerstand meines Gaszählers wird dort erfasst) da er ab und zu einen kleinen Versatz hat.
Die Idee ist, ich gebe über die URL zum Webserver einen Parameter mit, den ich irgendwie im Coding abfrage und dann den aktuellen Zählerstand durch den neuen ersetze, sozusagen ein Korrekturwert.

Ich habe jetzt schon eine Zeit gesucht, finde aber kein Beispiel, geht das überhaupt? Hat jemand ein Muster für mich?

Danke für die Hilfe.

Gruß Jürgen

Hi,

also ich hab es mit der get-Methode auf der HTML-Seite gemacht.
Hier siehst du einen Auszug aus meiner Webseite.
Da wird in einem Tabellenfeld ein Wert (Abschalttemperatur) über den Browser eingetragen und dann wieder über HTML ausgegeben.

  // Abschalttemperatur (bei Überschreitung roter Hintergrund
          client.print("<tr><td>AbschaltTemperatur</td>");
       if (OverTemp) {
          client.print("<td><form method=get style='display:inline'><input style='background-color:#FF0000;text-align:right;font-size: 12pt;'size=1 maxlength=2 name=AbschaltTemp value='" + String(AbschaltTemp) + "'></form> &degC</td></tr>");
       }
       else if (!OverTemp) {
          client.print("<td><form method=get style='display:inline'><input style='background-color:#9EC1C4;text-align:right;font-size: 12pt;'size=1 maxlength=2 name=AbschaltTemp value='" + String(AbschaltTemp) + "'></form> &degC</td></tr>");
       }

Im Arduino frage ich das Ethernet-Telegramm nach dem Wert ab:

   // AbschaltTemperatur
          if(readString.indexOf("AbschaltTemp") > -1){
             int DP = (readString.indexOf("="));   //Zeichen '=' suchen
             AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln
          }

Hilft dir das weiter??

mhm

bin mir nicht sicher ob es das ist was ich benötige, ich wollte es in einer URL mitgeben...

Das tust du doch dann ( bzw. dein Browser )
Zum Test kannst die url auch von hand eintippen, mit Paramtern nach einem ? , bei Bedarf mehrere durch & getrennt.
so wie es auch der Browser macht:

http: / / www . google . de / search ? hl=de & q=http+get

( funktioniert, wenn du die Leerzeichen raus nimmst : http get - Google Suche )

OK danke, nur möchte ich den Wert intern verarbeiten und auf keiner Seite anzeigen, sorry für die Frage, aber ich verstehe noch zu wenig die Systematik. Der URL Parameter soll nur eingelesen werden und im Arduino Code verarbeitet, keine Ausgabe... Das Codebeispiel erzeugt doch eine Webseite oder? das möchte ich nicht, mir fehlt aber der Weg diesen Parameter auszulesen, HTTP GET wie rufe ich das so auf?

Mach es halt so, wie es michael_x geschrieben hat.

Nimm den zweiten Code aus meinem Beitrag in den Arduino.
Dann gibst du in die Browserzeile z.B. "http://192.168.0.11/?AbschaltTemp=66" ein.
IP musst du halt anpassen.
Im Arduino wird dann mit meinem Code der Variablen Abschalttemp der Wert 66 zugewiesen. Die HTML-Ausgabe lässt du halt dann sein.

Eine Frage sei mir aber noch gestattet:
Was macht denn dein Webserver eigentlich, wenn er keine Webseite ausgibt?????

Hi, danke werde ich versuchen.

Der Webserver gibt den aktuellen Zählerstand des Gaszählers aus , der Parameter Wert soll ein Korrekturwert sein, der den Zählerstand korrigieren soll.

Viele Grüße
und nochmals Danke für Eure Geduld, kann sein dass ich noch eine Folgefrage habe, aber erst versuche ich es :smiley:

Es tut mir leid, nach vielen Suchen bin ich nun wieder am Anfang. Ich scheitere bereits am Aufruf readstring, google sagt es ist die Lib Wstring.h, gefunden, eingebunden, läuft dennoch nicht.

Fehler: Readstring was not declarde in this scope....

Bitte nochmals um Hilfe, vielen Dank im Voraus.

Jürgen

Hi,

readstring ist keine Funktion, sondern eine Variable.
Ich poste dir hier mal das "Lesen" vom Telegramm

String readString = String(100); 


 // listen for incoming clients
 EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (readString.length() < 100) {
           readString = readString + c; 
           }
             
        Serial.print(c);
        if (c == '\n' && currentLineIsBlank) {
           Serial.println (readString);


//und dann hier die Abfrage nach dem enthaltenen Text:
   // AbschaltTemperatur
          if(readString.indexOf("AbschaltTemp") > -1){
             int DP = (readString.indexOf("="));   //Zeichen '=' suchen
             AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln
          }

wstring.h hab ich nicht eingebunden

readstring, Readstring und readString sind drei unterschiedliche Variablen oder Funktionen,
da ist der Compiler gnadenlos und stellt sich dumm.

hallo hk007,

danke für deine Hilfe trotz meiner beharrlichen Fragen, ich, ich hab nun seit deinem letzten Posting versucht den Code in das Beispiel von Arduino Ethernet, Webserver einzubauen, leider gelingt mir das nicht, ich habe die URL aus deinem Beispiel benutzt, es hätte mir gereicht wenn nur die Temp von 66 irgendwie angezeigt worden wäre.

Ich bekomme es einfach nicht hin.

Einmal ist es mir gelungen, ich habe den Eindruck, dass man dann im laufendne Betrieb keinen neuen Wert posten kann, nur über einen RESET am Arduino scheint er dann den neuen Wert zu nehmen? Evtl. habe ich dein Coding an einer verkehrten Stelle eingebunden...

Wäre es dir möglich mir ein lauffähiges Codingbeispiel zur Verfügung zu stellen, mit deiner Beispiels URL.

http://192.168.1.177/?AbschaltTemp=98

Das wäre die Rettung und ich hätte morgen einen schönen Tag :slight_smile: Geburtstag

Danke
Jürgen

/*
Web Server

A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.

Circuit:

  • Ethernet shield attached to pins 10, 11, 12, 13
  • Analog inputs attached to pins A0 through A5 (optional)

created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

*/

#include <SPI.h>
#include <Ethernet.h>

String readString = String(100);
int AbschaltTemp = 0;

// 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, 177);

// 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() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}

void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;

while (client.connected()) {
if (client.available()) {
char c = client.read();

Serial.write(c);

//******************************************
if (readString.length() < 100) {
readString = readString + c;
}

Serial.print(c);
if (c == '\n' && currentLineIsBlank) {
// Serial.println ("--------------------------");
// Serial.println (readString);
// Serial.println ("--------------------------");
//******************************************
}

// 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 == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("");
client.println("");
// add a meta refresh tag, so the browser pulls again every 5 seconds:
client.println("<meta http-equiv="refresh" content="5">");

//und dann hier die Abfrage nach dem enthaltenen Text:
// AbschaltTemperatur
if(readString.indexOf("AbschaltTemp") > -1){
int DP = (readString.indexOf("=")); //Zeichen '=' suchen
AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln
}

// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("neue Temp");
client.print(AbschaltTemp);
client.println("
");

}
client.println("");
break;
}
if (c == '\n') {
// 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();
Serial.println("client disonnected");
}
}

Mein Coding:

Hurra, kann den Wert nun auslesen, am Ende hat ein clear auf den String readstring gefehtl nun geht es ... Allerdings kann der Code nur 2 Stellen auslesen, mein Wert hat aber 6 Stellen, kannst du mir zeigen wie man das auf 6 Stellen erweitern kann...

Danke.

Hi,

probier mal das:

/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */

#include <SPI.h>
#include <Ethernet.h>


String readString = String(100);
int AbschaltTemp = 0;

// 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,177);

// 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() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
// listen for incoming clients
 EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (readString.length() < 100) {
           readString = readString + c; 
           }
             
        Serial.print(c);
        // 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 == '\n' && currentLineIsBlank) {
           Serial.println (readString);
         

   // AbschaltTemperatur
          if(readString.indexOf("AbschaltTemp") > -1){
             int DP = (readString.indexOf("="));   //Zeichen '=' suchen
             AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln
          }

Serial.println ("----------------------------");
Serial.println (AbschaltTemp);
Serial.println ("----------------------------");
 
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    
    readString="";
  
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

EDIT:
zu spät :wink:

juwo1811:
Hurra, kann den Wert nun auslesen, am Ende hat ein clear auf den String readstring gefehtl nun geht es ... Allerdings kann der Code nur 2 Stellen auslesen, mein Wert hat aber 6 Stellen, kannst du mir zeigen wie man das auf 6 Stellen erweitern kann...

Danke.

also das ist doch wohl nicht so schwer...
Einfach das erweitern:

AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln

Happy birthday :grin:

hk007:

juwo1811:
Hurra, kann den Wert nun auslesen, am Ende hat ein clear auf den String readstring gefehtl nun geht es ... Allerdings kann der Code nur 2 Stellen auslesen, mein Wert hat aber 6 Stellen, kannst du mir zeigen wie man das auf 6 Stellen erweitern kann...

Danke.

also das ist doch wohl nicht so schwer...
Einfach das erweitern:

AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln

Happy birthday :grin:

Eine Schleife ist zwar was für Fortgeschrittene, aber dafür bist du reif :wink:

DP++;
AbschaltTemp = 0;
byte  c = readString.charAt(DP) - 48; // vorzeichenlos geht's leichter
while ( c < 10 )  // Alle Ziffern 0 .. 9 bearbeiten
{
     AbschaltTemp = AbschaltTemp*10 + c;
     DP++;
      c = readString.charAt(DP) - 48; 
}

mein Wert hat aber 6 Stellen, kannst du mir zeigen wie man das auf 6 Stellen erweitern kann

Wenn du nach negativen Werten gefragt hättest, die gehen mit der Methode natürlich auch nicht, aber
du willst hoffentlich keine Gleitkommazahlen Buchstabe für Buchstabe wandeln?
6-stellige Temperaturen als Abschaltkriterium, da denk evtl. noch mal drüber nach :wink:

Ein int geht von -32768 bis 32767, das ist doch schon mal was. Selbst in 0.1 °C Schritten sollte das erstmal reichen
( zumindest im negativen Bereich )

michael_x:
6-stellige Temperaturen als Abschaltkriterium, da denk evtl. noch mal drüber nach :wink:

Ein int geht von -32768 bis 32767, das ist doch schon mal was. Selbst in 0.1 °C Schritten sollte das erstmal reichen
( zumindest im negativen Bereich )

Er wollte ja keine Abschalttemperatur, sondern einen Korrekturwert zu seinem Gaszähler.
Das mit der Temp war ja nur aus meinem Projekt, damit er was zum nachschauen hat.
Also mir reichen 2stellige Temperaturen zum Abschalten der heizung im Warmwasserboiler LOL & ROFL

Er wollte ja keine Abschalttemperatur, sondern einen Korrekturwert zu seinem Gaszähler.
Das mit der Temp war ja nur aus meinem Projekt, damit er was zum nachschauen hat.

Sorry, dann sind meine Bedenken wegen float Werten zum Glück unbegründet,
und das Schleifen - Beispiel passt, wenn man das Ergebnis statt int AbschaltTemp=0; als [b] unsigned long neuerZaehler; [/b] definiert.

Herzlichen Glückwunsch zum Gerburtstag, Jürgen,
und zum Projekt-Fortschritt bisher ...

Hi, ihr habt mir alle prima geholfen und den Weg geebnet, dadurch bin ich weitergekommen und hatte gestern wirklich einen zufriedenen Geburtstag. Danke nochmals an alle!! :grin: