IDE Reihenfolgefrage ESP8266 DeepSleep

#6455902
Lesenswert?

Hallo Zusammen,

ich habe ein Problem mit meinem ESP8266 Mini.
Ich wollte ihn "einfach" mit einem Kapazitiven Sensor ausstatten zur 
Pflanzenbewässerung.

Das Grundprogramm läuft. Jetzt war meine Idee, den ESP für X Stunden in 
einen Deep Sleep zu versetzen, so dass er Energie Spart.

Idee war, abfrage Feuchte Boden
... zu gering, Pumpe an
... Ok, Pumpe aus
... Deep Sleep.

Nur leider funktioniert es nicht. Der Wert wird gelesen, die Pumpe 
angeschaltet bei zu trocken... und dann geht er in den deep Sleep bei 
angeschalteter Pumpe. Eigentlich sollte er ja noch abwarten, bis er den 
Wert zum ausschalten erreicht hat. Wo ist mein Fehler? Kann mir jemand 
hier mal auf die Sprünge helfen. (Und vorab, ich bin totaler anfänger, 
seid also etwas rücksichtsvoll :) )

Hier mein Programm:
#include <Arduino.h>
#include <ESP8266WiFi.h>

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  digitalWrite(0,1);
  WiFi.mode(WIFI_OFF);
  //Output Pin wird als output definiert
  pinMode (2, OUTPUT);
  //Relais wird ausgeschaltet
  digitalWrite(2,LOW);
}

void loop() {
    int sensorValue = analogRead(A0);
    Serial.println(sensorValue);
    delay(400);
    //Pumpe an bei Wert über
    if (sensorValue > 850) {
          //Relais einschalten
          digitalWrite(2,HIGH);
          Serial.println("Pumpe An");
 }
    //Pumpe aus bei Wert unter XX
    else if (sensorValue < 820) {
          //Relais ausschalten
          digitalWrite(2,LOW);
          Serial.println("Pumpe Aus");
 }
ESP.deepSleep(30e6);
}
Persönliche Seite #6455910
Lesenswert?

so müsste es gehen:

void loop() {
    int sensorValue = analogRead(A0);
    Serial.println(sensorValue);
    delay(400);
    //Pumpe an bei Wert über
    if (sensorValue > 850) {
          //Relais einschalten
          digitalWrite(2,HIGH);
          Serial.println("Pumpe An");
 }
    //Pumpe aus bei Wert unter XX
    else if (sensorValue < 820) {
          //Relais ausschalten
          digitalWrite(2,LOW);
          Serial.println("Pumpe Aus");
          ESP.deepSleep(30e6);  // <-- deep sleep wenn genug wasser da 
ist
 }
  // <-- ansonsten kein deep sleep
}
#6459369
Lesenswert?

Hallo Mister,

fangen wir mal bei 2 an ...

also muß ich im Programm LOW und High tauschen, und den Ausgang dann 
negieren? Verstehe ich das so richtig?

zu 1.
wenn ich es so also richtig lese,... keine Chance, es sei denn ich würde 
so ein Uhrenmodul mit dranhängen, wobei da die Frage des Energiesparens 
wieder währe....
#6459398
Lesenswert?

Ae 0. schrieb:
> Hallo Mister,
>
> fangen wir mal bei 2 an ...
>
> also muß ich im Programm LOW und High tauschen, und den Ausgang dann
> negieren? Verstehe ich das so richtig?

Ja. Ist aber vermutlich unnötig, weil Du wohl einfach ein unglückliches 
Händchen bei der Wahl des GPIO-Pins hattest.
Wie Du z.B. hier sehen kannst:
https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/
(im Abschnitt "Best Pins to Use – ESP8266") ist GPIO2 nämlich beim 
Booten high, weil der ESP sonst nicht bootet.

Es wird also vermutlich genügen, einfach das Relais an einen anderen 
GPIO-Pin als Nummer 2 anzuschliessen. Und das wäre dann auch eine gute 
Gelegenheit, den verwendeten GPIO-Pin nicht als hart kodierte Zahl vier 
mal im Sourcecode zu verwenden, sondern stattdessen einmal am Anfang 
z.B. eine
1
#define RELAIS_PIN 4
Zeile hinzuzufügen und dann im Quelltext statt "2" halt "RELAIS_PIN" zu 
schreiben. Das macht den Quelltext einerseits besser lesbar (weil 
RELAIS_PIN eine sprechende Bezeichnung ist), und wenn man den Pin ändern 
muss, muss man nur an einer einzigen Stelle etwas ändern.
#6459698
Lesenswert?

Ja, mit etwas Glück ist es damit gegessen.

Ich würde trotzdem auf low-side setzen und einen wie IO15 nehmen. Oder 
einen freien mit pulldown (Widerstand gegen GND) versehen.

Dann könnte man auch Experimente mit einem Kondensator durchführen. 
Damit erreicht man schnelles entladen bzw. verzögertes weiches 
einschalten.
Die Freilaufdiode (parallel zum Relais) bloß nicht vergessen.

Softwareseitig nicht zu ignorieren, hier ist deep sleep im Einsatz. Das 
Kriterium Zustände spielt auch mit.
Ergo, wurde der letzte Pin-Status gespeichert und nach wakeup 
wiederhergestellt. Oder hat der Watchdog ausgelöst. War bzw. ist es ein 
simpler Neustart nach Stromunterbrechung...

Mit einem pulldown geht man sehr vielen Problemsituationen aus dem Weg.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren