INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 4 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Webserver mit Sensoren
16.04.2014, 19:44 (Dieser Beitrag wurde zuletzt bearbeitet: 10.05.2014 14:51 von Mi Kat.)
Beitrag #1
Arduino Webserver mit Sensoren
Hallo,

ich habe an einem Arduino Uno und einem Ethernet Shield zwei Sensoren angeschlossen (SHT11 und BMP085), welche ich über den Browser abrufen möchte.
Zusätzlich möchte ich den Digital Pin 8 schalten.

Leider werden die Sensorwerte nur dann aktualisiert, wenn der Digital Pin 8 aktiv ist.

client.println("Refresh: 5");
Hab ich auch schon probiert, aber dann wird der Digital Pin 8 aktualisiert, welchen ich fix auf ON oder OFF haben möchte.

Kann mir jemand weiterhelfen.

Hier der Code.
Code:
#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Sensirion.h>
#include <Adafruit_BMP085.h>

// to open the webserver press http://192.168.2.101/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;
// 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,2,101);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

const uint8_t dataPin  =  2;    //sht1x Data Pin
const uint8_t clockPin =  3;    //sht1x Clock Pin

float temperature;
float humidity;
float dewpoint;

Sensirion tempSensor = Sensirion(dataPin, clockPin);

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  if (!bmp.begin())
        {
          Serial.println("Could not find a BMP085 sensor!");
          while (1) {}
         }
}

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;
        tempSensor.measure(&temperature, &humidity, &dewpoint);
        while (client.connected())
          {
            if (client.available())
                {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close"); // the connection will be closed after completion of the response
                    client.println("Refresh: 5"); // refresh the page automatically every 5 sec
                    client.println();
                    client.println("<!DOCTYPE HTML>");
                    client.println("<html>");
                    client.println("<h1>Arduino Ethernet Webserver</h1>");
                    
                    client.println("<h2>Digital Pin2:</h2>");

                    //output the bmp Temperatur
                    client.print("BMP Temperatur: ");
                    client.print(bmp.readTemperature());
                    client.print(" &#176C");      // &#176 bedeutet ° in HTML Code
                    client.println("<br>");
                    //output the bmp Druck
                    client.print("BMP Druck: ");
                    client.print(bmp.readPressure());
                    client.print(" Pa");
                    client.println("<br>");
                    //output the bmp Höhe
                    client.print("BMP Hoehe: ");
                    client.print(bmp.readAltitude());
                    client.print(" m");
                    client.println("<br>");
                    //output the sht1x
                    client.print("SHT Temperatur: ");
                    client.print(temperature);
                    client.print(" &#176C ");             // &#176 bedeutet ° in HTML Code
                    client.println("<br>");
                    client.print("SHT Luftfeuchte: ");
                    client.print(humidity);
                    client.print(" % ");
                    client.println("<br>");
                    client.print("SHT Taupunkt: ");
                    client.print(dewpoint);
                    client.println(" &#176C");        // &#176 bedeutet ° in HTML Code
                    client.println("<br>");
                    client.println("</html>");
                    break;
                }

          }
        // give the web browser time to receive the data
        delay(1);
        // close the connection:
        client.stop();
        Serial.println("client disonnected");
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.04.2014, 17:32
Beitrag #2
RE: Arduino Webserver mit Sensoren
Hallo Mi Kat,

das scheint mir eher der typische (Anfänger?)-Fehler zu sein, der im Zusammenhang mit dem Ethernet-Shield immer wieder gemacht wird:
Außer bei der Verzögerung "delay(1)" (1 Milisekunde für Browser und Server ist definitv sowieso zu wenig) wird die Loop() mit Vollgas immer wieder durchlaufen.
Damit kommt das Ethernet-Shield schlicht nicht zu recht und macht zu.
Auch der BMP085 selbst hat eine minimale Zeitspanne um Daten rauszugeben.

Generell würde ich bei gewollten "Verzögerungen" nicht auf Delay() setzen, da in dieser Zeit der Arduino beinahe offline ist und nix macht. Besser millis() benutzen.

Weiterhin fehlt die "Adafruit_Sensor" Library, ebenso ist bei "Adafruit_BMP085 bmp;" die Sensor ID nicht vereinbart.
Schau dir mal dieses Beispiel an: http://blog.wenzlaff.de/?p=1354

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.04.2014, 13:58 (Dieser Beitrag wurde zuletzt bearbeitet: 02.05.2014 18:18 von Mi Kat.)
Beitrag #3
RE: Arduino Webserver mit Sensoren
Danke für die schnelle Antwort.

Leider funktioniert es immer noch nicht, dass die Sensoren die Werte aktualisieren ohne den Digitalen Ausgang zu schalten.

