Deep-sleep Spannung messen

Zur Person:
bald Rentner, 1% Englischkenntnisse, 1% Computerkenntnisse,
0,1% Programmierkenntnisse, Wemos D1 mini pro neues Hobby.

Frage:
der Wemos ist im Vorratsraum an einer lebende Mausefalle angeschlossen. Er soll alle sieben Tage die Versorgungsspannung melden, melden wenn vorher die Spannung unter 2,8V geht und melden über Reset wenn die Falle zu ist. Unten stehendes Programm ist nicht fertig aber ich komme nicht weiter. Versorgt wird er über ein 4,5V Akku an GND und 5V. Hat jemand sehr viel Zeit mir zu helfen?

Danke im voraus
blackvento

//Libraries
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

//WiFi Credentials
const char* ssid = "meine-ssid";
const char* password = "mein-passwort";

//Telegram Bot Credentials
#define botToken "mein-token"
#define userID "mein-user"

WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);

uint32_t sleepCount = 0;

void setup() {
  client.setInsecure();
  Serial.begin(115200);

  //Connecting to WiFi
  Serial.print("Connecting to WiFi: ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(10000000); 
  }

   Serial.println("Connected!");

}
void loop()
{
      uint32_t count = 0;
      ESP.rtcUserMemoryRead(0, &count, sizeof(count));
      sleepCount = count;
      if(sleepCount == 0)
      {
      ESP.rtcUserMemoryWrite(0, &sleepCount, sizeof(sleepCount)); // sets the counter variable for surving deep sleep
      }
      if (sleepCount < 3)
      {
      initiateDeepSleep(600);
      }
      else
      {
      if (WiFi.status() != WL_CONNECTED)
      {
      connectWiFi();
      }
      int i = 0;
      while (i < 3)
      {
      sleepCount = 0;
      delay(100);
      {
      }
      }
        
      }
      initiateDeepSleep(6); //max 71 (4260 sec) minutes because of unsigned int
      
      }
      void initiateDeepSleep(int sleepS)
      {
        
      sleepCount++;
      ESP.rtcUserMemoryWrite(0, &sleepCount, sizeof(sleepCount));
      ESP.deepSleep(sleepS * 100); //1000000
      delay(100);
      
      }
      void connectWiFi()
      {
      int i = 0;
      while (WiFi.status() != WL_CONNECTED)
      {
      delay(1000);
      i++;
      if (i > 5)
      {
      initiateDeepSleep(3600);
      break;
    }
  }

  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.07 / 3300.00) * 2; // 4.77
  Serial.println(voltage);
  
delay(300);


  bot.sendMessage(userID, "Die Maus ist da.: " + String(voltage) + "Volt", "");

  delay(500);
  Serial.println("Going to sleep");
  ESP.deepSleep(0);
}

Wenn du den über den 5 V Pin mit 4.5V versorgst, wird das nix. Grund: Da hängt ein Spannungsregler dazwischen der "relativ" viel Strom verbraucht. 2. Der Regler braucht eine gewisse Spannungsdifferenz zum regeln.

Schau mal hier wird eine effiziente Spannungsversorgung beschrieben. ESP32 – Stromverbrauch im Deep-Sleep | geeks-r-us

Hallo wwerner,
hochohmigen Spannungswandler löten und an 3V3 betreiben?

lass dir einmal am Tag die Spannung melden. Nicht erst wenn die Spannung gering ist. Die Chance ist groß dass beim Senden die Spannung noch weiter absinkt und somit deine Nachricht nicht ankommt.

P.S.: wenn du in der IDE mal STRG-T drückst wird der Sketch schöner formatiert.

Ich bastele auch gerade an meinen ersten Versuchen mit WiFi, daher ist mir das ins Auge gefallen:

Das sieht mir nach einer gigantischen Wartezeit aus .... :anguished:
1000 wären m.E. eine Sekunde, d.h. das Programm steht für knapp drei Stunden.
Oder?

cu

Danke für den Tip, aber wie programmieren?
Gibt es hier keine Funktion VORSCHAU?

Das sieht mir nach einer gigantischen Wartezeit aus .... :anguished:
1000 wären m.E. eine Sekunde, d.h. das Programm steht für knapp drei Stunden.
Oder?

cu
[/quote]

Ja das ist sehr hoch aber ich brauche nur eine Info alle 24 Stunden über den Zustand vom Akku.

Hallo Jungspund, bei mir sieht Dein mit der IDE formatiertes Programm so aus:

formatiertes Programm <klick mich!>
//Libraries
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

//WiFi Credentials
const char* ssid = "meine-ssid";
const char* password = "mein-passwort";

//Telegram Bot Credentials
#define botToken "mein-token"
#define userID "mein-user"

WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);

uint32_t sleepCount = 0;

