/* Sketch switches a consumer on for 30 seconds at a specific time.
The circuit is designed for battery operation.
ESP32-C3 is mainly in sleep mode */
#include <WiFi.h>
#define NTP_SERVER "de.pool.ntp.org"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time
struct tm local;
#define PowerPin 8
String Ausfuerungszeit = "13:45";
const char* ssid = "Wokwi-GUEST";
const char* password = "";
void ErsteStart()
{
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Verbinde mit WLAN");
if (WiFi.waitForConnectResult() != WL_CONNECTED)
{
Serial.printf("WiFi Failed!\n");
Serial.flush();
WiFi.mode(WIFI_OFF);
esp_sleep_enable_timer_wakeup(100 * 1000000UL);
esp_deep_sleep_start(); // Starte Deep Sleep
delay(3000);
}
Serial.println("");
Serial.print("IP Addresse: ");
Serial.println(WiFi.localIP());
Serial.println("Hole NTP Zeit");
configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
getLocalTime(&local, 10000); // Versuche 10 s zu Synchronisieren
Serial.println(&local, "Datum: %d.%m.%y Zeit: %H:%M:%S");
WiFi.mode(WIFI_OFF);
}
String split(String s, char parser, int index) {
String rs="";
int parserIndex = index;
int parserCnt=0;
int rFromIndex=0, rToIndex=-1;
while (index >= parserCnt) {
rFromIndex = rToIndex+1;
rToIndex = s.indexOf(parser,rFromIndex);
if (index == parserCnt) {
if (rToIndex == 0 || rToIndex == -1) return "";
return s.substring(rFromIndex,rToIndex);
} else parserCnt++;
}
return rs;
}
unsigned int TimeToSek(String Zeit)
{
int TeilerPos1= Zeit.indexOf(':',0);
String tmp= Zeit.substring(0,TeilerPos1);
unsigned int Stunden = tmp.toInt();
tmp = Zeit.substring(TeilerPos1+1, Zeit.length());
unsigned int Minuten = tmp.toInt();
return Stunden*60*60 + Minuten*60;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Start!");
setenv("TZ", TZ_INFO, 1); // Zeitzone muss nach dem reset neu eingestellt werden
tzset();
if (!getLocalTime(&local, 10))
{
Serial.println("RTC-Zeit nicht eingestellt");
ErsteStart();
}
Serial.println(&local, "Datum: %d.%m.%y Zeit: %H:%M:%S");
char s[6];
strftime(s, sizeof(s), "%H:%M", &local);
unsigned int SekundenJetzt = TimeToSek((String)s);
unsigned int SekundenAusfuerungszeit = TimeToSek(Ausfuerungszeit);
uint64_t SchaltenInSek=0;
if (SekundenAusfuerungszeit > SekundenJetzt)
{
SchaltenInSek= SekundenAusfuerungszeit- SekundenJetzt;
}
else
{
SchaltenInSek = 86400- (SekundenJetzt - SekundenAusfuerungszeit);
}
pinMode(PowerPin, OUTPUT);
digitalWrite(PowerPin, LOW);
delay(30 * 1000);
digitalWrite(PowerPin, HIGH);
esp_sleep_enable_timer_wakeup(SchaltenInSek * 1000000UL);
Serial.println("Deep Sleep - Gehe schlafen \r\n \r\n");
delay(2000);
Serial.flush();
esp_deep_sleep_start();
Serial.println("This will never be printed");
delay(500);
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
}