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