IDE Reihenfolgefrage ESP8266 DeepSleep

OP #6455902
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
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
}
OP #6459276
Öhm, noch mal eine Frage...., bzw. 2

1. Kann ich über die 71 Minuten DeepSleep Zeit gehen? Wenn ja, wie muß 
ich das bewerkstelligen?

2. Bei jedem Aufwachen zieht das Relais einmal ganz kurz an. Gibt es da 
einen Trick das zu vermeiden?
OP #6459369
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
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
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.
OP #6459705
Hallo,

danke, ja den Wiederstnd benötige ich. Da muss ich heute meine 
Bastelkiste mal durchkramen, was  ich  nich an Wiederständen habe.

Aktuell wird der Ausgang noch kurz immer mitgeschaltet. Mit dem Pulldown 
sollte sich das ja erledigen.

Dank euch.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.