2016-12-31 00:38:51 +01:00
|
|
|
/*
|
|
|
|
* Main sketch
|
|
|
|
*/
|
|
|
|
|
2016-09-11 23:07:18 +02:00
|
|
|
#include <Arduino.h>
|
|
|
|
#include <ESP8266WiFi.h>
|
|
|
|
#include <ESP8266WebServer.h>
|
2016-09-21 23:23:18 +02:00
|
|
|
#include <ESP8266HTTPUpdateServer.h>
|
2016-09-11 23:07:18 +02:00
|
|
|
#include <ESP8266mDNS.h>
|
|
|
|
#include <EEPROM.h>
|
|
|
|
#include <Hash.h>
|
2016-12-17 23:43:07 +01:00
|
|
|
#include "WS2812FX.h"
|
2016-09-11 23:07:18 +02:00
|
|
|
#include <FS.h>
|
2016-11-27 22:37:51 +01:00
|
|
|
#include <WiFiUDP.h>
|
2016-12-29 00:03:58 +01:00
|
|
|
#include <Time.h>
|
|
|
|
#include <TimeLib.h>
|
|
|
|
#include <Timezone.h>
|
2016-09-11 23:07:18 +02:00
|
|
|
|
2017-01-15 00:24:28 +01:00
|
|
|
//to toggle usb serial debug (un)comment following line
|
2017-01-26 23:45:55 +01:00
|
|
|
//#define DEBUG
|
2017-01-15 00:24:28 +01:00
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define DEBUG_PRINT(x) Serial.print (x)
|
|
|
|
#define DEBUG_PRINTLN(x) Serial.println (x)
|
|
|
|
#define DEBUG_PRINTF(x) Serial.printf (x)
|
|
|
|
#else
|
|
|
|
#define DEBUG_PRINT(x)
|
|
|
|
#define DEBUG_PRINTLN(x)
|
|
|
|
#define DEBUG_PRINTF(x)
|
|
|
|
#endif
|
|
|
|
|
2016-09-20 22:21:44 +02:00
|
|
|
/*
|
|
|
|
* @title WLED project sketch
|
|
|
|
* @version 0.3pd
|
|
|
|
* @author Christian Schwinne
|
|
|
|
*/
|
2016-12-11 20:11:14 +01:00
|
|
|
//Hardware-settings (only changeble via code)
|
2017-01-26 23:45:55 +01:00
|
|
|
#define LEDCOUNT 84
|
2016-12-11 20:11:14 +01:00
|
|
|
uint8_t buttonPin = 0; //needs pull-up
|
2017-01-27 22:59:01 +01:00
|
|
|
uint8_t auxPin = 16; //use e.g. for external relay
|
|
|
|
uint8_t auxDefaultState = 0; //0: input 1: high 2: low
|
|
|
|
uint8_t auxTriggeredState = 0; //0: input 1: high 2: low
|
2016-12-29 00:03:58 +01:00
|
|
|
|
2017-01-15 00:24:28 +01:00
|
|
|
//AP and OTA default passwords (change them!)
|
|
|
|
String appass = "wled1234";
|
|
|
|
String otapass = "wledota";
|
|
|
|
|
2016-12-29 00:03:58 +01:00
|
|
|
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120}; //Central European Summer Time
|
|
|
|
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60}; //Central European Standard Time
|
2016-12-31 00:38:51 +01:00
|
|
|
Timezone TZ(CEST, CET);
|
2016-12-29 00:03:58 +01:00
|
|
|
TimeChangeRule *tcr; //pointer to the time change rule, use to get the TZ abbrev
|
|
|
|
time_t local;
|
|
|
|
|
2016-10-25 22:11:04 +02:00
|
|
|
//Default CONFIG
|
2016-12-11 20:11:14 +01:00
|
|
|
String serverDescription = "WLED 0.3pd";
|
2016-09-11 23:07:18 +02:00
|
|
|
String clientssid = "Your_Network_Here";
|
|
|
|
String clientpass = "Dummy_Pass";
|
|
|
|
String cmdns = "led";
|
|
|
|
String apssid = "WLED-AP";
|
2016-11-19 19:12:57 +01:00
|
|
|
uint8_t apchannel = 1;
|
|
|
|
uint8_t aphide = 0;
|
2016-09-11 23:07:18 +02:00
|
|
|
boolean useap = true;
|
|
|
|
IPAddress staticip(0, 0, 0, 0);
|
|
|
|
IPAddress staticgateway(0, 0, 0, 0);
|
|
|
|
IPAddress staticsubnet(255, 255, 255, 0);
|
2016-12-29 00:03:58 +01:00
|
|
|
byte col_s[]{255, 127, 0};
|
|
|
|
byte bri_s = 127;
|
2016-12-11 20:11:14 +01:00
|
|
|
uint8_t bri_nl = 0;
|
2016-10-25 22:11:04 +02:00
|
|
|
boolean fadeTransition = true;
|
|
|
|
boolean seqTransition = false;
|
2016-10-30 16:26:17 +01:00
|
|
|
uint16_t transitionDelay = 1500;
|
2016-11-20 01:47:15 +01:00
|
|
|
boolean ota_lock = true;
|
2016-09-14 22:32:57 +02:00
|
|
|
boolean only_ap = false;
|
2016-10-30 20:04:39 +01:00
|
|
|
boolean buttonEnabled = true;
|
2016-12-14 21:40:09 +01:00
|
|
|
boolean notifyDirect = true, notifyButton = true, notifyNightlight = false, notifyMaster = true;
|
|
|
|
boolean receiveNotifications = true, receiveNotificationsDefault = true;
|
2016-11-03 22:07:07 +01:00
|
|
|
uint8_t bri_n = 100;
|
2016-11-19 19:12:57 +01:00
|
|
|
uint8_t nightlightDelayMins = 60;
|
|
|
|
boolean nightlightFade = true;
|
2016-12-11 20:11:14 +01:00
|
|
|
uint16_t udpPort = 21324;
|
2016-12-29 00:03:58 +01:00
|
|
|
uint8_t effectDefault = 0;
|
|
|
|
uint8_t effectSpeedDefault = 75;
|
2017-01-15 00:24:28 +01:00
|
|
|
boolean ntpEnabled = false;
|
2016-12-29 00:03:58 +01:00
|
|
|
const char* ntpServerName = "time.nist.gov";
|
2017-01-15 00:24:28 +01:00
|
|
|
long ntpRetryMs = 9600;
|
|
|
|
long ntpResyncMs = 72000000L;
|
2016-12-31 17:36:07 +01:00
|
|
|
int overlayMin = 0, overlayMax = 9;
|
2016-12-31 00:38:51 +01:00
|
|
|
int analogClock12pixel = 25;
|
|
|
|
boolean analogClockSecondsTrail = false;
|
|
|
|
boolean analogClock5MinuteMarks = true;
|
2017-01-15 00:24:28 +01:00
|
|
|
boolean nixieClockDisplaySeconds = false;
|
2016-12-31 17:36:07 +01:00
|
|
|
boolean nixieClock12HourFormat = false;
|
|
|
|
boolean overlayReverse = true;
|
|
|
|
uint8_t overlaySpeed = 200;
|
|
|
|
|
2016-11-27 16:45:54 +01:00
|
|
|
double transitionResolution = 0.011;
|
2016-10-25 22:11:04 +02:00
|
|
|
|
|
|
|
//Internal vars
|
2016-12-29 00:03:58 +01:00
|
|
|
byte col[]{0, 0, 0};
|
2016-10-25 22:11:04 +02:00
|
|
|
byte col_old[]{0, 0, 0};
|
|
|
|
byte col_t[]{0, 0, 0};
|
2016-11-20 00:07:04 +01:00
|
|
|
byte col_it[]{0, 0, 0};
|
2016-10-25 22:11:04 +02:00
|
|
|
long transitionStartTime;
|
2016-11-19 19:12:57 +01:00
|
|
|
long nightlightStartTime;
|
2016-11-19 19:39:17 +01:00
|
|
|
float tper_last = 0;
|
2016-12-29 00:03:58 +01:00
|
|
|
byte bri = 0;
|
2016-10-25 22:11:04 +02:00
|
|
|
byte bri_old = 0;
|
|
|
|
byte bri_t = 0;
|
2016-11-20 00:07:04 +01:00
|
|
|
byte bri_it = 0;
|
2016-10-30 20:04:39 +01:00
|
|
|
byte bri_last = 127;
|
2016-10-25 22:11:04 +02:00
|
|
|
boolean transitionActive = false;
|
2016-10-30 20:04:39 +01:00
|
|
|
boolean buttonPressedBefore = false;
|
2016-11-19 19:12:57 +01:00
|
|
|
boolean nightlightActive = false;
|
2016-11-26 19:34:05 +01:00
|
|
|
boolean nightlightActive_old = false;
|
|
|
|
int transitionDelay_old;
|
2016-11-27 16:45:54 +01:00
|
|
|
int nightlightDelayMs;
|
2016-12-29 00:03:58 +01:00
|
|
|
uint8_t effectCurrent = 0;
|
|
|
|
uint8_t effectSpeed = 75;
|
2016-11-27 22:37:51 +01:00
|
|
|
boolean udpConnected = false;
|
2017-01-26 23:45:55 +01:00
|
|
|
byte udpIn[LEDCOUNT*4+2];
|
2016-12-29 00:03:58 +01:00
|
|
|
IPAddress ntpIp;
|
2016-12-31 17:36:07 +01:00
|
|
|
IPAddress ntpBackupIp(134,130,5,17);
|
2016-12-29 00:03:58 +01:00
|
|
|
byte ntpBuffer[48];
|
|
|
|
boolean ntpConnected = false;
|
|
|
|
boolean ntpSyncNeeded = true;
|
|
|
|
boolean ntpPacketSent = false;
|
|
|
|
long ntpPacketSentTime, ntpSyncTime;
|
2017-01-15 00:24:28 +01:00
|
|
|
uint8_t overlayCurrent = 0;
|
2016-12-31 00:38:51 +01:00
|
|
|
long overlayRefreshMs = 200;
|
|
|
|
long overlayRefreshedTime;
|
2016-12-31 17:36:07 +01:00
|
|
|
int overlayArr[6];
|
2016-12-31 21:10:33 +01:00
|
|
|
int overlayDur[6];
|
|
|
|
int overlayPauseDur[6];
|
|
|
|
int nixieClockI = -1;
|
|
|
|
boolean nixiePause;
|
|
|
|
long countdownTime = 1483225200L;
|
2017-01-26 23:45:55 +01:00
|
|
|
boolean arlsTimeout = false;
|
|
|
|
long arlsTimeoutTime;
|
2017-01-27 22:59:01 +01:00
|
|
|
uint8_t auxTime = 0;
|
|
|
|
long auxStartTime;
|
|
|
|
boolean auxActive, auxActiveBefore;
|
2016-10-25 22:11:04 +02:00
|
|
|
|
2016-09-11 23:07:18 +02:00
|
|
|
ESP8266WebServer server(80);
|
2016-09-21 23:23:18 +02:00
|
|
|
ESP8266HTTPUpdateServer httpUpdater;
|
2016-11-27 22:37:51 +01:00
|
|
|
WiFiUDP notifierUdp;
|
2016-12-29 00:03:58 +01:00
|
|
|
WiFiUDP ntpUdp;
|
2016-09-21 23:23:18 +02:00
|
|
|
|
2017-01-26 23:45:55 +01:00
|
|
|
WS2812FX strip = WS2812FX(LEDCOUNT, 2, NEO_GRB + NEO_KHZ800);
|
2016-12-14 23:40:47 +01:00
|
|
|
|
2016-09-11 23:07:18 +02:00
|
|
|
File fsUploadFile;
|
|
|
|
|
2017-01-15 00:24:28 +01:00
|
|
|
#ifdef DEBUG
|
|
|
|
int debugIndex = 0;
|
|
|
|
int lastWifiState = 3;
|
|
|
|
long wifiStateChangedTime = 0;
|
|
|
|
#endif
|
|
|
|
|
2016-09-11 23:07:18 +02:00
|
|
|
void down()
|
|
|
|
{
|
2016-10-25 22:11:04 +02:00
|
|
|
bri_t = 0;
|
|
|
|
setAllLeds();
|
2017-01-15 00:24:28 +01:00
|
|
|
DEBUG_PRINTLN("MODULE TERMINATED");
|
2016-09-11 23:07:18 +02:00
|
|
|
while (1) {delay(1000);}
|
|
|
|
}
|
|
|
|
|
|
|
|
void reset()
|
|
|
|
{
|
2016-10-25 22:11:04 +02:00
|
|
|
bri_t = 0;
|
|
|
|
setAllLeds();
|
2017-01-15 00:24:28 +01:00
|
|
|
DEBUG_PRINTLN("MODULE RESET");
|
2016-09-11 23:07:18 +02:00
|
|
|
ESP.reset();
|
|
|
|
}
|
|
|
|
|
2016-10-30 16:26:17 +01:00
|
|
|
uint8_t bool2int(boolean value)
|
|
|
|
{
|
|
|
|
if (value) return 1;
|
|
|
|
return 0;
|
2016-09-11 23:07:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void setup() {
|
2016-11-19 19:39:17 +01:00
|
|
|
wledInit();
|
2016-09-11 23:07:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void loop() {
|
|
|
|
server.handleClient();
|
2016-11-27 22:37:51 +01:00
|
|
|
handleNotifications();
|
2016-10-25 22:11:04 +02:00
|
|
|
handleTransitions();
|
2016-11-19 19:12:57 +01:00
|
|
|
handleNightlight();
|
2016-10-30 20:04:39 +01:00
|
|
|
handleButton();
|
2016-12-29 00:03:58 +01:00
|
|
|
handleNetworkTime();
|
2016-12-31 00:38:51 +01:00
|
|
|
handleOverlays();
|
2016-12-14 23:40:47 +01:00
|
|
|
strip.service();
|
2017-01-15 00:24:28 +01:00
|
|
|
|
|
|
|
//DEBUG
|
|
|
|
#ifdef DEBUG
|
|
|
|
debugIndex ++;
|
|
|
|
if (debugIndex > 99999)
|
|
|
|
{
|
|
|
|
debugIndex = 0;
|
|
|
|
DEBUG_PRINTLN("---MODULE DEBUG INFO---");
|
|
|
|
DEBUG_PRINT("Runtime: "); DEBUG_PRINTLN(millis());
|
|
|
|
DEBUG_PRINT("Unix time: "); DEBUG_PRINTLN(now());
|
|
|
|
DEBUG_PRINT("Wifi state: "); DEBUG_PRINTLN(WiFi.status());
|
|
|
|
if (WiFi.status() != lastWifiState)
|
|
|
|
{
|
|
|
|
wifiStateChangedTime = millis();
|
|
|
|
}
|
|
|
|
lastWifiState = WiFi.status();
|
|
|
|
DEBUG_PRINT("Wifi state: "); DEBUG_PRINTLN(wifiStateChangedTime);
|
|
|
|
DEBUG_PRINT("NTP sync needed: "); DEBUG_PRINTLN(ntpSyncNeeded);
|
|
|
|
DEBUG_PRINT("Client IP: "); DEBUG_PRINTLN(WiFi.localIP());
|
|
|
|
}
|
|
|
|
#endif
|
2016-09-11 23:07:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|