Hi,
ich habe mir einen Füllstandssensor mit einem D1 mini (ESP8266) und einem Sonarsensor mgebaut. Das funktioniert auch ganz gut. Um Batterie zu spren, soll der Sensor nur alle 4 Stunden den Füllstand messen und die Daten per per WLAN versenden und dann für 4 Stunden schlafen gehen.
Jetzt habe ich gelernt, dass sich dafür deepSleep() nicht wirklich eignet, da die deepSleep-Zeit auf etwa 71 Minuten begrenzt ist (unsigned integer).
Ich stelle mir vor, dass der Sensor 1 mal pro Stunde aufwacht, nichts tut und wieder schlafen geht und nur beim vierten Mal die Daten erfasst und verschickt. Irgendwie brauch ich dafür eine Variable, die über den deepSleep() hinaus nicht verloren geht, quasi als Zählvariable. In setup() und loop() kann ich die ja nicht reinschreiben, soweit ich das verstanden habe, da setup() und loop() nach jedem deepSleep() neu durchlaufen werden.
Vielleicht kann mir jemand auf die Sprünge helfen, wo ich so eine Zählvariable declarieren und zählen lassen muss, damit meine Idee funktioniert.
Hier noch mein sktech ohne eine zählvariable:
#include <ESP8266WiFi.h>
#include <WiFiClientSecureBearSSL.h>
#include <ESP8266HTTPClient.h>
//variables for wifi
const char* ssid = "SSID";
const char* password = "WLAN-PASS";
//variables for HC-SR04
const int trigPin = 13; //D7
const int echoPin = 12; //D6
long duration;
long distance;
String host ="https://DOMAIN.de/sensor";
int sleepS = 4200; //max. 4294 because of the maximum value for a 32-bit unsigned integer is 4294967295 or 0xffffffff of deepSleep(). Hence, the max deep sleep interval appears to be ~71 minutes.
void setup()
{
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(115200);
connectWiFi();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Wifi connected");
}
}
void loop()
{
if (WiFi.status() != WL_CONNECTED)
{
connectWiFi();
}
int i = 0;
long liter = 0;
while (i < 3)
{
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
if (distance >= 80 || distance <= 9)
{
distance = 0;
}
else
{
distance = 79 - distance;
//Kreisfläche pi*r²: Annahme: mittlerer Radius 22,5 cm = 1590,43128088 cm²
}
liter = liter + ((distance * 1590.4)/1000);
Serial.println(liter);
Serial.println(" Nr. ");
Serial.println(i);
i++;
delay(5000);
}
liter = liter/3;
Serial.println("Mittelwert liter: ");
Serial.println(liter);
String url = "/writemysql.php?liter=";
url += liter;
Serial.println(url);
Serial.println("\nStarting connection to Server ...");
delay(1000);
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient https;
host += url;
Serial.println(host);
if(https.begin(*client, host))
{
int httpCode = https.GET();
if (httpCode > 0)
{
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
}
else
{
Serial.printf("[HTTPS] GET... failed, error: %s\n\r", https.errorToString(httpCode).c_str());
}
}
https.end();
delay(1000);
initiateDeepSleep();
}
void initiateDeepSleep()
{
ESP.deepSleep(sleepS * 1000000); //max. 4294967295 --> max.: sleepS = 4294
delay(100);
}
void connectWiFi()
{
delay(10);
Serial.println("Connecting to WIFI");
// Connect to WiFi
WiFi.begin(ssid, password);
int i = 0;
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(++i); Serial.print(' ');
if (i > 30)
{
Serial.println("No WiFi connection established - going to deepsleep");
initiateDeepSleep();
break;
}
}
Serial.println();
Serial.println(WiFi.localIP());
}
void printWiFiStatus()
{
const String wiFiStatus[] = {"WL_IDLE_STATUS","WL_NO_SSID_AVAIL","WL_SCAN_COMPLETED","WL_CONNECTED","WL_CONNECT_FAILED","WL_CONNECTION_LOST","WL_DISCONNECTED"};
static int wlanStatusAlt = -99;
int wlanStatus = WiFi.status();
if (wlanStatus != wlanStatusAlt)
{
Serial.print("WlanStatus: ");
Serial.print(wlanStatus);
Serial.print(" ");
Serial.println(wiFiStatus[wlanStatus]);
wlanStatusAlt = wlanStatus;
}
}