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.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.