Dynamische Regelung des Meßintervalls

Das Thema haben wir ja schon länger auf dem Schirm, bisher haben es jedoch nur @wtf, @roh und @weef bei Versuchsaufbau "Autonome Zelle": Solar-Feinstaub-Wetter-Vergleichsding anständig gelöst, die Firmware dazu gibts bei autonome-zelle / Autonome Zelle - Solar-Feinstaub-Wetter-Vergleichsding · GitLab.

Anderswo sind Inhalte zum Thema bereits bei Remote Konfiguration der Nodes (Firmware/Backend), Update and Configuration Strategy for Future Nodes und Feature Requests Open Hive im Forum nachzulesen.

Nun haben wir es dank @peterthiemer und @Stefan nochmals über Noch ein Schwarm? aufgegriffen. Danke!

Exakt diese Antwort hatte ich vermutet, ich wollte nur sichergehen, dass es am aktuellen Kompromiss zum Sommer- vs. Winter-Meßintervall liegt, was wiederum das Thema Energiebudget aus genannten Gründen berührt. Merci!

Die automatische Steuerung des Meßintervalls erfolgt bei meiner Solarinstallation abhängig vom Ladezustand des Lipos.

Ist der Ladezustand über 75% werden die Daten alle 15min übermittelt, bei einem Wert darunter ist das Intervall auf 60 min ausgedehnt.

Da die Spannungsmessung via SIM800 Modul ab und an “Spitzen” nach unten hat, die auch unter den Schwellwert gehen, wird das 60min Meßintervall erst nach zweimaligem Unterschreiten des Schwellwertes aktiviert.

Beispiel für “Spitze”

Den Messwert lege ich im EEPROM des ESP8266 ab.
Somit steht der Wert auch nach dem DeepSleep wieder zur Verfügung und kann mit dem aktuellen Messwert verglichen werden.

Um auch von “außen” zu sehen, wie lange das aktuelle Meßintervall ist, wird der Wert PowerSaveMode übermittelt - beim PowerSaveMode=1 ist das Intervall 60min, bei PowerSaveMode=0 ist das Meßintervall auf 15min gesetzt.

Code teile ich bei Interesse gerne.

2 Likes

Hi Stefan,

Exzellent.

Da freuen sich bestimmt einige. Wenn Du auf GitHub zu Hause bist, vielleicht einfach dort unter der GPL? Ansonsten geben wir Dir herzlich gern Herberge unter GitHub - hiveeyes/arduino: Arduino-compatible MCU code for sensor and telemetry nodes., da sind schon einige Firmwarevarianten aus der Community eingeflossen und wir würden uns freuen, auch Deine Variante dort begrüßen zu dürfen.

Eine komfortable kommandozeilenbasierte Build-Umgebung, die alle Abhängigkeiten anzieht, gibts obendrauf. Ich würde die Gelegenheit nutzen, um kleinere Probleme dabei auszubügeln (Failure to clone recursively (libraries/Watterott-Arduino-Libs) · Issue #23 · hiveeyes/arduino · GitHub).

Viele Grüße,
Andreas.

Da sag ich nicht nein. Will mich bald selbst mit dem Thema Tiefschlaf und einer möglichen variablen Zeit nach Akkustand beschäftigen. Da wäre ein Codebeispiel natürlich mehr als Genial.

Macht es eigendlich Sinn, die Tiefschlafphase nachts generell Recht hoch zu setzen, da Nachts ja eigentlich nicht so wirklich viel spannendes passiert?

Grüße Michael

Kommt immer darauf an was einen interessiert, wenn es nur um “normale” z.B. Gewichtsveränderungen geht wird nicht so viel passieren. Wenn man die Waage aber auch als Diebstahlsanzeige nutzt, möchte man vielleicht doch höhere Raten und im Forschungskontext evtl. auch.

Aber für den praktischen Einsatz wäre eine Tag-/Nacht-Anpassung sicher eine Überlegung wert! Wichtiger finde ich allerdings die Anpassung im Winter bei Solarbetrieb!

Welches Board verwendest du?
Ich hab das vergeblich mit einem WEMOS D1 Mini Pro probiert, ich habs nicht geschafft :)

Hallo Martin,

zu Deiner Frage:

ich verwende ein WeMos D1 MINI - ESP8266 allederdings ohne PRO - ob das jetzt der Grund ist warum es bei mir geklappt hat kann ich nicht beurteilen.

Da ich mir nicht sicher bin wie schnell ich meinen Code im Github ablegen kann, hier das Test Beispiel mit dem ich die Speicherung & das Auslesen des EEPROMS getestet habe.
Die Adresse=1 zur Ablage im EEPROM ist vollkommen willkürlich gewählt.
Das Beispiel liest die EEPROM Adresse 1 aus, erhöht den ausgelesenen Wert um +1 und speichert diesen wieder ab. Der neue Wert wird als Wert für den DeepSleep in Sekunden genommen.

#include <EEPROM.h>

void setup() {

  Serial.begin(115200);

  int address = 1;
  int value;
  int newvalue;

  EEPROM.begin(512);

  value = EEPROM.read(address);
  Serial.print("Read Value:");
  Serial.println(value);

  newvalue=value+1;
  Serial.print("Write Value:");
  Serial.println(newvalue);

  EEPROM.write(address, newvalue );
  EEPROM.commit();

    Serial.print("Going to sleep");

    ESP.deepSleep(newvalue * 1000000, WAKE_RF_DEFAULT);
    delay(100);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Viel Erfolg beim Testen.
PS.: Für den DeepSleep bzw. den WakeUp aus dem DeepSleep die Verbindung zwischen D0 & RST PIN nicht vergessen.

Hallo Michael,

ich muß mich erst noch ein bisschen mit Github auseinandersetzen bevor ich hier meinen Teil beitragen kann. Insofern bitte noch ein wenig Geduld.
Das simple Beispiel bzgl. EEPROM & DeepSleep findest Du weiter unten im meinem Reply an Martin.

Der Punkt ist berechtigt, allerdings müßte man sich aus einer Quelle zum einen die aktuelle Uhrzeit sowie die zum Datum passenden Sonnenuntergangs & Aufgangszeiten besorgen - idealerweise noch abhängig vom Standort und dann daraus den Sleep Dauer ableiten.
Zudem ist, soweit ich es richtig in Erinnerung habe, die maximale Sleep Dauer beim ESP8266 auf knapp über 60 min begrenzt.

Da mir das oben genannte ein wenig zu kompliziert erschien habe ich mich für die simplere Lösung der Dauer des SleepTimers abhängig vom Akku Stand entschieden, die sich in meinen Tests auch als ganz praktikabel erwiesen hat.

Gibt es als fertige aber Recht komplexe Formel.
Ist auf wenige Minuten genau.
https://lexikon.astronomie.info/zeitgleichung/

Früher hatte ich Mal eine einfachere Formel verwendet die hatte irgendwas um die max. 20 min Differenz.
Muß Mal schauen, ob ich sie wiederfinde.

Aber wenn Du wie du sagst 60 Min Max. sind, weiß ich nicht, ob sich das wirklich lohnt zu berechnen.

Man kann auch das pseudomäßig umgehen, indem man 1, 2, 3, 4, im EEPROM hochzählt oder einem Speicher der RTC ohne zu messen und Daten zu verschicken.

Aber auch diese Beschränkung und vor allem, dass man nur ein hard reset zum wakeup machen kann sprechen für einen ESP32 statt einen ESP8266. Da ist der wakeup nicht auf 70 Minuten oder so begrenz und er kann sich auch über den deep sleep mode Variableninhalte merken.

Den versprochenen Code findet Ihr Dank der Unterstützung von @Andreas jetzt auch im Hiveeyes Github unter node-esp8266-generic.

Mehr Doku folgt hoffentlich bald.

Stefan

1 Like

Ok, Danke. Ich programmiere in Micropython, da hab ich noch keine Möglichkeit gefunden um auf das EEPROM zuzugreifen.

Größen die ich speichern möchte lagere ich in eine Txt-Datei aus, die ich in der Boot.py dann wieder einlese. Funktioniert auch ohne Probleme.

sG
Martin

Heyho in die Runde,
für unser nb-iot Arduino Board wollen wir den Messintervall und andere Paramter über Befehle vom Server an das Board regeln können.
Das funktioniert bei unserer UDP Verbindung ganz gut, da der Server direkt auf die UDP Nachricht des Clients eine Nachricht zurückschicken kann an den Client.

die Nachricht wird dann auf dem Client verarbeitet. Den gesamten Code könnt ihr hier einsehen. Die eigentliche Funktion von der ich spreche kopiere ich hier mal rein:

void checkMessage(const char msg[STDSTRINGLEN])
{
String data = msg;

if(data == "OK!") // OK!
{
  DEBUG_STREAM.println("OK! nothing todo");
}
else if(data.length() > 0) // something was transmitted..
{
  if(data.indexOf('t') >= 0) // Tare command?
  {
   DEBUG_STREAM.println("tare!");
  }
  if(data.indexOf('W') >= 0) // Weight definition command?
  {
   DEBUG_STREAM.println("Weight");
   uint8_t i = data.indexOf('W')+1;
   int j = 0;
   char weightbuffer[10];
   while(isDigit(data[i]))
   {
    weightbuffer[j] = data[i];
    i++;
    j++;
   }
   weightbuffer[j] = '\0';
   j = atoi(weightbuffer);
   DEBUG_STREAM.println(weightbuffer);
   DEBUG_STREAM.println(j);
   DEBUG_STREAM.println("g");
  }
}
else
{
  
  DEBUG_STREAM.println("not OK!");
}

}

2 Likes

Ein schneller Blick über den großen Teich.