Pages: [1] 2   Go Down
Author Topic: Webserver einen Korrekturwert übermitteln  (Read 1833 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 411
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
  // 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:
Code:
   // 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??
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mhm

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

Germany
Online Online
Faraday Member
**
Karma: 59
Posts: 3089
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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://www.google.de/search?hl=de&q=http+get  )
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 411
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?????
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-grin

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 411
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

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


Code:
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
« Last Edit: November 17, 2012, 01:05:14 pm by hk007 » Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Germany
Online Online
Faraday Member
**
Karma: 59
Posts: 3089
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :-) 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("<!DOCTYPE HTML>");
          client.println("<html>");
                    // 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("<br />");   
         
           
          }
          client.println("</html>");
          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:

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Sr. Member
****
Karma: 3
Posts: 411
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

probier mal das:
Code:
/*
  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 ;-)
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Sr. Member
****
Karma: 3
Posts: 411
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln

Happy birthday  smiley-mr-green
« Last Edit: November 17, 2012, 02:59:35 pm by hk007 » Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Germany
Online Online
Faraday Member
**
Karma: 59
Posts: 3089
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
AbschaltTemp = ((int(readString.charAt(DP+1))-48)*10) + (int(readString.charAt(DP+2))-48); // die 2 Zeichen nach dem '=' in Zahl wandeln

Happy birthday  smiley-mr-green
Eine Schleife ist zwar was für Fortgeschrittene, aber dafür bist du reif smiley-wink

Code:
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;
}

Quote
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 smiley-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 )
Logged

Pages: [1] 2   Go Up
Jump to: