Hallo zusammen, Ich nutze einen Wemos D1 Mini um in bestimmten Zeitabständen einen Steppermotor vorwärts und rückwärts drehen zu können und der Wemos soll zwischen den Operationen immer in den DeepSleep-Modus gehen. Da die Zeitdifferenz zwischen den Drehoperationen mehrere Stunden betragen soll, der DeepSleep maximal aber nur knapp 71 Minuten erlaubt, soll der Wemos immer für eine Stunde schlafen gehen, aufwachen, überprüfen wie viel Zeit vergangen ist und nur zu der bestimmten Zeit die Operation durchführen und wieder schlafen gehen . Mein Code an sich funktioniert einwandfrei genauso wie er soll, allerdings beträgt die Zeit, die der WEMOS jeweils schlafen geht nicht wie im Code angegeben 3600sec, sondern variiert zwischen 3400 und 3650sec. Das ist ein großes Problem da das System eigentlich komplett autark laufen soll und sich die Zeit zwischen den Operationen nicht innerhalb eines Tages um 15 Minuten verstellen sollte. Ich hoffe es kann mir jemand weiterhelfen :) Hier noch mein aktueller Code: #define IN1 2 #define IN2 0 #define IN3 4 #define IN4 5 #define MOSFET 12 extern "C" { #include "user_interface.h" } uint32_t zaehler = 0; const int zeit_auf = 8; //Uhrzeit zur Öffnung const int zeit_zu = 22; //Uhrzeit zum Schließen int Steps = 0; boolean Direction; const int rotations = 7; //Anzahl der Rotationen für vollständiges Öffnen/Schließen void setup() { Serial.begin(115200); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(MOSFET, OUTPUT); uint32_t counter=0; system_rtc_mem_read(65, &counter, 4); zaehler=counter; if (counter>23) { system_rtc_mem_write(65, 0, 4); zaehler=0; } Serial.println(""); Serial.println(zaehler); if(zaehler==zeit_auf) { digitalWrite(MOSFET, HIGH); int step_rot=4096*rotations; for(int i=0; i<step_rot; i++){ Direction=true; onestep(1); delay(1); } } if (zaehler==zeit_zu) { digitalWrite(MOSFET, HIGH); int step_rot=4096*rotations; for(int i=0; i<step_rot; i++){ Direction=false; onestep(1); delay(1); } } zaehler++; system_rtc_mem_write(65, &zaehler, 4); digitalWrite(MOSFET, LOW); ESP.deepSleep(3600000000, WAKE_RF_DISABLED); delay(100); } void loop() {} Die Funktion onestep() habe ich hier nicht mit drin, da diese für das Problem nicht relevant ist.
Jonas Scheuenstuhl schrieb: > Mein Code an sich funktioniert einwandfrei genauso wie er soll, > allerdings beträgt die Zeit, die der WEMOS jeweils schlafen geht nicht > wie im Code angegeben 3600sec, sondern variiert zwischen 3400 und > 3650sec. Das, was in deinem Code als RTC angesprochen wird, ist keine Echtzeituhr, sondern ein temperaturabhängiger Zeitgebern. Da ist es kein Wunder, dass die Zeit nicht vernünftig passt. https://nodemcu.readthedocs.io/en/master/modules/rtctime/
In diesem Fall würde ich eine externe RTC via i2c anschließen und den Interrupt Pin (für Alarm) an den reset des esp8266 anschließen
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.