4 Commits
0.03 ... 0.06

Author SHA1 Message Date
Christian Mittring
60755333bf [Changed]: OTA update over http 2018-04-06 21:47:48 +02:00
Christian Mittring
f5eaa4cc26 [Added]: Simple Web Server 2018-04-06 07:48:11 +02:00
Christian Mittring
2d4a10990a [Update]: Testing Version 0.04 2018-04-01 12:18:23 +02:00
Christian Mittring
1ecddd2789 [Fixed]: NTP Update Error 2018-04-01 09:11:43 +02:00
9 changed files with 192 additions and 74 deletions

View File

@@ -1,7 +1,7 @@
void run_alarm(long currentMillis){ void run_alarm(long currentMillis){
if (test_alarm()) if (test_alarm())
{ {
Serial.println("Start Alarm"); write_log("Start Alarm");
start_wake_light(currentMillis); start_wake_light(currentMillis);
setAlarmTimer(15); setAlarmTimer(15);
} }
@@ -12,7 +12,7 @@ void run_alarm(long currentMillis){
} }
//Test if Summer->Winter time change (this should also change the Alarm times!) //Test if Summer->Winter time change (this should also change the Alarm times!)
bool dst = summertime_EU(y,M,d,h,1); bool dst = summertime_EU(y,M,d,h,1);
//Serial.println(String(dst) + ":" + String(summer)); //write_log(String(dst) + ":" + String(summer));
if (dst != summer) if (dst != summer)
{ {
summer = dst; summer = dst;
@@ -23,7 +23,7 @@ void run_alarm(long currentMillis){
} }
void stop_alarm(){ void stop_alarm(){
Serial.println("Stop Alarm"); write_log("Stop Alarm");
stop_wake_light(); stop_wake_light();
stop_alarm_beep(); stop_alarm_beep();
setAlarmTimer(0); setAlarmTimer(0);
@@ -188,7 +188,7 @@ void set_alarm1(){
byte A1Day, A1Hour, A1Minute, A1Second, AlarmBits; byte A1Day, A1Hour, A1Minute, A1Second, AlarmBits;
bool A1Dy, A1h12, A1PM; bool A1Dy, A1h12, A1PM;
Clock.getA1Time(A1Day, A1Hour, A1Minute, A1Second, AlarmBits, A1Dy, A1h12, A1PM); Clock.getA1Time(A1Day, A1Hour, A1Minute, A1Second, AlarmBits, A1Dy, A1h12, A1PM);
Serial.println("Alarm1 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(A1Second) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", "); write_log("Alarm1 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(A1Second) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", ");
//display_text("Alarm 1", String(A1Hour) + ":" +String(A1Minute)); //display_text("Alarm 1", String(A1Hour) + ":" +String(A1Minute));
//delay_gui(1000); //delay_gui(1000);
} }
@@ -208,7 +208,7 @@ void set_alarm2(){
byte A1Day, A1Hour, A1Minute, AlarmBits; byte A1Day, A1Hour, A1Minute, AlarmBits;
bool A1Dy, A1h12, A1PM; bool A1Dy, A1h12, A1PM;
Clock.getA2Time(A1Day, A1Hour, A1Minute, AlarmBits, A1Dy, A1h12, A1PM); Clock.getA2Time(A1Day, A1Hour, A1Minute, AlarmBits, A1Dy, A1h12, A1PM);
Serial.println("Alarm2 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", "); write_log("Alarm2 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", ");
//display_text("Alarm 2", String(A1Hour) + ":" +String(A1Minute)); //display_text("Alarm 2", String(A1Hour) + ":" +String(A1Minute));
//delay_gui(1000); //delay_gui(1000);
} }

View File

@@ -9,12 +9,20 @@
#include <SPI.h> #include <SPI.h>
#include <DS3231.h> #include <DS3231.h>
#include <WiFiUdp.h> #include <WiFiUdp.h>
#include <ArduinoOTA.h> #include <ESP8266HTTPUpdateServer.h>;
#include <Wire.h> #include <Wire.h>
#include <LiquidCrystal_I2C.h> //https://github.com/agnunez/ESP8266-I2C-LCD1602 #include <LiquidCrystal_I2C.h> //https://github.com/agnunez/ESP8266-I2C-LCD1602
#include <NTPtimeESP.h> //https://github.com/SensorsIot/NTPtimeESP #include <NTPtimeESP.h> //https://github.com/SensorsIot/NTPtimeESP
#include <EEPROM.h> #include <EEPROM.h>
String Hardware = "0.10";
String Software = "0.06";
String ntp_server = "ntp2.uni-augsburg.de";
// Set web server port number to 80
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
//LED Band Setup //LED Band Setup
#define FASTLED_ESP8266_RAW_PIN_ORDER #define FASTLED_ESP8266_RAW_PIN_ORDER
#include "FastLED.h" #include "FastLED.h"
@@ -30,7 +38,7 @@ CRGB leds[NUM_LEDS];
RTClib RTC; RTClib RTC;
DS3231 Clock; DS3231 Clock;
//NTP Setup //NTP Setup
NTPtime NTPch("ch.pool.ntp.org"); // Choose server pool as required NTPtime NTPch(ntp_server); // Choose server pool as required
//Display //Display
LiquidCrystal_I2C lcd(0x3f, 16, 2); LiquidCrystal_I2C lcd(0x3f, 16, 2);
@@ -48,6 +56,8 @@ const int outBeep = 9;
//To know if connected to wifi or not: //To know if connected to wifi or not:
bool wifi_connected = false; bool wifi_connected = false;
bool ntp_update = true;
//For Summertime change notification (change alarmtime) this should be saved in the EEPROM! //For Summertime change notification (change alarmtime) this should be saved in the EEPROM!
bool summer = false; bool summer = false;
@@ -84,13 +94,11 @@ long previousMillis = 0;
void configModeCallback (WiFiManager *myWiFiManager) { void configModeCallback (WiFiManager *myWiFiManager) {
//if you used auto generated SSID, print it //if you used auto generated SSID, print it
//Serial.println(myWiFiManager->getConfigPortalSSID()); //write_log(myWiFiManager->getConfigPortalSSID());
display_text("Wifi: Licht","PW: Wecker"); display_text("Wifi: Licht","PW: Wecker");
} }
void setup() { void setup() {
// put your setup code here, to run once:
// Initializing serial port for debugging purposes
Serial.begin(115200); Serial.begin(115200);
delay(10); delay(10);
@@ -161,19 +169,19 @@ void setup() {
delay(5000); delay(5000);
} }
if (wifiManager.autoConnect("Licht", "Wecker")){ if (wifiManager.autoConnect("Licht", "Wecker")){
Serial.println("WiFi connected"); write_log("WiFi connected");
Serial.print("IP address: "); write_log("IP address: ");
Serial.println(WiFi.localIP()); write_log(WiFi.localIP().toString());
wifi_connected = true; wifi_connected = true;
display_text("IP address",String(WiFi.localIP())); display_text("IP address",WiFi.localIP().toString());
delay(5000); delay(5000);
} }
else{ else{
WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_OFF);
} }
display_text("Licht Wecker","SW: 0.03"); display_text("Licht Wecker","SW: " + Software);
delay(1000); delay(1000);
display_text("Licht Wecker","HW: 0.02"); display_text("Licht Wecker","HW: " + Hardware);
delay(1000); delay(1000);
display_text("Licht Wecker",""); display_text("Licht Wecker","");
@@ -195,7 +203,7 @@ void setup() {
al1h = A1Hour; al1h = A1Hour;
} }
al1m = A1Minute; al1m = A1Minute;
Serial.println("Alarm1 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", "); write_log("Alarm1 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", ");
Clock.getA2Time(A1Day, A1Hour, A1Minute, AlarmBits, A1Dy, A1h12, A1PM); Clock.getA2Time(A1Day, A1Hour, A1Minute, AlarmBits, A1Dy, A1h12, A1PM);
if (summer) if (summer)
@@ -206,53 +214,25 @@ void setup() {
al2h = A1Hour; al2h = A1Hour;
} }
al2m = A1Minute; al2m = A1Minute;
Serial.println("Alarm2 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", "); write_log("Alarm2 Set:" + String(A1Day) + ", " + String(A1Hour) + ", " + String(A1Minute) + ", " + String(AlarmBits) + ", " + String(A1Dy) + ", " + String(A1h12) + ", ");
show_green(); show_green();
update_time_from_web();
delay(1000); delay(1000);
show_black(); show_black();
previousMillis = millis(); previousMillis = millis();
//-------------------------------------------------
//OTA
// No authentication by default
ArduinoOTA.setPassword(NodeName.c_str());
ArduinoOTA.setHostname(NodeName.c_str());
ArduinoOTA.onStart([]() {
Serial.println("Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
//-------------------------------------------------
update_time_from_web(); update_time_from_web();
setup_webserver();
} }
void loop() { void loop() {
//OTA handle_webserver();
ArduinoOTA.handle();
//OTA
unsigned long currentMillis = millis(); unsigned long currentMillis = millis();
long intervall = currentMillis - previousMillis; unsigned long intervall = currentMillis - previousMillis;
release_gui(currentMillis); release_gui(currentMillis);
@@ -269,7 +249,7 @@ void loop() {
} }
test_pin(); test_pin();
handleSleep(intervall, currentMillis); handleSleep(intervall, currentMillis);
if(m == 1) if(m == 1 && s == 30)
{ {
update_time_from_web(); update_time_from_web();
} }

View File

@@ -111,7 +111,7 @@ void update_Time(){
} }
dow = daysOfTheWeek[Clock.getDoW()]; dow = daysOfTheWeek[Clock.getDoW()];
//Serial.println(String(h) + ":" + String(m) + ":" + String(s) + " - " + String(d) + "." + String(M) + "." + String(y) + " | DST: " + String(summertime_EU(y,M,d,h,1))); //write_log(String(h) + ":" + String(m) + ":" + String(s) + " - " + String(d) + "." + String(M) + "." + String(y) + " | DST: " + String(summertime_EU(y,M,d,h,1)));
} }
//################################################################################################################################### //###################################################################################################################################
@@ -123,10 +123,15 @@ void display_year(int Day, int Month, int Year){
void display_time(int Stunde, int Minute, int Sekunde){ void display_time(int Stunde, int Minute, int Sekunde){
String Min = String(Minute); String Min = String(Minute);
String Stu = String(Stunde); String Stu = String(Stunde);
String Sek = String(Sekunde);
if (Minute < 10) if (Minute < 10)
{ {
Min = "0" + Min; Min = "0" + Min;
} }
if (Sekunde < 10)
{
Sek = "0" + Sek;
}
if (Stunde < 10) if (Stunde < 10)
{ {
Stu = "0" + Stu; Stu = "0" + Stu;
@@ -159,11 +164,11 @@ void display_time(int Stunde, int Minute, int Sekunde){
{ {
display_text("Alarm 2", "Minute: " + Min); display_text("Alarm 2", "Minute: " + Min);
} }
else if (Sekunde % 2 == 0){ /*else if (Sekunde % 2 == 0){
display_text(Stu + ":" + Min, get_alarm_string()); display_text(Stu + ":" + Min, get_alarm_string());
} }*/
else{ else{
display_text(Stu + "." + Min, get_alarm_string()); display_text(Stu + ":" + Min + ":" + Sek, get_alarm_string());
} }
} }

View File

@@ -28,7 +28,7 @@ void toggle_alarm_beep(){
void beepOff(){ void beepOff(){
int currentState = digitalRead(outBeep); int currentState = digitalRead(outBeep);
if (currentState != LOW){ if (currentState != LOW){
Serial.println("ALARM"); //write_log("ALARM");
digitalWrite(outBeep, LOW); digitalWrite(outBeep, LOW);
} }
} }
@@ -36,7 +36,7 @@ void beepOff(){
void beepOn(){ void beepOn(){
int currentState = digitalRead(outBeep); int currentState = digitalRead(outBeep);
if (currentState != HIGH){ if (currentState != HIGH){
Serial.println("ALARM"); //write_log("ALARM");
digitalWrite(outBeep, HIGH); digitalWrite(outBeep, HIGH);
} }
} }

View File

@@ -3,14 +3,14 @@ String current_string = "";
void display_text(String text1, String text2){ void display_text(String text1, String text2){
if (current_string != text1 + text2){ if (current_string != text1 + text2){
//Serial.println("Display:"); //write_log("Display:");
lcd.clear(); lcd.clear();
lcd.setCursor(freespace(text1), 0); lcd.setCursor(freespace(text1), 0);
lcd.print(text1); lcd.print(text1);
//Serial.println(text1); //write_log(text1);
lcd.setCursor(freespace(text2), 1); lcd.setCursor(freespace(text2), 1);
lcd.print(text2); lcd.print(text2);
//Serial.println(text2); //write_log(text2);
//ledMatrix.clear(); //ledMatrix.clear();
//ledMatrix.setText(text); //ledMatrix.setText(text);
//ledMatrix.drawText(); //ledMatrix.drawText();

View File

@@ -4,13 +4,16 @@ uint addr = 0;
struct { struct {
bool summertime = false; bool summertime = false;
bool ntp_update = true;
} data; } data;
void write_eeprom(){ void write_eeprom(){
EEPROM.begin(512); EEPROM.begin(512);
// load EEPROM data into RAM, see it // load EEPROM data into RAM, see it
data.summertime = summer; data.summertime = summer;
Serial.println("Writing to EEPROM: "+String(data.summertime)); data.ntp_update = ntp_update;
write_log("Writing to EEPROM: "+String(data.summertime));
write_log("Writing to EEPROM: "+String(data.ntp_update));
// replace values in EEPROM // replace values in EEPROM
EEPROM.put(addr,data); EEPROM.put(addr,data);
EEPROM.commit(); EEPROM.commit();
@@ -20,8 +23,10 @@ void write_eeprom(){
bool get_eeprom(){ bool get_eeprom(){
EEPROM.begin(512); EEPROM.begin(512);
EEPROM.get(addr,data); EEPROM.get(addr,data);
Serial.println("Found: "+String(data.summertime)); write_log("Found: "+String(data.summertime));
write_log("Found: "+String(data.ntp_update));
EEPROM.end(); EEPROM.end();
summer = data.summertime; summer = data.summertime;
ntp_update = data.ntp_update;
} }

View File

@@ -7,7 +7,7 @@ void show_white(){
leds[i] = CRGB::White; leds[i] = CRGB::White;
} }
FastLED.show(); FastLED.show();
Serial.println("Light: WHITE"); write_log("Light: WHITE");
} }
//Show LED Colors //Show LED Colors
@@ -19,7 +19,7 @@ void show_black(){
leds[i] = CRGB::Black; leds[i] = CRGB::Black;
} }
FastLED.show(); FastLED.show();
//Serial.println("Light: BLACK"); //write_log("Light: BLACK");
} }
//Show LED Colors //Show LED Colors
@@ -31,7 +31,7 @@ void show_green(){
leds[i] = CRGB::Green; leds[i] = CRGB::Green;
} }
FastLED.show(); FastLED.show();
Serial.println("Light: GREEN"); write_log("Light: GREEN");
} }
void set_color(int r, int g, int b){ void set_color(int r, int g, int b){
@@ -41,10 +41,10 @@ void set_color(int r, int g, int b){
leds[i].setRGB( r, g, b); leds[i].setRGB( r, g, b);
} }
FastLED.show(); FastLED.show();
Serial.println("Light: "); //write_log("Light: ");
Serial.println(r); //write_log(String(r));
Serial.println(b); //write_log(String(b));
Serial.println(g); //write_log(String(g));
} }
bool run_wake_up(long currentMillis){ bool run_wake_up(long currentMillis){

View File

@@ -1,7 +1,7 @@
//Code to update time from the web //Code to update time from the web
void update_time_from_web(){ void update_time_from_web(){
//Serial.println(wifi_connected); //write_log(wifi_connected);
if (wifi_connected == true) if (wifi_connected == true && ntp_update == true)
{ {
strDateTime dateTime; strDateTime dateTime;
// first parameter: Time zone in floating point (for India); second parameter: 1 for European summer time; 2 for US daylight saving time; 0 for no DST adjustment; (contributed by viewwer, not tested by me) // first parameter: Time zone in floating point (for India); second parameter: 1 for European summer time; 2 for US daylight saving time; 0 for no DST adjustment; (contributed by viewwer, not tested by me)
@@ -17,7 +17,7 @@ void update_time_from_web(){
byte actualMonth = dateTime.month; byte actualMonth = dateTime.month;
byte actualday =dateTime.day; byte actualday =dateTime.day;
byte actualdayofWeek = dateTime.dayofWeek; byte actualdayofWeek = dateTime.dayofWeek;
if (actualMinute != m){ if (actualMinute != m && actualday != 7 && actualMonth != 2 && actualyear != 2036){
h = actualHour; h = actualHour;
m = actualMinute; m = actualMinute;
s = actualsecond; s = actualsecond;
@@ -25,7 +25,10 @@ void update_time_from_web(){
M = actualMonth; M = actualMonth;
d = actualday; d = actualday;
set_clock(); set_clock();
Serial.println("Time Updated!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); write_log("Time Updated!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
write_log(String(h) + ":" + String(m) + " - " + String(d) + "." + String(M) + "." + String(y));
display_text("Update Time","");
delay_gui(1000);
} }
} }
} }

125
LichtWecker/webserver.ino Normal file
View File

@@ -0,0 +1,125 @@
String logfile = "";
void setup_webserver(){
httpUpdater.setup(&server, "Licht", "Wecker");
server.on("/log", []() { //Define the handling function for the path
server.send(200, "text/plain", logfile);
});
server.on("/", handleRootPath); //Associate the handler function to the path
server.begin(); //Start the server
}
void handle_webserver(){
server.handleClient(); //Handling of incoming requests
}
String Header = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>Lichtwecker</title></head><body style=\"text-align:left;margin:0.5em\"><div id=\"header\"><h1 style=\"margin:0px;padding:0px\">Licht Wecker</h1><hr></div><div id=\"content\" style=\"font-size:1.2em;\">";
String Footer = "</div><br><br><hr><div id=\"footer\">Not for Sale, Prototyp by <a href=\"http://christian.mittring-mering.de/\">CHM</a>, Hardware: " + Hardware + ", Software: "+ Software +"</div></body></html> ";
void handleRootPath() { //Handler for the rooth path
handleArgs();
}
//############################################################
//WebPage Args
void handleArgs(){
for (int i = 0; i < server.args(); i++) {
//write_log(server.argName(i) +" : " +server.arg(i));
if(server.argName(i) == "ntp"){
if(server.arg(i) == "true"){
if (ntp_update != true){
ntp_update = true;
write_eeprom();
}
}
else if (server.arg(i) == "false"){
if (ntp_update != false){
ntp_update = false;
write_eeprom();
}
}
break;
}
else if(server.argName(i) == "a1"){
if(server.arg(i) == "true"){
Clock.turnOnAlarm(1);
}
else if (server.arg(i) == "false"){
Clock.turnOffAlarm(1);
}
break;
}
else if(server.argName(i) == "a2"){
if(server.arg(i) == "true"){
Clock.turnOnAlarm(2);
}
else if (server.arg(i) == "false"){
Clock.turnOffAlarm(2);
}
break;
}
else if(server.argName(i) == "al1h" && server.argName(i +1) == "al1m"){
al1h = server.arg(i).toInt();
al1m = server.arg(i+1).toInt();
set_alarm1();
break;
}
else if(server.argName(i) == "al2h" && server.argName(i +1) == "al2m"){
al2h = server.arg(i).toInt();
al2m = server.arg(i+1).toInt();
set_alarm2();
break;
}
else if(server.argName(i) == "reset" && server.arg(i) == "true"){
print_reset();
ESP.restart();
break;
}
}
print_website();
}
void print_website(){
bool A1 = Clock.checkAlarmEnabled(1);
bool A2 = Clock.checkAlarmEnabled(2);
String Alarm1 = "Alarm 1: <form action=\"/\" methode=\"get\"><input type=\"text\" name=\"al1h\" value=\"" + String(al1h) + "\">:<input type=\"text\" name=\"al1m\" value=\"" + String(al1m) + "\"><input type=\"submit\" value=\"Speichern\"></form> Sommerzeit: " + getBoolString(summer) + "<br>Aktiv: " + getBoolString(A1) + "<br><a href=\"?a1=true\">Aktivieren</a> " + "&nbsp;&nbsp;<a href=\"?a1=false\">Deaktivieren</a>";
String Alarm2 = "Alarm 2: <form action=\"/\" methode=\"get\"><input type=\"text\" name=\"al2h\" value=\"" + String(al2h) + "\">:<input type=\"text\" name=\"al2m\" value=\"" + String(al2m) + "\"><input type=\"submit\" value=\"Speichern\"></form> Sommerzeit: " + getBoolString(summer) + "<br>Aktiv: " + getBoolString(A2) + "<br><a href=\"?a2=true\">Aktivieren</a> " + "&nbsp;&nbsp;<a href=\"?a2=false\">Deaktivieren</a>";
String Alarm = "<h3>Alarm</h3>" + Alarm1 + "<br><br>" + Alarm2;
String Zeit = "<br><h3>Zeit</h3>" + String(h) + ":" + String(m) + ":" + String(s) + " - " + String(d) + "." + String(M) + "." + String(y) + " | DST: " + String(summertime_EU(y,M,d,h,1));
String NTP = "<br><h3>NTP</h3>" + String("st&uuml;ndliches Zeit Update &uuml;ber " + ntp_server + ": ") + getBoolString(ntp_update) + "<br><a href=\"?ntp=true\">Aktivieren</a> " + "&nbsp;&nbsp;<a href=\"?ntp=false\">Deaktivieren</a>";
String Reboot = "<br><h3>System:</h3><a href=\"?reset=true\">Neustart</a><br><br><a href=\"update\">Software Update Modus</a>";
String Body = Alarm + Zeit + NTP + Reboot;
server.send(200, "text/html", Header + Body + Footer);
}
void print_reset(){
String Body = "Neustart... <a href=\"/\">Neu laden</a>";
server.send(200, "text/html", Header + Body + Footer);
delay(500);
}
//Helpers
//####################################################################################
String getBoolString(bool value){
if(value)
{
return "Ja";
}
return "Nein";
}
void write_log(String text){
Serial.println(text);
logfile = logfile + String(text) + "\r\n";
if (logfile.length() > 140000) {
logfile = logfile.substring((logfile.length()-100000));
}
}