In dieser Zeile #include <Adafruit_BMP085.h> wird die Bibliothek des Adafruit Sensors eingefügt der funktioniert einwandfrei.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.05.2014, 10:20 (Dieser Beitrag wurde zuletzt bearbeitet: 10.05.2014 14:54 von Mi Kat.)
Beitrag #4
RE: Arduino Webserver mit Sensoren
Ich habe den Code mittlerweile so umgeändert, jedoch aktualisiert mir der webserver keine Sensorwerte.

Code:
#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Sensirion.h>
#include <Adafruit_BMP085.h>

// to open the webserver press http://192.168.2.101/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;
// 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,2,101);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

const uint8_t dataPin  =  3;    //sht1x Data Pin
const uint8_t clockPin =  2;    //sht1x Clock Pin

float temperature;
float humidity;
float dewpoint;

String HTTP_req;          // stores the HTTP request
boolean LED_status = 0;   // state of LED, off by default

Sensirion tempSensor = Sensirion(dataPin, clockPin);

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  if (!bmp.begin())
        {
          Serial.println("Could not find a BMP085 sensor!");
          while (1) {}
         }
   pinMode(8, OUTPUT);    
}

void loop()
  {
    // listen for incoming clients
    EthernetClient client = server.available();    // try to get client
    if (client)  // got client?
      {
        Serial.println("new client");
        // an http request ends with a blank line
        boolean currentLineIsBlank = true;
        tempSensor.measure(&temperature, &humidity, &dewpoint);
        while (client.connected()){
            if (client.available()) {  // client data available to read
                    char c = client.read(); // read 1 byte (character) from client
                    HTTP_req += c;  // save the HTTP request 1 char at a time
                    // last line of client request is blank and ends with \n
                    // respond to client only after last line received
                    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("Connection: close"); // the connection will be closed after completion of the response

                    client.println();   // send web page
                    client.println("<!DOCTYPE HTML>");
                    client.println("<html>");
                    client.println("<head>");
                    client.println("<title>Arduino Ethernet Webserver</title>");
                    client.println("<h1>Arduino Ethernet Webserver</h1>");
                    client.println("</head>");
                    client.println("<body>");
                    client.println("<p>DP8 ON/OFF</p>");
                    client.println("<form method=\"get\">");
                    ProcessCheckbox(client);
                    client.println("<br>");
                    client.println("</form>");
                    client.println("</body>");
                    client.println("<hr/>");
                    //output the bmp Temperatur
                    client.print("BMP Temperatur: ");
                    client.print(bmp.readTemperature());
                    client.print(" &#176C");      // &#176 bedeutet ° in HTML Code
                    client.println("<br>");
                    //output the bmp Druck
                    client.print("BMP Druck: ");
                    client.print(bmp.readPressure());
                    client.print(" Pa");
                    client.println("<br>");
                    //output the bmp Höhe
                    client.print("BMP Hoehe: ");
                    client.print(bmp.readAltitude());
                    client.print(" m");
                    client.println("<br>");
                    client.println("<hr/>");
                    //output the sht1x
                    client.print("SHT Temperatur: ");
                    client.print(temperature);
                    client.print(" &#176C ");             // &#176 bedeutet ° in HTML Code
                    client.println("<br>");
                    client.print("SHT Luftfeuchte: ");
                    client.print(humidity);
                    client.print(" % ");
                    client.println("<br>");
                    client.print("SHT Taupunkt: ");
                    client.print(dewpoint);
                    client.println(" &#176C");        // &#176 bedeutet ° in HTML Code
                    client.println("<br>");
                    client.println("</html>");
                    Serial.print(HTTP_req);
                    HTTP_req = "";    // finished with request, empty string
                    break;
                  }
              
                      // every line of text received from the client ends with \r\n
                  if (c == '\n') {
                      // last character on line of received text
                      // starting new line with next character read
                      currentLineIsBlank = true;
                          }
                  else if (c != '\r') {
                      // a text character was received from client
                      currentLineIsBlank = false;
                          }
              
                }    // end if (client.available())
             }       // end while (client.connected())
             millis(); // give the web browser time to receive the data
          client.stop(); // close the connection
          Serial.println("client disonnected");
      }// end if (client)
      }

// switch LED and send back HTML for LED checkbox
    void ProcessCheckbox(EthernetClient cl)
    {
        if (HTTP_req.indexOf("LED8=8") > -1) {  // see if checkbox was clicked
        // the checkbox was clicked, toggle the LED
        if (LED_status) {
            LED_status = 0;
        }
        else {
            LED_status = 1;
        }
    }
    
    if (LED_status) {    // switch LED on
        digitalWrite(8, HIGH);
        // checkbox is checked
        cl.println("<input type=\"checkbox\" name=\"LED8\" value=\"8\" \
        onclick=\"submit();\" checked>LED8");
    }
    else {              // switch LED off
        digitalWrite(8, LOW);
        // checkbox is unchecked
        cl.println("<input type=\"checkbox\" name=\"LED8\" value=\"8\" \
        onclick=\"submit();\">LED8");
        }
    }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.05.2014, 16:29 (Dieser Beitrag wurde zuletzt bearbeitet: 03.05.2014 16:31 von rkuehle.)
