Sensordaten auf Webserver sammeln

Ich zeige mit einem Arduino UNO und einem Ethernet Shield Sensordaten auf einem Webserver an. Mit folgendem 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
 modified 02 Sept 2015
 by Arturo Guadalupi
 
 */
float zahl1 = 1023, zahl2 = 100, zahl3 = 1.6;

#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, 20, 60);

// 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 native USB port only
  }
  Serial.println("Ethernet WebServer Example");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // start the server
  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 (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("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin

           int analogWert1 = analogRead(A1);
           float TemperaturVorlauf = analogWert1 / zahl1 * zahl2;
           int analogWert2 = analogRead(A2);
           float TemperaturRucklauf = analogWert2 / zahl1 * zahl2;
           int analogWert3 = analogRead(A3);
           float Druckdifferenz = analogWert3 / zahl1 * zahl3;
           
           client.println("Vorlauf");
       client.println("<br>");
           client.print("Analoger Wert = ");
           client.println(analogWert1);
       client.println("<br>");
           client.print("Temperatur = ");
           client.print(TemperaturVorlauf);
           client.println(" Grad Celsius");
       client.println("<br>");
           client.println("--------------------------");
       client.println("<br>");
           client.println("Ruecklauf");
       client.println("<br>");
           client.print("Analoger Wert = ");
           client.println(analogWert2);
       client.println("<br>");
           client.print("Temperatur = ");
           client.print(TemperaturRucklauf);
           client.println(" Grad Celsius");
       client.println("<br>");
           client.println("--------------------------");
       client.println("<br>");
           client.println("Druckdifferenz");
       client.println("<br>");
           client.print("Analoger Wert = ");
           client.println(analogWert3);
       client.println("<br>");
           client.print("Druck = ");
           client.print(Druckdifferenz);
           client.println(" Bar");
           
           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 disconnected");
  }
}

Welches ist die einfachste Möglichkeit, diese Daten zu sammeln?
Ich brauche nicht sehr viele Daten, ich möchte sie nur einmal pro Woche erfassen.

Das hÀngt davon ab, was "nicht sehr viele Daten" ist und wass Du damit machen willst.
Das kann von EEPROM ĂŒber FRAM ĂŒber Datei auf SD bis zu externer Datenbank gehen.

Gruß Tommy

Ich habe zwei Temperatursensoren und ein Druckdifferenzsensor. Diese Daten möchte ich einmal pro Woche erfassen. Die Werte mit dem jeweiligen Datum. Ich brauche nicht unbedingt eine ausfĂŒhrliche Tabelle. Es wĂŒrde mir auch reichen, wenn die Werte als einfache textdatei gespeichert werden. Daten, welche Ă€lter als ein Jahr sind, können wieder gelöscht werden.

Gerade da ist das Löschen alter SÀtze am Anfang nicht ganz trivial.
Wobei ich eigentlich keinen Sinn sehe, die Werte nur 1 Mal pro Woche zu messen. Evtl. wÀre ein Mittelwert der Woche sinnvoller.
Was sind das denn fĂŒr Werte? Wo bekommst Du die Zeit her?

Gruß Tommy

Die SĂ€tze mĂŒssen nicht zwingend gelöscht werden.
Es handelt sich um Werte einer WĂ€rmepumpe. Diese mĂŒssen einmal wöchentlich erfasst werden.
Wenn es mehr Daten sind, stört mich das natĂŒrlich nicht.
Eine Excel-Datei mit allen Daten wĂ€re am schönsten, aber fĂŒr mich als totaler AnfĂ€nger wohl zu komplex.

Excel kann CSV lesen, also wohl doch SD. Noch eine LED dazu, die leuchtet, wenn gerade geschrieben wird. Damit Du dann nicht die SD ziehst.
Wobei SD und UNO schon eng mit dem Speicher werden kann.
Die Frage nach der Teit hast Du ignoriert.

Gruß Tommy

ich finde am einfachsten ist langfristig du speicherst deine Daten auf einem (externen) webserver, lĂ€sst also den Arduino mit einem Webclient auch periodisch die Daten ĂŒbermitteln.

Wenn du die Daten wirklich Lokal am Arduino speichern willst musst du die SD Karte manchmal entnehmen oder einen Download ĂŒber deine Webgui ermöglichen.

mit Ethernet, SD und TimeLib + NTÜ fĂŒr die Zeit wirds zwar knapp aber wenn man fĂŒr den Webserver die Streamlib verwendet dann geht sich das noch alles aus.

ein schneller Versuch zeigt mir:

Sketch uses 26146 bytes (81%) of program storage space. Maximum is 32256 bytes.
Global variables use 1310 bytes (63%) of dynamic memory, leaving 738 bytes for local variables. Maximum is 2048 bytes.

hier habe ich mal was zur Streamlib geschrieben.

p.s. zu

client.println("HTTP/1.1 200 OK");

du schickst keine content-length - daher ist das nur HTTP/1.0

Hallo,
wenn Du z.B eine Fritzbox hast kannst Du die Daten mittels FTP auf der FritzBox oder angeschlossenen Speicher speichern. Dateiformat CSV , im apend Modus wird einen neue Zeile an die Datei angehÀngt. Mit einer Excell kannst Du sie dann lesen und auswerten.

Heinz

@ daweschido
das hat mir jetzt keine Ruhe gelassen und ich hab mal einen Prototypen zusammengebaut.

  • ein Logger auf die SD-Card,
  • eine NTP Abfrage fĂŒr einen Zeitstempel,
  • ein Webinterface.

Ja und wenn man schon ein Webinterface hat, dann die Download-Möglichkeit ĂŒber den Browser und löschen (Idealerweise erst nachdem man das file runtergeladen hat).

Geht sich so grad alles irgendwie aus.

Schon ein wenig umfangreich. Daher hier genauer beschrieben:
Arduino Webserver mit SD Card und NTP

1 Like

@daweschido
Nachsatz fĂŒr's Protokoll:
Der Sketch lief jetzt 3 Tage (hab zwischendurch noch ein paar Kleinigkeiten geÀndert).
Hat knapp 20TSD EintrÀge geschrieben.
Der Download von dem gut 800KB großen LogFile dauert zwar gefĂŒhlt 15 Sekunden, aber klappt.