Analogwert nur alle X Sekunden lesen.

Hallo, ich habe mir eine Web Server Sketch kopiert und abgeändert.
Ich möchte damit meine Bodenfeuchtigkeitssensor Werte anzeigen lassen.

Ich habe gelesen dass man an die Bodenfeuchtigkeitssensor nicht die ganze zeit strom anlegen soll.

Jetzt ist die Frage wie kann ich das umsetzen dass z.b jede 60 min die Feuchtigkeit gemessen wird ?

Mein 1. Versuch ist schon mal nicht schlecht denke ich , aber dort ist noch keine wirkliche Verzögerung drinnen denn das Problem ist das der delay ist in dem HTML-Code drinnen.

 client.print("Yucca: <b>");
 digitalWrite(power1, HIGH);
 delay (500);
 client.print(analogRead(A0));
 digitalWrite(power1, LOW);

Meine Pin Belegungen:

Digital Pin 2 =Bodenfeuchtigkeitssensor1 plus
Digital Pin 3 =Bodenfeuchtigkeitssensor2 plus
Digital Pin 4 =Bodenfeuchtigkeitssensor3 plus
Digital Pin 5 =Bodenfeuchtigkeitssensor4 plus

Analog Pin 0 = Bodenfeuchtigkeitssensor1 Daten
Analog Pin 1 = Bodenfeuchtigkeitssensor2 Daten
Analog Pin 2 = Bodenfeuchtigkeitssensor3 Daten
Analog Pin 3 = Bodenfeuchtigkeitssensor4 Daten

Hier noch mein ganzer Code.

/*
 Web Server
 
 Eine einfacher Webserver, der den Messwert auf Analogpin 0 als HTML zurückgibt.
 
Based on script by David A. Mellis and Tom Igoe
 */
 
// Beide Libraries sind erforderlich
#include <SPI.h>
#include <Ethernet.h>


int power1 = 2;
int power2 = 3;
int power3 = 4;
int power4 = 5;

 
// Hier die MAC Adresse des Shields eingeben
// (Aufkleber auf Rückseite)
byte mac[] = { 
 0x90, 0xA2, 0xDA, 0x00, 0xFB, 0x80 };
 