Beitrag #5
RE: Arduino Webserver mit Sensoren
Hallo Mi Kat,
Zitat: jedoch aktualisiert mir der webserver keine Sensorwerte.
Kann es sein, dass evtl. der Browser nicht aktualisiert?
Ich würde zu
Code:
client.print(bmp.readTemperature());
etc. noch ein Serial.print() einbauen und gucken was der Monitor sagt.
Oder auch für
Code:
client.print("BMP Temperatur: ");
sowas wie nen Zähler einbauen und mit ausgeben. Dann sieht man was der Server wirklich rausgibt.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.05.2014, 12:44
Beitrag #6
RE: Arduino Webserver mit Sensoren
Hallo Mi Kat,

sehe ich zwei Fragen? (du schreibst recht wenig zum aktuellen Status Huh)
- Im Monitor zeigt er nur zwei Werte an. Hast du nur dort die print()-Funktionen drin?
- Werte sind auf Webabfrage und Monitor unterschiedlich, warum?
Sind das deine Fragen/Probleme?
Könntest du ein wenig gtenauer sagen was noch nicht klappt!?
Bitte mal den aktuellen Code (in die # Tags einbinden) posten und die von dir verwandten Libs ins Attachment.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.05.2014, 17:01 (Dieser Beitrag wurde zuletzt bearbeitet: 06.05.2014 17:07 von Mi Kat.)
Beitrag #7
RE: Arduino Webserver mit Sensoren
Hi,

hier mal mein aktueller Stand.


Angehängte Datei(en) Thumbnail(s)
       

.zip  Adafruit-BMP085-Library-master.zip (Größe: 5,83 KB / Downloads: 65)
.txt  A_Server Monitor Result.txt (Größe: 1,76 KB / Downloads: 197)
.ino  A_Server.ino (Größe: 7,02 KB / Downloads: 76)
.pdf  A_Server_Steckplatine.pdf (Größe: 743,89 KB / Downloads: 99)
.zip  Sensirion_10Dec2010.zip (Größe: 10,52 KB / Downloads: 70)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.08.2014, 06:14
Beitrag #8
RE: Arduino Webserver mit Sensoren
(17.04.2014 17:32)rkuehle schrieb:  das scheint mir eher der typische (Anfänger?)-Fehler zu sein, der im Zusammenhang mit dem Ethernet-Shield immer wieder gemacht wird:
Außer bei der Verzögerung "delay(1)" (1 Milisekunde für Browser und Server ist definitv sowieso zu wenig) wird die Loop() mit Vollgas immer wieder durchlaufen.
Damit kommt das Ethernet-Shield schlicht nicht zu recht und macht zu.

Hallo zusammen,

hierzu hätte ich eine Frage. Wie mache ich es denn richtig? Ein einfaches Delay() am Ende der LOOP scheint mir etwas "brachial". Die ganzen Loop in eine IF Bedinung und mit Millis() ausbremsen? Irgendwo habe ich auch noch von einer lib gehört mit der man die Loop timen kann.

Wie macht man das wirklich elegant und richtig?

Hintergrund: Ich habe da ähnliche Probleme mit dem EthernetShield auf einem UNO. Die ganze Kommunikation scheint mir etwas "instabil". (Zugriffszeiten zwischen 30-3000 ms)

Danke für eure Hilfe.

VG, Ralf aka RMR
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  "SunFounder Smart Car Kit for Arduino"...Roboterauto mit Sensoren arduinofan 2 1.632 15.01.2016 11:14
Letzter Beitrag: arduinofan
  Arduino UNO + EthernetShield (Webserver mit E-Mail) m0nn3 0 991 21.12.2015 18:35
Letzter Beitrag: m0nn3
  Sensoren Einbau bergfrei 3 1.833 13.05.2015 10:36
Letzter Beitrag: SkobyMobil
Sad Temperatur u. feuchtigkeit Webserver+speichern der Temp. u. Feuchti. auf sd Porblem!! TbO92 0 1.882 27.10.2014 10:14
Letzter Beitrag: TbO92
  Arduino Uno, LabView und 2 Hall Sensoren Tok 4 2.786 19.03.2014 11:19
Letzter Beitrag: derdemo
  Arduino Neuling: Zugeklappten Laptop mit Arduino aufwecken + Kiste aufklappen? Ikearegal 2 2.508 02.02.2014 07:59
Letzter Beitrag: Ikearegal
  Temperaturüberwachung + LCD + Webserver + eMail rkuehle 0 4.735 21.11.2013 20:58
Letzter Beitrag: rkuehle
  WebServer mit Ethernet Shield--->Fehler im Programm Wampo 0 2.019 22.08.2013 13:13
Letzter Beitrag: Wampo

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste