Wemos D1 Mini - DeepSleep Ungenauigkeit

Gast #6290882
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.
Gast #6290922
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/

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