Forum: Mikrocontroller und Digitale Elektronik Wemos D1 Mini - DeepSleep Ungenauigkeit


von Jonas Scheuenstuhl (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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/

von Timmo H. (masterfx)


Lesenswert?

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
Noch kein Account? Hier anmelden.