void setup() {
  client.setInsecure();
  Serial.begin(115200);

  //Connecting to WiFi
  Serial.print("Connecting to WiFi: ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(10000000);
  }

  Serial.println("Connected!");

}
void loop()
{
  uint32_t count = 0;
  ESP.rtcUserMemoryRead(0, &count, sizeof(count));
  sleepCount = count;
  if (sleepCount == 0)
  {
    ESP.rtcUserMemoryWrite(0, &sleepCount, sizeof(sleepCount)); // sets the counter variable for surving deep sleep
  }
  if (sleepCount < 3)
  {
    initiateDeepSleep(600);
  }
  else
  {
    if (WiFi.status() != WL_CONNECTED)
    {
      connectWiFi();
    }
    int i = 0;
    while (i < 3)
    {
      sleepCount = 0;
      delay(100);
      {
      }
    }

  }
  initiateDeepSleep(6); //max 71 (4260 sec) minutes because of unsigned int

}
void initiateDeepSleep(int sleepS)
{

  sleepCount++;
  ESP.rtcUserMemoryWrite(0, &sleepCount, sizeof(sleepCount));
  ESP.deepSleep(sleepS * 100); //1000000
  delay(100);

}
void connectWiFi()
{
  int i = 0;
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    i++;
    if (i > 5)
    {
      initiateDeepSleep(3600);
      break;
    }
  }

  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.07 / 3300.00) * 2; // 4.77
  Serial.println(voltage);

  delay(300);


  bot.sendMessage(userID, "Die Maus ist da.: " + String(voltage) + "Volt", "");

  delay(500);
  Serial.println("Going to sleep");
  ESP.deepSleep(0);
}

Es kann schon mehrere Versuche brauchen, bis sich der ESP8266 am Router anmelden kann. Da genügt eine Anmeldeverzögerung von 500 ms. Die 24 Stunden haben damit nichts zu tun, das ist die Schlafenszeit.

Für Beiträge?

Eigentlich hat man doch neben seinen Eingaben rechts das "Live"bild?
Oder was meinst Du?

cu

Hallo und herzlich willkommen,
als Anfänger hast Du Dir ja gleich ein ziemlich umfangreiches Projekt vorgenommen. Da sind ein paar Teilaufgaben drin die ich erst mal einzeln angehen würde.
Ich denke auch du solltest versuchen den ESP mit einem Steckernetztteil zu betreiben und das erst mal ohne deep sleep zum laufen bringen.

Der ESP hat die Möglichkeit recht einfach mit einer NTP Zeitserver zu arbeiten. Damit verfügst Du dann wie bei einer externen RTC über Datum und Uhrzeit. Der interne Zeitgeber millis() ist nicht besonders genau, er wird dir mit der Zeit weglaufen.
Mit Aku macht ein Deepsleep Sinn. Die maximale deepsleep Zeit für den ESP ist etwa 71 Minuten. Damit wurde man Ihn z.B jede Stunde einmal aufwecken und mit einem Zähler auf 24 zählen und dann die Meldung absetzten. Aber auch da macht die Verwendung der NTP Zeit mehr Sinn. Aufwecken ,Uhrzeit holen , Entscheiden ob gesendet werden soll, wieder schlafen gehen. Du könntest natürlich einen externe RTC nehmen und damit den ESP aufwecken.

Wenn Du keine Möglichkeit siehst an einen Steckdose zu kommen dann ginge auch noch eine alte KFZ Batterie in Verbindung mit einem Steppdown Regler ( oder auch Linear 7805) auf 5V Gut die müsste man irgendwann auch mal wieder laden.

Zur Spannungsmessung brauchst Du einen eigneten Vorwiderstand , der ESP kann maximal 1V an seinem Analogeingang messen. Beim ESP8266 D1 ist da intern ein Spannungsteiler verbaut damit kannst Du 3,3V messen. Mit einem zusätzlichen Widerstand zwischen Messspannung und Eingang kannst du den Spannungsteiler ändern. Natürlich kannst Du auch außen einen zusätzlichen Spannungsteiler verwenden, macht aber wenig Sinn finde ich , da damit nur zusätzlich Strom verbraucht wird.

google mal ESP8266 Deepsleep
oder auch in der ESP Doku

Wenn du schon die WLAN Verbindung aufbaust um die Zeit zu holen, kannst du auch senden. Das ist dann egal.

Hallo Rentner, ich habe klein angefangen mit folgendem Programm

[code]
//Libraries
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

//WiFi Credentials
const char* ssid = "meine-ssid";
const char* password = "mein-passwort";

//Telegram Bot Credentials
#define botToken "mein-token"
#define userID "meine-id"

WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);

void setup() {
  client.setInsecure();
  Serial.begin(115200);
  delay(5000);
  Serial.println("Awake");

  //Connecting to WiFi
  Serial.print("Connecting to WiFi: ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000); // ursprünglich 3000
  }

   Serial.println("Connected!");

}
void loop() {
  int sensorValue = analogRead(A0);
  float voltage = sensorValue * (5.07 / 3300.00) * 2; // 4.77
  Serial.println(voltage);
 
delay(300);


  bot.sendMessage(userID, "Die Post ist da.: " + String(voltage) + "Volt", "");

  delay(500);
  Serial.println("Going to sleep");
  ESP.deepSleep(0);
}
[/code]

