Forum: Compiler & IDEs IDE Reihenfolgefrage ESP8266 DeepSleep


von Ae 0. (moviesdown)


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);
}

von Andi M. (andi6510) Benutzerseite


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
}

von Ae 0. (moviesdown)


Lesenswert?

Hallo Andi


Stöhn,


1000 dank. So einfach kann es sein ...

von Andi M. (andi6510) Benutzerseite


Lesenswert?

ich kenn das - manchmal sitzt man stundenlang an so einem Problem und 
merkt nicht, dass der wirkliche Fehler eigentlich zwischen den Ohren 
steckt... ;-)

von Ae 0. (moviesdown)


Lesenswert?

Ö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?

von Drago S. (mratix)


Lesenswert?

Ae 0. schrieb:
> 1. Kann ich über die 71 Minuten DeepSleep Zeit gehen? Wenn ja, wie muß
> ich das bewerkstelligen?
Beitrag "Re: ESP8266 - maximale deep-sleep Zeit?"

> 2. Bei jedem Aufwachen zieht das Relais einmal ganz kurz an. Gibt es da
> einen Trick das zu vermeiden?
Mit einer Transistorschaltung invertieren (high/low-side).

von Ae 0. (moviesdown)


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....

von Joachim S. (oyo)


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.

von Drago S. (mratix)


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.

von Ae 0. (moviesdown)


Lesenswert?

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.

von G. H. (schufti)


Lesenswert?

wenn du noch auf gpio2 hängst und einen pulldown dran tust wirst du 
Schiffbruch erleiden ... 
Beitrag "Re: IDE Reihenfolgefrage ESP8266 DeepSleep"

von Ae 0. (moviesdown)


Lesenswert?

Hallo G

ich habe einen anderen GIPO genommen (13) der beim starten nicht auf 
HIGH geht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.