// Eine IP im lokalen Netzwerk angeben. Dazu am besten die IP
// des PCs herausfinden (googlen!) und die letzte Zahl abändern 
IPAddress ip(192,168,178,51);

 
// Ethernet Library als Server initialisieren
// Verwendet die obige IP, Port ist per default 80
EthernetServer server(80);





 
void setup() {

 pinMode(power1, OUTPUT);
 pinMode(power2, OUTPUT);
 pinMode(power3, OUTPUT);
 pinMode(power4, OUTPUT);
  
 // Serielle Kommunikation starten, damit wir auf dem Seriellen Monitor
 // die Debug-Ausgaben mitlesen können.
 Serial.begin(9600);

 // Ethernet Verbindung und Server starten
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.print("Server gestartet. IP: ");
 // IP des Arduino-Servers ausgeben
 Serial.println(Ethernet.localIP());



}
 
 
void loop() {

 // server.available() schaut, ob ein Client verfügbar ist und Daten
 // an den Server schicken möchte. Gibt dann eine Client-Objekt zurück,
 // sonst false
 EthernetClient client = server.available();
 // Wenn es einen Client gibt, dann...
 if (client) {
 Serial.println("Neuer Client");
 // Jetzt solange Zeichen lesen, bis eine leere Zeile empfangen wurde
 // HTTP Requests enden immer mit einer leeren Zeile 
 boolean currentLineIsBlank = true;
 // Solange Client verbunden 
 while (client.connected()) {
 // client.available() gibt die Anzahl der Zeichen zurück, die zum Lesen
 // verfügbar sind
 if (client.available()) {
 // Ein Zeichen lesen und am seriellen Monitor ausgeben
 char c = client.read();
 Serial.write(c);
 // In currentLineIsBlank merken wir uns, ob diese Zeile bisher leer war.
 // Wenn die Zeile leer ist und ein Zeilenwechsel (das \n) kommt,
 // dann ist die Anfrage zu Ende und wir können antworten
 if (c == '\n' && currentLineIsBlank) {

 // HTTP Header 200 an den Browser schicken
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Connection: close"); // Verbindung wird nach Antwort beendet
 client.println("Refresh: 2"); // Seite alle 25 Sekunden neu abfragen
 client.println();
 // Ab hier berginnt der HTML-Code, der an den Browser geschickt wird
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");


 
 client.print("Yucca: <b>");
 digitalWrite(power1, HIGH);
 delay (500);
 client.print(analogRead(A0));
 digitalWrite(power1, LOW);

 client.print("
</b>Yucca-2: <b>");
 digitalWrite(power2, HIGH);
 delay (500);
 client.print(analogRead(A1));
 digitalWrite(power2, LOW);
 
 client.print("
</b>Bonsai: <b>");
 digitalWrite(power3, HIGH);
 delay (500);
 client.print(analogRead(A2));
 digitalWrite(power3, LOW);
 
 client.print("
</b>Elefantenfuss: <b>");
 digitalWrite(power4, HIGH);
 delay (500);
 client.print(analogRead(A3));
 digitalWrite(power4, LOW);
 
 client.println("</b>
"); 
 client.println("</html>");
 
 break;
 }
 if (c == '\n') {
 // Zeilenwechsel, also currentLineIsBlack erstmal auf True setzen
 currentLineIsBlank = true;
 } 
 else if (c != '\r') {
 // Zeile enthält Zeichen, also currentLineIsBlack auf False setzen
 currentLineIsBlank = false;
 }
 }
 }
 // Kleine Pause
 delay(1);
 // Verbindung schliessen
 client.stop();
 Serial.println("Verbindung mit Client beendet.");
 Serial.println("");
 }
}

Mit millis() kannst Du eine Messung alle x Millisekunden machen ohne daß der Rest blockiert wird.

Grüße Uwe

Das kann ich ja trotzdem nicht einfach im html Code Abschnitt machen ?

Ich muesste ja noch den Wert abspeichern.

Kann ich ohne weiteres mein analogen wert in eine int Variable Speichern ?
also mit z.b

int analogsave1;
analogsave1 = analogRead(A0);

Die Antwort deines Webservers um mehr als zwei Sekunden zu verzögern, ist keine gute Idee.

Entkopple das Erheben der Messwerte von deren Übertragung.

Die 500 ms Wartetzeit ist deutlich länger als nötig, ein paar ms reichen um ein stabiles Ergebnis zu erhalten.

Grundsätzlich solltest du deine Funktionen trennen.

Das Auslesen deiner Sensoren in eine Funktion packen und die Sensordaten in entsprechende Variablen speichern.
Den Aufruf dieser Funktionen steuerst du über einen Timer den du selbst mit der Funktion "millis()" aufbaust. Damit kannst du unabhängig von anderen Funktionen das Auslesen alle x Sek. oder x Min. starten. Sieh dir dazu das Beispiel "BlinkWithoutDelay" in der IDE an.

Nachdem du die Sensoren ausgelesen hast, rufst du deinen Webserver (ebenso eigene Funktion) und übergibst die Daten an diesen WebServer.

HotSystems:
Nachdem du die Sensoren ausgelesen hast, rufst du deinen Webserver (ebenso eigene Funktion) und übergibst die Daten an diesen WebServer.

Sehe ich anders.

Da ist keine weitere Aktion notwendig, der Webserver wird ja kontaktiert wenn jemand die aktuellen Werte sehen will,
und die holt der sich verzögerungsfrei von den globalen Messwerten.

Whandall:
Sehe ich anders.

Da ist keine weitere Aktion notwendig, der Webserver wird ja kontaktiert wenn jemand die aktuellen Werte sehen will,
und die holt der sich verzögerungsfrei von den globalen Messwerten.

Ok, sogar noch einfacher.

Also wo ist das Problem ?

okay ich habe das jetzt mal umgeaendert.

Kann man das so machen ?

/*
 Web Server
 
 Eine einfacher Webserver, der den Messwert auf Analogpin 0 als HTML zurückgibt.
 
Based on script by David A. Mellis and Tom Igoe
 */
 
// Beide Libraries sind erforderlich
#include <SPI.h>
#include <Ethernet.h>


int power1 = 2;
int power2 = 3;
int power3 = 4;
int power4 = 5;

int analogsave0 = 0;
int analogsave1 = 0;
int analogsave2 = 0;
int analogsave3 = 0;

unsigned long previousMillis = 0;
unsigned long interval = 1000;


 
// Hier die MAC Adresse des Shields eingeben
// (Aufkleber auf Rückseite)
byte mac[] = { 
 0x90, 0xA2, 0xDA, 0x00, 0xFB, 0x80 };
 
// Eine IP im lokalen Netzwerk angeben. Dazu am besten die IP
// des PCs herausfinden (googlen!) und die letzte Zahl abändern 
IPAddress ip(192,168,178,51);

 
// Ethernet Library als Server initialisieren
// Verwendet die obige IP, Port ist per default 80
EthernetServer server(80);





 
void setup() {

 pinMode(power1, OUTPUT);
 pinMode(power2, OUTPUT);
 pinMode(power3, OUTPUT);
 pinMode(power4, OUTPUT);
  
 // Serielle Kommunikation starten, damit wir auf dem Seriellen Monitor
 // die Debug-Ausgaben mitlesen können.
 Serial.begin(9600);

 // Ethernet Verbindung und Server starten
 Ethernet.begin(mac, ip);
 server.begin();
 Serial.print("Server gestartet. IP: ");
 // IP des Arduino-Servers ausgeben
 Serial.println(Ethernet.localIP());



}
 
 
void loop() {

 // server.available() schaut, ob ein Client verfügbar ist und Daten
 // an den Server schicken möchte. Gibt dann eine Client-Objekt zurück,
 // sonst false
 EthernetClient client = server.available();
 // Wenn es einen Client gibt, dann...
 if (client) {
 Serial.println("Neuer Client");
 // Jetzt solange Zeichen lesen, bis eine leere Zeile empfangen wurde
 // HTTP Requests enden immer mit einer leeren Zeile 
 boolean currentLineIsBlank = true;
 // Solange Client verbunden 
 while (client.connected()) {
 // client.available() gibt die Anzahl der Zeichen zurück, die zum Lesen
 // verfügbar sind
 if (client.available()) {
 // Ein Zeichen lesen und am seriellen Monitor ausgeben
 char c = client.read();
 Serial.write(c);
 // In currentLineIsBlank merken wir uns, ob diese Zeile bisher leer war.
 // Wenn die Zeile leer ist und ein Zeilenwechsel (das \n) kommt,
 // dann ist die Anfrage zu Ende und wir können antworten
 if (c == '\n' && currentLineIsBlank) {

 // HTTP Header 200 an den Browser schicken
 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("Connection: close"); // Verbindung wird nach Antwort beendet
 client.println("Refresh: 2"); // Seite alle 25 Sekunden neu abfragen
 client.println();
 // Ab hier berginnt der HTML-Code, der an den Browser geschickt wird
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");



 if (millis() - previousMillis > interval) {
    previousMillis = millis();   // aktuelle Zeit abspeichern
 
    digitalWrite(power1, HIGH);
    delay (200);
    analogsave0 = analogRead(A0);
    digitalWrite(power1, LOW);

    digitalWrite(power2, HIGH);
    delay (200);
    analogsave1 = analogRead(A1);
    digitalWrite(power2, LOW);

    digitalWrite(power3, HIGH);
    delay (200);
    analogsave2 = analogRead(A2);
    digitalWrite(power3, LOW);

    digitalWrite(power4, HIGH);
    delay (200);
    analogsave3 = analogRead(A3);
    digitalWrite(power4, LOW);

 
  }

 
 client.print("
</b>Yucca-2: <b>");
 client.print(analogsave0);

 client.print("
</b>Yucca-2: <b>");
 client.print(analogsave1);
 
 client.print("
</b>Bonsai: <b>");
 client.print(analogsave2);
 
 client.print("
</b>Elefantenfuss: <b>");
 client.print(analogsave3);
 
 client.println("</b>
"); 
 client.println("</html>");
 
 break;
 }
 if (c == '\n') {
 // Zeilenwechsel, also currentLineIsBlack erstmal auf True setzen
 currentLineIsBlank = true;
 } 
 else if (c != '\r') {
 // Zeile enthält Zeichen, also currentLineIsBlack auf False setzen
 currentLineIsBlank = false;
 }
 }
 }
 // Kleine Pause
 delay(1);
 // Verbindung schliessen
 client.stop();
 Serial.println("Verbindung mit Client beendet.");
 Serial.println("");
 }
}

HotSystems:
Also wo ist das Problem ?

Im Vorschlagen der Lösung eines nicht-existierenden Problems?

HotSystems:
Nachdem du die Sensoren ausgelesen hast, rufst du deinen Webserver (ebenso eigene Funktion) und übergibst die Daten an diesen WebServer.

also ist das okay wie ich das gemacht habe im Quellcode (im vorherigen post)?

Noch eine frage, kann ich beim unsigned log Intervall dann zb. 3600000 eintragen fuer 1 Stunde ?

unsigned long interval = 3600000;

Whandall:
Im Vorschlagen der Lösung eines nicht-existierenden Problems?

Sag ich doch.

HotSystems:
Sag ich doch.

Eben nicht. Aber sei's drum.

Whandall:
...Aber sei's drum.

Genau...

Kato1998:
okay ich habe das jetzt mal umgeaendert.

Kann man das so machen ?

:smiley: ?

Kato1998:
okay ich habe das jetzt mal umgeaendert.

Kann man das so machen ? :smiley: ?

Nein.

Was ist daran entkoppelt?

Was sollen die Delays?

Warum für jeden Sensor einzeln?

(Alle x Minuten: (Alle einschalten, etwas später: alle auslesen und abschalten)).

// Ab hier berginnt der HTML-Code, der an den Browser geschickt wird
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");


 if (millis() - previousMillis > interval ) {
    previousMillis = millis();   // aktuelle Zeit abspeichern
 
    digitalWrite(power1, HIGH);
    digitalWrite(power2, HIGH);
    digitalWrite(power3, HIGH);
    digitalWrite(power4, HIGH);
    delay (200);
    analogsave0 = analogRead(A0);
    analogsave1 = analogRead(A1);
    analogsave2 = analogRead(A2);
    analogsave3 = analogRead(A3);
    digitalWrite(power1, LOW); 
  }

 
 client.print("</b>Yucca: <b>");
 client.print(analogsave0);

 client.print("
</b>Yucca-2: <b>");
 client.print(analogsave1);
 
 client.print("
</b>Bonsai: <b>");
 client.print(analogsave2);
 
 client.print("
</b>Elefantenfuss: <b>");
 client.print(analogsave3);
 
 client.println("</b>
"); 
 client.println("</html>");
 break;

so besser ? :slight_smile:

Etwas.

Ist immer noch ein unnötiges delay drin.