Klappe geht zu, Wemos bekommt Strom und durchlauft das Programm nur einmal, sendet Nachricht Maus und Volt, geht dann permanent in den Tiefschlaf.
Jetzt habe ich drei Monate gelesen, gegoogelt, Bücher geliehen und gebastelt aber komme nicht weiter.

"Zähler auf 24 zählen" so mein Plan ohne RTC.
"Der ESP hat die Möglichkeit recht einfach mit einer NTP Zeitserver zu arbeiten."
Für einen Profi wie dich ja, für mich unmöglich. Deswegen suche ich jemanden der schritt für schritt mit mir das Programm zum Laufen bringt.

Für Beiträge?

Eigentlich hat man doch neben seinen Eingaben rechts das "Live"bild?
Oder was meinst Du?

cu
[/quote]

Danke für den Hinweis. Rechts war bisher nur ein großes weißes leeres Feld. Einmal rechts auf das Kreuz geklickt und dann kam die Vorschau.
:face_with_peeking_eye:

Wenn du schon die WLAN Verbindung aufbaust um die Zeit zu holen, kannst du auch senden. Das ist dann egal.
[/quote]

Ich möchte nicht bei jedem aufwachen eine Nachricht bekommen. Nur die nötigsten. Aber wie programmieren?

Es kann schon mehrere Versuche brauchen, bis sich der ESP8266 am Router anmelden kann. Da genügt eine Anmeldeverzögerung von 500 ms. Die 24 Stunden haben damit nichts zu tun, das ist die Schlafenszeit.
[/quote]

 while (WiFi.status() != WL_CONNECTED) {
       Serial.print(".");
       delay(500); 

So richtig ? Wenn Ja, wieder ein Schritt weiter.
Danke

Das sind am ESP8266 echt nur ein paar Zeilen...

Lies mal auf meiner Seite:

Ja!

Gerade noch vor dem Abgrund, jetzt einen Schritt weiter :rofl:

Hat Dir schon jemand Esp8266 Webserver Arduino Tab von Fips empfohlen? Da gibt es auch den Esp8266 NTP Lokalzeit Tab.

Hallo,
Um den ESP mittels timer aufzuwecken wird ja eine Brücke benötigt. Ich gehe jetzt mal davon aus das Du die angeschlossen hast. siehe hier

In deinem Sketch im Eingangspost wird ja auch eine Zählvariable verwendet. Die wird dann im RTC Speicherbereich abgespeichert und von da gelesen. Das macht man weil ansonsten die Zählvariable beim deepsleep wieder auf Null gesetzt würde.

ESP.rtcUserMemoryWrite(0, &sleepCount, sizeof(sleepCount));
ESP.rtcUserMemoryRead(0, &count, sizeof(count));

Du kannst ja jetzt erst mal einen Sketch machen der z.B alle 30s aufweckt und dann 1 addiert. bei wenn 9 erreicht ist machst Du eine Meldung auf dem seriellen Monitor, und setzt den Zähler wieder auf 0.

bei ESP.deepSleep( ) kommt in die Klammer der wert in Microsekunden. Das wären bei 30s dann ein Wert von 30000000.
MIt deiner Mausefalle willst Du ja letztlich zusätzlich aufwecken, in dem Du den RST auf 0V legst. Ob das gleichzeitig mit dem timer geht hab ich noch nie probiert. Während der sleepzeit liegt der Ausgang D1 allerdings auf H Pegel. Wenn man den jetzt mit einem Taster auf 0V legt würde er ja kurzgeschlossen, ich hätte da Bedenken den Ausgang zu killen. Es braucht also eine zusätzliche Schaltung, ohne wird das nichst werden.
Deshalb mein Vorschlag das ohne Deepsleep mit einem Steckernetztzeil oder einer dicken Batterie zu machen.

Hat Dir schon jemand Esp8266 Webserver Arduino Tab von Fips empfohlen? Da gibt es auch den Esp8266 NTP Lokalzeit Tab.
[/quote]

Ja, die Seite kenne ich. Weil mein Programm nicht läuft konnte ich nicht feststellen ob ich die Zeilen an der richtigen Stelle kopiert habe. Deswegen wie Rentner empfohlen hat einzel angehen.
Gerne würde ich das Hochzählen weg lassen und mit NTP arbeiten.

Brücke war nicht vorhanden. Ich habe sofort eine Brücke von RSR auf D0 gelötet.
Den WEMOS an einer Powerbank angeschlossen. Deep sleep lasse ich erst einmal weg. Das kommt vielleicht später hinzu.
Den Rest kann ich erst morgen Abend probieren weil die Enkelkinder gekommen sind.
Danke bis dahin. Morgen melde ich mich wieder.
blackvento