2016-12-31 00:38:51 +01:00
/*
2020-02-23 22:24:51 +01:00
Main sketch , global variable declarations
*/
2017-12-14 00:12:02 +01:00
/*
* @ title WLED project sketch
2020-02-09 10:35:32 +01:00
* @ version 0.9 .1
2017-12-14 00:12:02 +01:00
* @ author Christian Schwinne
*/
2016-12-31 00:38:51 +01:00
2019-05-21 18:50:56 +02:00
//ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS).
2018-10-25 20:55:29 +02:00
//ESP8266-01 (black) has 1MB flash and can thus fit the whole program. Use 1M(64K SPIFFS).
2018-11-01 15:36:13 +01:00
//Uncomment some of the following lines to disable features to compile for ESP8266-01 (max flash size 434kB):
2018-10-25 20:55:29 +02:00
2018-11-16 19:59:00 +01:00
//You are required to disable over-the-air updates:
2019-12-11 00:59:15 +01:00
//#define WLED_DISABLE_OTA //saves 14kb
2018-10-25 20:55:29 +02:00
2019-11-28 20:13:52 +01:00
//You need to choose some of these features to disable:
2019-12-11 00:59:15 +01:00
//#define WLED_DISABLE_ALEXA //saves 11kb
//#define WLED_DISABLE_BLYNK //saves 6kb
//#define WLED_DISABLE_CRONIXIE //saves 3kb
//#define WLED_DISABLE_HUESYNC //saves 4kb
2020-02-24 12:44:41 +01:00
//#define WLED_DISABLE_INFRARED //there is no pin left for this on ESP8266-01, saves 12kb
2019-12-11 00:59:15 +01:00
# define WLED_ENABLE_MQTT //saves 12kb
# define WLED_ENABLE_ADALIGHT //saves 500b only
2020-02-23 22:24:51 +01:00
//#define WLED_ENABLE_DMX //uses 3.5kb
2019-03-18 19:54:06 +01:00
2019-03-16 02:09:37 +01:00
# define WLED_DISABLE_FILESYSTEM //SPIFFS is not used by any WLED feature yet
//#define WLED_ENABLE_FS_SERVING //Enable sending html file from SPIFFS before serving progmem version
//#define WLED_ENABLE_FS_EDITOR //enable /edit page for editing SPIFFS content. Will also be disabled with OTA lock
//to toggle usb serial debug (un)comment the following line
2019-10-26 00:00:44 +02:00
//#define WLED_DEBUG
2018-11-21 23:28:20 +01:00
2018-09-15 17:29:01 +02:00
//library inclusions
2016-09-11 23:07:18 +02:00
# include <Arduino.h>
2020-02-23 22:24:51 +01:00
# ifdef WLED_ENABLE_DMX
2020-02-24 22:09:33 +01:00
# include <ESPDMX.h>
DMXESPSerial dmx ;
2020-02-23 22:24:51 +01:00
# endif
2019-10-25 15:32:09 +02:00
# ifdef ESP8266
2020-02-24 22:09:33 +01:00
# include <ESP8266WiFi.h>
# include <ESP8266mDNS.h>
# include <ESPAsyncTCP.h>
extern " C " {
# include <user_interface.h>
}
# else //ESP32
# include <WiFi.h>
# include "esp_wifi.h"
# include <ESPmDNS.h>
# include <AsyncTCP.h>
# include "SPIFFS.h"
2018-01-09 23:13:29 +01:00
# endif
2018-09-15 17:29:01 +02:00
2019-02-17 17:11:10 +01:00
# include <ESPAsyncWebServer.h>
2016-09-11 23:07:18 +02:00
# include <EEPROM.h>
2018-12-17 15:08:59 +01:00
# include <WiFiUdp.h>
2019-02-16 00:21:22 +01:00
# include <DNSServer.h>
2018-11-01 15:36:13 +01:00
# ifndef WLED_DISABLE_OTA
2020-02-24 22:09:33 +01:00
# include <ArduinoOTA.h>
2018-11-01 15:36:13 +01:00
# endif
2019-03-16 02:09:37 +01:00
# include <SPIFFSEditor.h>
2017-12-11 23:59:12 +01:00
# include "src/dependencies/time/TimeLib.h"
# include "src/dependencies/timezone/Timezone.h"
2019-01-09 22:52:42 +01:00
# ifndef WLED_DISABLE_ALEXA
2020-02-24 22:09:33 +01:00
# define ESPALEXA_ASYNC
# define ESPALEXA_NO_SUBPAGE
# define ESPALEXA_MAXDEVICES 1
// #define ESPALEXA_DEBUG
# include "src/dependencies/espalexa/Espalexa.h"
2019-01-09 22:52:42 +01:00
# endif
2018-11-01 15:36:13 +01:00
# ifndef WLED_DISABLE_BLYNK
2020-02-24 22:09:33 +01:00
# include "src/dependencies/blynk/BlynkSimpleEsp.h"
2018-11-01 15:36:13 +01:00
# endif
2019-11-18 20:43:27 +01:00
# include "src/dependencies/e131/ESPAsyncE131.h"
2019-02-17 19:21:09 +01:00
# include "src/dependencies/async-mqtt-client/AsyncMqttClient.h"
2019-06-21 23:12:58 +02:00
# include "src/dependencies/json/AsyncJson-v6.h"
# include "src/dependencies/json/ArduinoJson-v6.h"
2019-12-02 12:41:35 +01:00
# include "html_ui.h"
2018-11-16 19:59:00 +01:00
# include "html_settings.h"
# include "html_other.h"
2019-10-07 23:38:21 +02:00
# include "FX.h"
2018-11-18 00:31:45 +01:00
# include "ir_codes.h"
2020-02-19 15:53:42 +01:00
# include "const.h"
2016-09-11 23:07:18 +02:00
2020-02-24 18:48:21 +01:00
# ifndef CLIENT_SSID
# define CLIENT_SSID DEFAULT_CLIENT_SSID
# endif
# ifndef CLIENT_PASS
# define CLIENT_PASS ""
# endif
2019-03-16 02:09:37 +01:00
2019-02-20 15:10:23 +01:00
# if IR_PIN < 0
2020-02-24 22:09:33 +01:00
# ifndef WLED_DISABLE_INFRARED
# define WLED_DISABLE_INFRARED
# endif
2019-02-20 15:10:23 +01:00
# endif
2020-02-23 22:24:51 +01:00
# ifndef WLED_DISABLE_INFRARED
2020-02-24 22:09:33 +01:00
# include <IRremoteESP8266.h>
# include <IRrecv.h>
# include <IRutils.h>
2020-02-23 22:24:51 +01:00
# endif
2018-09-15 17:29:01 +02:00
2020-02-22 17:20:34 +01:00
// remove flicker because PWM signal of RGB channels can become out of phase
# if defined(WLED_USE_ANALOG_LEDS) && defined(ESP8266)
# include "src/dependencies/arduino/core_esp8266_waveform.h"
# endif
// enable additional debug output
# ifdef WLED_DEBUG
# ifndef ESP8266
# include <rom/rtc.h>
# endif
# endif
2018-09-15 17:29:01 +02:00
//version code in format yymmddb (b = daily build)
2020-03-26 19:43:23 +01:00
# define VERSION 2003262
2020-01-14 11:12:33 +01:00
2020-02-09 10:35:32 +01:00
char versionString [ ] = " 0.9.1 " ;
2017-03-20 19:56:07 +01:00
2018-09-15 17:29:01 +02:00
//AP and OTA default passwords (for maximum change them!)
2020-02-24 18:48:21 +01:00
char apPass [ 65 ] = DEFAULT_AP_PASS ;
char otaPass [ 33 ] = DEFAULT_OTA_PASS ;
2017-05-08 21:00:06 +02:00
2018-09-15 17:29:01 +02:00
//Hardware CONFIG (only changeble HERE, not at runtime)
2018-11-18 00:31:45 +01:00
//LED strip pin, button pin and IR pin changeable in NpbWrapper.h!
2018-09-15 17:29:01 +02:00
byte auxDefaultState = 0 ; //0: input 1: high 2: low
byte auxTriggeredState = 0 ; //0: input 1: high 2: low
2019-12-04 02:01:47 +01:00
char ntpServerName [ 33 ] = " 0.wled.pool.ntp.org " ; //NTP server to use
2018-09-15 17:29:01 +02:00
//WiFi CONFIG (all these can be changed via web UI, no need to set them here)
2020-02-24 18:48:21 +01:00
char clientSSID [ 33 ] = CLIENT_SSID ;
char clientPass [ 65 ] = CLIENT_PASS ;
2019-02-05 19:40:24 +01:00
char cmDNS [ 33 ] = " x " ; //mDNS address (placeholder, will be replaced by wledXXXXXXXXXXXX.local)
2019-03-11 00:20:17 +01:00
char apSSID [ 33 ] = " " ; //AP off by default (unless setup)
2018-09-15 17:29:01 +02:00
byte apChannel = 1 ; //2.4GHz WiFi AP channel (1-13)
byte apHide = 0 ; //hidden AP SSID
2020-02-19 15:53:42 +01:00
byte apBehavior = AP_BEHAVIOR_BOOT_NO_CONN ; //access point opens when no connection after boot by default
2018-09-15 17:29:01 +02:00
IPAddress staticIP ( 0 , 0 , 0 , 0 ) ; //static IP of ESP
IPAddress staticGateway ( 0 , 0 , 0 , 0 ) ; //gateway (router) IP
IPAddress staticSubnet ( 255 , 255 , 255 , 0 ) ; //most common subnet in home networks
2020-02-20 17:08:56 +01:00
bool noWifiSleep = false ; //disabling modem sleep modes will increase heat output and power usage, but may help with connection issues
2018-09-15 17:29:01 +02:00
//LED CONFIG
2019-08-17 12:27:06 +02:00
uint16_t ledCount = 30 ; //overcurrent prevented by ABL
2018-09-15 17:29:01 +02:00
bool useRGBW = false ; //SK6812 strips can contain an extra White channel
2019-08-17 12:27:06 +02:00
# define ABL_MILLIAMPS_DEFAULT 850; //auto lower brightness to stay close to milliampere limit
2018-09-15 17:29:01 +02:00
bool turnOnAtBoot = true ; //turn on LEDs at power-up
byte bootPreset = 0 ; //save preset to load after power-up
2020-02-24 17:27:59 +01:00
byte col [ ] { 255 , 160 , 0 , 0 } ; //current RGB(W) primary color. col[] should be updated if you want to change the color.
byte colSec [ ] { 0 , 0 , 0 , 0 } ; //current RGB(W) secondary color
2019-12-04 02:01:47 +01:00
byte briS = 128 ; //default brightness
2018-09-15 17:29:01 +02:00
byte nightlightTargetBri = 0 ; //brightness after nightlight is over
byte nightlightDelayMins = 60 ;
bool nightlightFade = true ; //if enabled, light will gradually dim towards the target bri. Otherwise, it will instantly set after delay over
2020-01-08 12:00:25 +01:00
bool nightlightColorFade = false ; //if enabled, light will gradually fade color from primary to secondary color.
2018-09-15 17:29:01 +02:00
bool fadeTransition = true ; //enable crossfading color transition
2019-05-22 00:23:09 +02:00
uint16_t transitionDelay = 750 ; //default crossfade duration in ms
2018-03-14 00:25:54 +01:00
2018-09-15 17:29:01 +02:00
bool skipFirstLed = false ; //ignore first LED in strip (useful if you need the LED as signal repeater)
byte briMultiplier = 100 ; //% of brightness to set (to limit power, if you set it to 50 and set bri to 255, actual brightness will be 127)
//User Interface CONFIG
2019-10-05 01:56:55 +02:00
char serverDescription [ 33 ] = " WLED " ; //Name of module
2019-12-13 01:23:07 +01:00
bool syncToggleReceive = false ; //UIs which only have a single button for sync should toggle send+receive if this is true, only send otherwise
2018-09-15 17:29:01 +02:00
//Sync CONFIG
2018-11-21 23:28:20 +01:00
bool buttonEnabled = true ;
2020-01-08 00:46:16 +01:00
byte irEnabled = 0 ; //Infrared receiver
2018-09-15 17:29:01 +02:00
uint16_t udpPort = 21324 ; //WLED notifier default port
uint16_t udpRgbPort = 19446 ; //Hyperion port
bool receiveNotificationBrightness = true ; //apply brightness from incoming notifications
bool receiveNotificationColor = true ; //apply color
bool receiveNotificationEffects = true ; //apply effects setup
2019-03-25 22:51:38 +01:00
bool notifyDirect = false ; //send notification if change via UI or HTTP API
bool notifyButton = false ; //send if updated by button or infrared remote
2018-09-15 17:29:01 +02:00
bool notifyAlexa = false ; //send notification if updated via Alexa
bool notifyMacro = false ; //send notification for macro
bool notifyHue = true ; //send notification if Hue light changes
bool notifyTwice = false ; //notifications use UDP: enable if devices don't sync reliably
bool alexaEnabled = true ; //enable device discovery by Amazon Echo
char alexaInvocationName [ 33 ] = " Light " ; //speech control name of device. Choose something voice-to-text can understand
2019-02-16 00:21:22 +01:00
char blynkApiKey [ 36 ] = " " ; //Auth token for Blynk server. If empty, no connection will be made
2018-09-15 17:29:01 +02:00
uint16_t realtimeTimeoutMs = 2500 ; //ms timeout of realtime mode before returning to normal mode
int arlsOffset = 0 ; //realtime LED offset
bool receiveDirect = true ; //receive UDP realtime
bool arlsDisableGammaCorrection = true ; //activate if gamma correction is handled by the source
bool arlsForceMaxBri = false ; //enable to force max brightness if source has very dark colors that would be black
2020-03-10 17:33:23 +01:00
# define E131_MAX_UNIVERSE_COUNT 9
2020-02-08 20:38:28 +01:00
uint16_t e131Universe = 1 ; //settings for E1.31 (sACN) protocol (only DMX_MODE_MULTIPLE_* can span over consequtive universes)
2020-02-19 15:53:42 +01:00
uint8_t DMXMode = DMX_MODE_MULTIPLE_RGB ; //DMX mode (s.a.)
uint16_t DMXAddress = 1 ; //DMX start address of fixture, a.k.a. first Channel [for E1.31 (sACN) protocol]
2020-02-08 20:38:28 +01:00
uint8_t DMXOldDimmer = 0 ; //only update brightness on change
2020-03-10 17:33:23 +01:00
uint8_t e131LastSequenceNumber [ E131_MAX_UNIVERSE_COUNT ] ; //to detect packet loss
2020-02-08 20:38:28 +01:00
bool e131Multicast = false ; //multicast or unicast
2020-03-10 18:21:16 +01:00
bool e131SkipOutOfSequence = false ; //freeze instead of flickering
2018-09-15 17:29:01 +02:00
2019-12-13 01:23:07 +01:00
bool mqttEnabled = false ;
2018-10-04 16:50:12 +02:00
char mqttDeviceTopic [ 33 ] = " " ; //main MQTT topic (individual per device, default is wled/mac)
char mqttGroupTopic [ 33 ] = " wled/all " ; //second MQTT topic (for example to group devices)
char mqttServer [ 33 ] = " " ; //both domains and IPs should work (no SSL)
2019-08-18 03:34:47 +02:00
char mqttUser [ 41 ] = " " ; //optional: username for MQTT auth
char mqttPass [ 41 ] = " " ; //optional: password for MQTT auth
char mqttClientID [ 41 ] = " " ; //override the client ID
2019-08-18 18:14:17 +02:00
uint16_t mqttPort = 1883 ;
2018-09-28 23:53:51 +02:00
2018-09-15 17:29:01 +02:00
bool huePollingEnabled = false ; //poll hue bridge for light state
uint16_t huePollIntervalMs = 2500 ; //low values (< 1sec) may cause lag but offer quicker response
2018-10-07 11:56:29 +02:00
char hueApiKey [ 47 ] = " api " ; //key token will be obtained from bridge
2018-09-15 17:29:01 +02:00
byte huePollLightId = 1 ; //ID of hue lamp to sync to. Find the ID in the hue app ("about" section)
2020-02-23 22:24:51 +01:00
IPAddress hueIP = ( 0 , 0 , 0 , 0 ) ; //IP address of the bridge
2018-09-15 17:29:01 +02:00
bool hueApplyOnOff = true ;
bool hueApplyBri = true ;
bool hueApplyColor = true ;
//Time CONFIG
bool ntpEnabled = false ; //get internet time. Only required if you use clock overlays or time-activated macros
bool useAMPM = false ; //12h/24h clock format
byte currentTimezone = 0 ; //Timezone ID. Refer to timezones array in wled10_ntp.ino
int utcOffsetSecs = 0 ; //Seconds to offset from UTC before timzone calculation
byte overlayDefault = 0 ; //0: no overlay 1: analog clock 2: single-digit clocl 3: cronixie
2020-02-23 22:24:51 +01:00
byte overlayMin = 0 , overlayMax = ledCount - 1 ; //boundaries of overlay mode
2018-09-15 17:29:01 +02:00
byte analogClock12pixel = 0 ; //The pixel in your strip where "midnight" would be
bool analogClockSecondsTrail = false ; //Display seconds as trail of LEDs instead of a single pixel
bool analogClock5MinuteMarks = false ; //Light pixels at every 5-minute position
2018-10-07 11:56:29 +02:00
char cronixieDisplay [ 7 ] = " HHMMSS " ; //Cronixie Display mask. See wled13_cronixie.ino
2018-09-15 17:29:01 +02:00
bool cronixieBacklight = true ; //Allow digits to be back-illuminated
bool countdownMode = false ; //Clock will count down towards date
2019-12-04 02:01:47 +01:00
byte countdownYear = 20 , countdownMonth = 1 ; //Countdown target date, year is last two digits
2018-09-15 17:29:01 +02:00
byte countdownDay = 1 , countdownHour = 0 ;
byte countdownMin = 0 , countdownSec = 0 ;
byte macroBoot = 0 ; //macro loaded after startup
byte macroNl = 0 ; //after nightlight delay over
2019-08-17 12:27:06 +02:00
byte macroCountdown = 0 ;
2018-03-14 13:16:28 +01:00
byte macroAlexaOn = 0 , macroAlexaOff = 0 ;
2019-03-13 11:13:03 +01:00
byte macroButton = 0 , macroLongPress = 0 , macroDoublePress = 0 ;
2017-12-28 00:37:13 +01:00
2017-02-21 23:59:47 +01:00
2018-09-15 17:29:01 +02:00
//Security CONFIG
bool otaLock = false ; //prevents OTA firmware updates without password. ALWAYS enable if system exposed to any public networks
bool wifiLock = false ; //prevents access to WiFi settings when OTA lock is enabled
bool aOtaEnabled = true ; //ArduinoOTA allows easy updates directly from the IDE. Careful, it does not auto-disable when OTA lock is on
2018-02-28 00:27:10 +01:00
2018-04-24 12:03:25 +02:00
uint16_t userVar0 = 0 , userVar1 = 0 ;
2020-02-24 12:54:23 +01:00
# ifdef WLED_ENABLE_DMX
2020-02-24 22:09:33 +01:00
//dmx CONFIG
byte DMXChannels = 7 ; // number of channels per fixture
byte DMXFixtureMap [ 15 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
2020-02-23 22:24:51 +01:00
// assigns the different channels to different functions. See wled21_dmx.ino for more information.
2020-02-24 22:09:33 +01:00
uint16_t DMXGap = 10 ; // gap between the fixtures. makes addressing easier because you don't have to memorize odd numbers when climbing up onto a rig.
uint16_t DMXStart = 10 ; // start address of the first fixture
2020-02-24 12:54:23 +01:00
# endif
2020-02-23 22:24:51 +01:00
2018-09-15 17:29:01 +02:00
//internal global variable declarations
2019-10-18 23:47:11 +02:00
//wifi
bool apActive = false ;
bool forceReconnect = false ;
uint32_t lastReconnectAttempt = 0 ;
bool interfacesInited = false ;
2019-10-26 00:00:44 +02:00
bool wasConnected = false ;
2019-10-18 23:47:11 +02:00
2018-09-15 17:29:01 +02:00
//color
2020-02-23 22:24:51 +01:00
byte colOld [ ] { 0 , 0 , 0 , 0 } ; //color before transition
2020-02-24 17:27:59 +01:00
byte colT [ ] { 0 , 0 , 0 , 0 } ; //color that is currently displayed on the LEDs
2020-02-23 22:24:51 +01:00
byte colIT [ ] { 0 , 0 , 0 , 0 } ; //color that was last sent to LEDs
byte colSecT [ ] { 0 , 0 , 0 , 0 } ;
byte colSecOld [ ] { 0 , 0 , 0 , 0 } ;
byte colSecIT [ ] { 0 , 0 , 0 , 0 } ;
2018-09-15 17:29:01 +02:00
byte lastRandomIndex = 0 ; //used to save last random color so the new one is not the same
//transitions
bool transitionActive = false ;
uint16_t transitionDelayDefault = transitionDelay ;
2018-03-15 13:03:50 +01:00
uint16_t transitionDelayTemp = transitionDelay ;
2017-02-07 16:02:27 +01:00
unsigned long transitionStartTime ;
2018-09-15 17:29:01 +02:00
float tperLast = 0 ; //crossfade transition progress, 0.0f - 1.0f
2019-10-29 02:21:23 +01:00
bool jsonTransitionOnce = false ;
2018-09-15 17:29:01 +02:00
//nightlight
bool nightlightActive = false ;
bool nightlightActiveOld = false ;
uint32_t nightlightDelayMs = 10 ;
2018-11-21 23:28:20 +01:00
uint8_t nightlightDelayMinsDefault = nightlightDelayMins ;
2017-02-07 16:02:27 +01:00
unsigned long nightlightStartTime ;
2018-09-15 17:29:01 +02:00
byte briNlT = 0 ; //current nightlight brightness
2020-02-23 22:24:51 +01:00
byte colNlT [ ] { 0 , 0 , 0 , 0 } ; //current nightlight color
2018-09-15 17:29:01 +02:00
//brightness
2018-12-16 20:38:00 +01:00
unsigned long lastOnTime = 0 ;
2019-03-13 11:13:03 +01:00
bool offMode = ! turnOnAtBoot ;
2018-09-15 17:29:01 +02:00
byte bri = briS ;
2018-03-14 13:16:28 +01:00
byte briOld = 0 ;
byte briT = 0 ;
byte briIT = 0 ;
2019-12-04 02:01:47 +01:00
byte briLast = 128 ; //brightness before turned off. Used for toggle function
2020-01-08 00:46:16 +01:00
byte whiteLast = 128 ; //white channel before turned off. Used for toggle function
2018-09-15 17:29:01 +02:00
//button
2018-03-14 13:16:28 +01:00
bool buttonPressedBefore = false ;
2019-10-18 12:19:52 +02:00
bool buttonLongPressed = false ;
2018-03-14 13:16:28 +01:00
unsigned long buttonPressedTime = 0 ;
2019-03-13 11:13:03 +01:00
unsigned long buttonWaitTime = 0 ;
2018-09-15 17:29:01 +02:00
//notifications
bool notifyDirectDefault = notifyDirect ;
bool receiveNotifications = true ;
2018-03-14 13:16:28 +01:00
unsigned long notificationSentTime = 0 ;
2020-02-22 16:17:32 +01:00
byte notificationSentCallMode = NOTIFIER_CALL_MODE_INIT ;
2018-03-06 23:47:08 +01:00
bool notificationTwoRequired = false ;
2018-09-15 17:29:01 +02:00
//effects
2019-12-04 02:01:47 +01:00
byte effectCurrent = 0 ;
byte effectSpeed = 128 ;
byte effectIntensity = 128 ;
byte effectPalette = 0 ;
2018-09-15 17:29:01 +02:00
//network
2018-05-18 23:24:47 +02:00
bool udpConnected = false , udpRgbConnected = false ;
2018-09-15 17:29:01 +02:00
//ui style
bool showWelcomePage = false ;
2017-02-07 14:24:42 +01:00
2018-03-15 12:04:14 +01:00
//hue
2020-02-25 02:19:12 +01:00
byte hueError = HUE_ERROR_INACTIVE ;
2019-02-18 22:34:21 +01:00
//uint16_t hueFailCount = 0;
2020-02-23 22:24:51 +01:00
float hueXLast = 0 , hueYLast = 0 ;
uint16_t hueHueLast = 0 , hueCtLast = 0 ;
byte hueSatLast = 0 , hueBriLast = 0 ;
2018-09-15 17:29:01 +02:00
unsigned long hueLastRequestSent = 0 ;
2019-02-18 22:34:21 +01:00
bool hueAuthRequired = false ;
bool hueReceived = false ;
bool hueStoreAllowed = false , hueNewKey = false ;
2018-03-15 12:04:14 +01:00
2018-09-15 17:29:01 +02:00
//overlays
byte overlayCurrent = overlayDefault ;
2018-03-14 13:16:28 +01:00
byte overlaySpeed = 200 ;
unsigned long overlayRefreshMs = 200 ;
2017-02-07 16:02:27 +01:00
unsigned long overlayRefreshedTime ;
2018-09-15 17:29:01 +02:00
2018-03-06 23:47:08 +01:00
//cronixie
2020-02-23 22:24:51 +01:00
byte dP [ ] { 0 , 0 , 0 , 0 , 0 , 0 } ;
2018-03-06 23:47:08 +01:00
bool cronixieInit = false ;
2017-09-18 10:20:04 +02:00
2018-09-15 17:29:01 +02:00
//countdown
unsigned long countdownTime = 1514764800L ;
bool countdownOverTriggered = true ;
2018-09-22 22:49:24 +02:00
//timer
byte lastTimerMinute = 0 ;
2020-02-23 22:24:51 +01:00
byte timerHours [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
byte timerMinutes [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
byte timerMacro [ ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
byte timerWeekday [ ] = { 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } ; //weekdays to activate on
2019-01-31 00:09:44 +01:00
//bit pattern of arr elem: 0b11111111: sun,sat,fri,thu,wed,tue,mon,validity
2018-09-22 22:49:24 +02:00
2018-09-15 17:29:01 +02:00
//blynk
bool blynkEnabled = false ;
//preset cycling
2018-04-11 23:50:35 +02:00
bool presetCyclingEnabled = false ;
byte presetCycleMin = 1 , presetCycleMax = 5 ;
uint16_t presetCycleTime = 1250 ;
unsigned long presetCycledTime = 0 ; byte presetCycCurr = presetCycleMin ;
2020-02-29 18:42:55 +01:00
bool presetApplyBri = true ;
2018-06-24 01:20:15 +02:00
bool saveCurrPresetCycConf = false ;
2018-09-15 17:29:01 +02:00
//realtime
2020-02-19 15:53:42 +01:00
byte realtimeMode = REALTIME_MODE_INACTIVE ;
2018-06-24 01:20:15 +02:00
IPAddress realtimeIP = ( 0 , 0 , 0 , 0 ) ;
2018-09-15 17:29:01 +02:00
unsigned long realtimeTimeout = 0 ;
2018-09-28 23:53:51 +02:00
//mqtt
2019-10-18 14:06:07 +02:00
long lastMqttReconnectAttempt = 0 ;
2018-10-04 16:50:12 +02:00
long lastInterfaceUpdate = 0 ;
2020-02-22 16:17:32 +01:00
byte interfaceUpdateCallMode = NOTIFIER_CALL_MODE_INIT ;
2019-11-10 22:13:07 +01:00
char mqttStatusTopic [ 40 ] = " " ; //this must be global because of async handlers
2018-09-28 23:53:51 +02:00
2019-02-25 19:14:13 +01:00
# if AUXPIN >= 0
2020-02-24 22:09:33 +01:00
//auxiliary debug pin
byte auxTime = 0 ;
unsigned long auxStartTime = 0 ;
bool auxActive = false , auxActiveBefore = false ;
2019-02-25 19:14:13 +01:00
# endif
2017-09-18 10:20:04 +02:00
2018-02-20 22:29:48 +01:00
//alexa udp
2018-01-07 22:52:48 +01:00
String escapedMac ;
2019-01-09 22:52:42 +01:00
# ifndef WLED_DISABLE_ALEXA
2020-02-24 22:09:33 +01:00
Espalexa espalexa ;
EspalexaDevice * espalexaDevice ;
2019-01-09 22:52:42 +01:00
# endif
2017-02-21 23:59:47 +01:00
2018-03-14 11:41:24 +01:00
//dns server
DNSServer dnsServer ;
2018-09-15 17:29:01 +02:00
//network time
bool ntpConnected = false ;
time_t local = 0 ;
unsigned long ntpLastSyncTime = 999000000L ;
unsigned long ntpPacketSentTime = 999000000L ;
IPAddress ntpServerIP ;
2019-10-29 01:19:56 +01:00
uint16_t ntpLocalPort = 2390 ;
2018-09-15 17:29:01 +02:00
# define NTP_PACKET_SIZE 48
2020-02-25 02:25:17 +01:00
//maximum number of LEDs - MAX_LEDS is coming from the JSON response getting too big, MAX_LEDS_DMA will become a timing issue
2019-10-26 00:00:44 +02:00
# define MAX_LEDS 1500
# define MAX_LEDS_DMA 500
2019-03-11 19:30:49 +01:00
//string temp buffer (now stored in stack locally)
2019-02-20 23:44:34 +01:00
# define OMAX 2048
2019-03-11 19:30:49 +01:00
char * obuf ;
2018-07-20 19:35:31 +02:00
uint16_t olen = 0 ;
2020-02-24 22:09:33 +01:00
//presets
2019-11-30 11:17:37 +01:00
uint16_t savedPresets = 0 ;
2019-12-01 01:42:52 +01:00
int8_t currentPreset = - 1 ;
bool isPreset = false ;
2019-11-30 11:17:37 +01:00
byte errorFlag = 0 ;
2019-02-16 00:21:22 +01:00
String messageHead , messageSub ;
2019-02-20 23:44:34 +01:00
byte optionType ;
2019-02-16 00:21:22 +01:00
2019-02-17 17:11:10 +01:00
bool doReboot = false ; //flag to initiate reboot from async handlers
2019-10-20 17:38:25 +02:00
bool doPublishMqtt = false ;
2019-02-17 17:11:10 +01:00
2018-09-15 17:29:01 +02:00
//server library objects
2019-02-16 00:21:22 +01:00
AsyncWebServer server ( 80 ) ;
2019-02-18 22:34:21 +01:00
AsyncClient * hueClient = NULL ;
2019-02-17 19:21:09 +01:00
AsyncMqttClient * mqtt = NULL ;
2018-09-28 23:53:51 +02:00
2019-11-18 20:43:27 +01:00
//function prototypes
2020-02-23 22:24:51 +01:00
void colorFromUint32 ( uint32_t , bool = false ) ;
void serveMessage ( AsyncWebServerRequest * , uint16_t , String , String , byte ) ;
2019-11-18 20:43:27 +01:00
void handleE131Packet ( e131_packet_t * , IPAddress ) ;
2020-02-09 19:10:29 +01:00
void arlsLock ( uint32_t , byte ) ;
2020-01-02 22:10:59 +01:00
void handleOverlayDraw ( ) ;
2019-11-18 20:43:27 +01:00
2018-09-15 17:29:01 +02:00
//udp interface objects
2018-05-18 23:24:47 +02:00
WiFiUDP notifierUdp , rgbUdp ;
2017-02-07 16:02:27 +01:00
WiFiUDP ntpUdp ;
2019-11-18 20:43:27 +01:00
ESPAsyncE131 e131 ( handleE131Packet ) ;
bool e131NewData = false ;
2016-09-21 23:23:18 +02:00
2018-09-15 17:29:01 +02:00
//led fx library object
2018-04-13 00:28:29 +02:00
WS2812FX strip = WS2812FX ( ) ;
2016-12-14 23:40:47 +01:00
2019-10-18 13:26:39 +02:00
# define WLED_CONNECTED (WiFi.status() == WL_CONNECTED)
2020-02-24 18:48:21 +01:00
# define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID,DEFAULT_CLIENT_SSID) != 0)
2019-10-18 13:26:39 +02:00
2018-09-15 17:29:01 +02:00
//debug macros
2018-11-21 23:28:20 +01:00
# ifdef WLED_DEBUG
2020-02-24 22:09:33 +01:00
# define DEBUG_PRINT(x) Serial.print (x)
# define DEBUG_PRINTLN(x) Serial.println (x)
# define DEBUG_PRINTF(x) Serial.printf (x)
unsigned long debugTime = 0 ;
int lastWifiState = 3 ;
unsigned long wifiStateChangedTime = 0 ;
int loops = 0 ;
2017-12-16 00:04:04 +01:00
# else
2020-02-24 22:09:33 +01:00
# define DEBUG_PRINT(x)
# define DEBUG_PRINTLN(x)
# define DEBUG_PRINTF(x)
2017-12-16 00:04:04 +01:00
# endif
2018-09-15 17:29:01 +02:00
//filesystem
2019-03-16 02:09:37 +01:00
# ifndef WLED_DISABLE_FILESYSTEM
2020-02-24 22:09:33 +01:00
# include <FS.h>
# ifdef ARDUINO_ARCH_ESP32
# include "SPIFFS.h"
# endif
# include "SPIFFSEditor.h"
2017-05-15 12:24:59 +02:00
# endif
2016-09-11 23:07:18 +02:00
2020-02-23 22:24:51 +01:00
2018-09-15 17:29:01 +02:00
//turns all LEDs off and restarts ESP
2016-09-11 23:07:18 +02:00
void reset ( )
{
2018-03-14 13:16:28 +01:00
briT = 0 ;
2019-03-07 23:22:52 +01:00
long dly = millis ( ) ;
2020-02-23 22:24:51 +01:00
while ( millis ( ) - dly < 250 )
2019-03-07 23:22:52 +01:00
{
yield ( ) ; //enough time to send response to client
}
2016-10-25 22:11:04 +02:00
setAllLeds ( ) ;
2017-01-15 00:24:28 +01:00
DEBUG_PRINTLN ( " MODULE RESET " ) ;
2018-01-09 23:13:29 +01:00
ESP . restart ( ) ;
2016-09-11 23:07:18 +02:00
}
2018-09-15 17:29:01 +02:00
//append new c string to temp buffer efficiently
2019-12-11 00:59:15 +01:00
bool oappend ( const char * txt )
2018-07-20 19:35:31 +02:00
{
uint16_t len = strlen ( txt ) ;
if ( olen + len > = OMAX ) return false ; //buffer full
strcpy ( obuf + olen , txt ) ;
olen + = len ;
return true ;
}
2018-09-15 17:29:01 +02:00
//append new number to temp buffer efficiently
bool oappendi ( int i )
2018-07-20 19:35:31 +02:00
{
2019-08-17 12:27:06 +02:00
char s [ 11 ] ;
2020-02-23 22:24:51 +01:00
sprintf ( s , " %ld " , i ) ;
2018-07-20 19:35:31 +02:00
return oappend ( s ) ;
}
2018-09-15 17:29:01 +02:00
//boot starts here
2016-09-11 23:07:18 +02:00
void setup ( ) {
2018-11-09 17:00:36 +01:00
wledInit ( ) ;
2016-09-11 23:07:18 +02:00
}
2018-09-15 17:29:01 +02:00
//main program loop
2016-09-11 23:07:18 +02:00
void loop ( ) {
2020-01-08 00:46:16 +01:00
handleIR ( ) ; //2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too
2019-10-18 13:26:39 +02:00
handleConnection ( ) ;
2018-11-09 17:00:36 +01:00
handleSerial ( ) ;
handleNotifications ( ) ;
handleTransitions ( ) ;
2020-03-22 11:38:29 +01:00
# ifdef WLED_ENABLE_DMX
2020-02-23 22:24:51 +01:00
handleDMX ( ) ;
2020-03-22 11:38:29 +01:00
# endif
2018-11-09 17:00:36 +01:00
userLoop ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
yield ( ) ;
2019-03-16 02:09:37 +01:00
handleIO ( ) ;
2018-11-18 00:31:45 +01:00
handleIR ( ) ;
2018-11-09 17:00:36 +01:00
handleNetworkTime ( ) ;
2019-10-18 14:06:07 +02:00
handleAlexa ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
handleOverlays ( ) ;
yield ( ) ;
2020-02-24 22:09:33 +01:00
# ifdef WLED_USE_ANALOG_LEDS
2020-02-22 17:20:34 +01:00
strip . setRgbwPwm ( ) ;
2020-02-24 22:09:33 +01:00
# endif
2020-02-22 17:20:34 +01:00
2019-02-17 17:11:10 +01:00
if ( doReboot ) reset ( ) ;
2019-08-17 12:27:06 +02:00
2020-02-09 19:10:29 +01:00
if ( ! realtimeMode ) //block stuff if WARLS/Adalight is enabled
2018-11-09 17:00:36 +01:00
{
2019-10-18 23:47:11 +02:00
if ( apActive ) dnsServer . processNextRequest ( ) ;
2020-02-23 22:24:51 +01:00
# ifndef WLED_DISABLE_OTA
2019-10-20 17:38:25 +02:00
if ( WLED_CONNECTED & & aOtaEnabled ) ArduinoOTA . handle ( ) ;
2020-02-23 22:24:51 +01:00
# endif
2018-11-09 17:00:36 +01:00
handleNightlight ( ) ;
2019-03-09 21:41:23 +01:00
yield ( ) ;
2019-10-18 14:06:07 +02:00
handleHue ( ) ;
handleBlynk ( ) ;
2019-02-20 23:44:34 +01:00
yield ( ) ;
2019-03-13 11:13:03 +01:00
if ( ! offMode ) strip . service ( ) ;
2018-11-09 17:00:36 +01:00
}
2019-10-18 23:47:11 +02:00
yield ( ) ;
2020-02-24 22:09:33 +01:00
# ifdef ESP8266
2020-01-27 00:45:30 +01:00
MDNS . update ( ) ;
2020-02-24 22:09:33 +01:00
# endif
2019-10-18 23:47:11 +02:00
if ( millis ( ) - lastMqttReconnectAttempt > 30000 ) initMqtt ( ) ;
2019-08-17 12:27:06 +02:00
2018-11-09 17:00:36 +01:00
//DEBUG serial logging
2020-02-23 22:24:51 +01:00
# ifdef WLED_DEBUG
if ( millis ( ) - debugTime > 9999 )
{
DEBUG_PRINTLN ( " ---DEBUG INFO--- " ) ;
DEBUG_PRINT ( " Runtime: " ) ; DEBUG_PRINTLN ( millis ( ) ) ;
DEBUG_PRINT ( " Unix time: " ) ; DEBUG_PRINTLN ( now ( ) ) ;
DEBUG_PRINT ( " Free heap: " ) ; DEBUG_PRINTLN ( ESP . getFreeHeap ( ) ) ;
DEBUG_PRINT ( " Wifi state: " ) ; DEBUG_PRINTLN ( WiFi . status ( ) ) ;
if ( WiFi . status ( ) ! = lastWifiState )
{
wifiStateChangedTime = millis ( ) ;
}
lastWifiState = WiFi . status ( ) ;
DEBUG_PRINT ( " State time: " ) ; DEBUG_PRINTLN ( wifiStateChangedTime ) ;
DEBUG_PRINT ( " NTP last sync: " ) ; DEBUG_PRINTLN ( ntpLastSyncTime ) ;
DEBUG_PRINT ( " Client IP: " ) ; DEBUG_PRINTLN ( WiFi . localIP ( ) ) ;
DEBUG_PRINT ( " Loops/sec: " ) ; DEBUG_PRINTLN ( loops / 10 ) ;
loops = 0 ;
debugTime = millis ( ) ;
}
loops + + ;
# endif
2016-09-11 23:07:18 +02:00
}