Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ We've got some interesting branches in this repo inspired by user feedback. Thes
![compile esp8266 workflow](https://github.com/techniccontroller/wordclock_esp8266/actions/workflows/compile_esp8266.yml/badge.svg?branch=rgbw_leds)
- [**static_background_pattern**](https://github.com/techniccontroller/wordclock_esp8266/tree/static_background_pattern): This branch allows to light up specific letters always during clock mode. E.G., to display some special words in another color.
![compile esp8266 workflow](https://github.com/techniccontroller/wordclock_esp8266/actions/workflows/compile_esp8266.yml/badge.svg?branch=static_background_pattern)
- [**frame_light**](https://github.com/techniccontroller/wordclock_esp8266/tree/frame_light): This branch allows to add an additional LEDs around the clock, as background/frame light it has the same color as the clock. Thanks to Sandro for the idea.
![compile esp8266 workflow](https://github.com/techniccontroller/wordclock_esp8266/actions/workflows/compile_esp8266.yml/badge.svg?branch=frame_light)

## Install needed Libraries

Expand Down
10 changes: 9 additions & 1 deletion data/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@
}

.show{
height: 280px;
height: 320px;
transition: height 1s;
}

Expand Down Expand Up @@ -280,6 +280,10 @@ <h1 id="headline">WORDCLOCK 2.0</h1>
<label for="colorshiftspeed">Color shift speed:</label>
<input type="range" id="colorshiftspeed" name="volume" min="0" max="50">
</div>
<div class="number-container">
<label for="nm_brightness">Nightmode brightness:</label>
<input type="range" id="nm_brightness" name="volume" min="0" max="100">
</div>
<div class="number-container">
<label for="nm_start" style="align-self: flex-start">Nightmode start time: </label>
<input type="time" id="nm_start" name="nm_start" min="00:00" max="23:59">
Expand Down Expand Up @@ -536,6 +540,7 @@ <h1 id="headline">WORDCLOCK 2.0</h1>
document.getElementById("nm_start").value = myVar.nightModeStart.replace("-", ":");
document.getElementById("nm_end").value = myVar.nightModeEnd.replace("-", ":");
document.getElementById("brightness").value = parseInt(myVar.brightness);
document.getElementById("nm_brightness").value = parseInt(myVar.nightModeBrightness);
document.getElementById("colorshiftspeed").value = parseInt(myVar.colorshiftspeed);

updateDisplay(parseInt(myVar.modeid));
Expand Down Expand Up @@ -606,6 +611,7 @@ <h1 id="headline">WORDCLOCK 2.0</h1>
var nmStart = document.getElementById("nm_start");
var nmEnd = document.getElementById("nm_end");
var sld_brightness = document.getElementById("brightness");
var sld_nm_brightness = document.getElementById("nm_brightness");
var sld_colorshiftspeed = document.getElementById("colorshiftspeed");
var ckb_resetWifi = document.querySelector('input[id="ResetWifi"]');
var cmdstr = "./cmd?setting=";
Expand All @@ -616,6 +622,8 @@ <h1 id="headline">WORDCLOCK 2.0</h1>
cmdstr += sld_brightness.value;
cmdstr += "-";
cmdstr += sld_colorshiftspeed.value;
cmdstr += "-";
cmdstr += sld_nm_brightness.value;
console.log(cmdstr);
sendCommand(cmdstr);
if(ckb_resetWifi.checked) {
Expand Down
20 changes: 20 additions & 0 deletions ntp_client_plus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,26 @@ unsigned int NTPClientPlus::getDayOfWeek()
return this->_dayOfWeek;
}

/**
* @brief Getter for day of the month
*
* @return unsigned int
*/
unsigned int NTPClientPlus::getDayOfMonth()
{
return this->_dateDay;
}

/**
* @brief Getter for the month number
*
* @return unsigned int
*/
unsigned int NTPClientPlus::getMonthNumber()
{
return this->_dateMonth;
}

/**
* @brief Function to calc current year
*
Expand Down
2 changes: 2 additions & 0 deletions ntp_client_plus.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class NTPClientPlus{
String getFormattedDate();
void calcDate();
unsigned int getDayOfWeek();
unsigned int getDayOfMonth();
unsigned int getMonthNumber();
unsigned int getYear();
bool isLeapYear(unsigned int year);
int getMonth(int dayOfYear);
Expand Down
132 changes: 97 additions & 35 deletions wordclock_esp8266.ino
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,38 @@
// CONSTANTS
// ----------------------------------------------------------------------------------

#define EEPROM_SIZE 30 // size of EEPROM to save persistent variables
#define ADR_NM_START_H 0
#define ADR_NM_END_H 4
#define ADR_NM_START_M 8
#define ADR_NM_END_M 12
#define ADR_BRIGHTNESS 16
#define ADR_MC_RED 20
#define ADR_MC_GREEN 22
#define ADR_MC_BLUE 24
#define ADR_STATE 26
#define ADR_NM_ACTIVATED 27
#define ADR_COLSHIFTSPEED 28
#define ADR_COLSHIFTACTIVE 29

#define EEPROM_VERSION_CODE 3 // Change this value when defaults settings change

// EEPROM address map (all uint8_t, 1 byte each)
#define EEPROM_SIZE 14 // size of EEPROM to save persistent variables
#define ADR_EEPROM_VERSION 0 // uint8_t
#define ADR_NM_START_H 1 // uint8_t
#define ADR_NM_END_H 2 // uint8_t
#define ADR_NM_START_M 3 // uint8_t
#define ADR_NM_END_M 4 // uint8_t
#define ADR_BRIGHTNESS 5 // uint8_t
#define ADR_MC_RED 6 // uint8_t
#define ADR_MC_GREEN 7 // uint8_t
#define ADR_MC_BLUE 8 // uint8_t
#define ADR_STATE 9 // uint8_t
#define ADR_NM_ACTIVATED 10 // uint8_t
#define ADR_COLSHIFTSPEED 11 // uint8_t
#define ADR_COLSHIFTACTIVE 12 // uint8_t
#define ADR_NM_BRIGHTNESS 13 // uint8_t

// DEFAULT SETTINGS (if one changes this, also increment the EEPROM_VERSION_CODE, to ensure that the EEPROM is updated with the new defaults)
#define DEFAULT_NM_START_HOUR 22 // default start hour of nightmode (0-23)
#define DEFAULT_NM_START_MIN 5 // default start minute of nightmode (0-59)
#define DEFAULT_NM_END_HOUR 7 // default end hour of nightmode (0-23)
#define DEFAULT_NM_END_MIN 0 // default end minute of nightmode (0-59)
#define DEFAULT_BRIGHTNESS 40 // default brightness of LEDs (10-255)
#define DEFAULT_MC_RED 200 // default main color red value
#define DEFAULT_MC_GREEN 200 // default main color green value
#define DEFAULT_MC_BLUE 0 // default main color blue value
#define DEFAULT_NM_ACTIVATED 1 // if function nightmode is activated (0 = deactivated, 1 = activated)
#define DEFAULT_NM_BRIGHTNESS 0 // default brightness during night mode (0-255)
#define DEFAULT_COLSHIFT_SPEED 1 // needs to be between larger than 0 (1 = slowest, 255 = fastest)
#define DEFAULT_COLSHIFT_ACTIVE 0 // if dynamic color shift is active (0 = deactivated, 1 = activated)

#define NEOPIXELPIN 5 // pin to which the NeoPixels are attached
#define BUTTONPIN 14 // pin to which the button is attached
Expand Down Expand Up @@ -159,7 +177,7 @@ const uint32_t colors24bit[NUM_COLORS] = {
LEDMatrix::Color24bit(0, 128, 0),
LEDMatrix::Color24bit(0, 0, 255) };

uint8_t brightness = 40; // current brightness of leds
uint8_t brightness = DEFAULT_BRIGHTNESS; // current brightness of leds
bool sprialDir = false;

// timestamp variables
Expand All @@ -182,24 +200,25 @@ Tetris mytetris = Tetris(&ledmatrix, &logger);
Snake mysnake = Snake(&ledmatrix, &logger);
Pong mypong = Pong(&ledmatrix, &logger);

float filterFactor = DEFAULT_SMOOTHING_FACTOR;// stores smoothing factor for led transition
uint8_t currentState = st_clock; // stores current state
bool stateAutoChange = false; // stores state of automatic state change
bool nightMode = false; // stores state of nightmode
bool nightModeActivated = true; // stores if the function nightmode is activated (its not the state of nightmode)
bool ledOff = false; // stores state of led off
uint32_t maincolor_clock = colors24bit[2]; // color of the clock and digital clock
uint32_t maincolor_snake = colors24bit[1]; // color of the random snake animation
bool apmode = false; // stores if WiFi AP mode is active
bool dynColorShiftActive = false; // stores if dynamic color shift is active
uint8_t dynColorShiftPhase = 0; // stores the phase of the dynamic color shift
uint8_t dynColorShiftSpeed = 1; // stores the speed of the dynamic color shift -> used to calc update period
float filterFactor = DEFAULT_SMOOTHING_FACTOR; // stores smoothing factor for led transition
uint8_t currentState = st_clock; // stores current state
bool stateAutoChange = false; // stores state of automatic state change
bool nightMode = false; // stores state of nightmode
bool nightModeActivated = DEFAULT_NM_ACTIVATED; // stores if the function nightmode is activated (its not the state of nightmode)
bool ledOff = false; // stores state of led off
uint32_t maincolor_clock = colors24bit[2]; // color of the clock and digital clock
uint32_t maincolor_snake = colors24bit[1]; // color of the random snake animation
bool apmode = false; // stores if WiFi AP mode is active
bool dynColorShiftActive = DEFAULT_COLSHIFT_ACTIVE; // stores if dynamic color shift is active
uint8_t dynColorShiftPhase = 0; // stores the phase of the dynamic color shift
uint8_t dynColorShiftSpeed = DEFAULT_COLSHIFT_SPEED; // stores the speed of the dynamic color shift -> used to calc update period

// nightmode settings
uint8_t nightModeStartHour = 22;
uint8_t nightModeStartMin = 0;
uint8_t nightModeEndHour = 7;
uint8_t nightModeEndMin = 0;
uint8_t nightModeStartHour = DEFAULT_NM_START_HOUR;
uint8_t nightModeStartMin = DEFAULT_NM_START_MIN;
uint8_t nightModeEndHour = DEFAULT_NM_END_HOUR;
uint8_t nightModeEndMin = DEFAULT_NM_END_MIN;
uint8_t nightModeBrightness = DEFAULT_NM_BRIGHTNESS;

// Watchdog counter to trigger restart if NTP update was not possible 30 times in a row (5min)
int watchdogCounter = 30;
Expand All @@ -221,6 +240,25 @@ void setup() {
//Init EEPROM
EEPROM.begin(EEPROM_SIZE);

// Check EEPROM version code
uint8_t storedVersion = EEPROM.read(ADR_EEPROM_VERSION);
if (storedVersion != EEPROM_VERSION_CODE) {
// Set new defaults
EEPROM.write(ADR_EEPROM_VERSION, EEPROM_VERSION_CODE);
EEPROM.write(ADR_NM_START_H, DEFAULT_NM_START_HOUR);
EEPROM.write(ADR_NM_START_M, DEFAULT_NM_START_MIN);
EEPROM.write(ADR_NM_END_H, DEFAULT_NM_END_HOUR);
EEPROM.write(ADR_NM_END_M, DEFAULT_NM_END_MIN);
EEPROM.write(ADR_BRIGHTNESS, DEFAULT_BRIGHTNESS);
setMainColor(DEFAULT_MC_RED, DEFAULT_MC_GREEN, DEFAULT_MC_BLUE);
EEPROM.write(ADR_STATE, st_clock);
EEPROM.write(ADR_NM_ACTIVATED, DEFAULT_NM_ACTIVATED);
EEPROM.write(ADR_COLSHIFTSPEED, DEFAULT_COLSHIFT_SPEED);
EEPROM.write(ADR_COLSHIFTACTIVE, DEFAULT_COLSHIFT_ACTIVE);
EEPROM.write(ADR_NM_BRIGHTNESS, DEFAULT_NM_BRIGHTNESS);
EEPROM.commit();
}

// configure button pin as input
pinMode(BUTTONPIN, INPUT_PULLUP);

Expand Down Expand Up @@ -360,6 +398,7 @@ void setup() {
loadNightmodeSettingsFromEEPROM();
loadBrightnessSettingsFromEEPROM();
loadColorShiftStateFromEEPROM();
loadNightmodeBrightnessFromEEPROM();

if(ESP.getResetReason().equals("Power On") || ESP.getResetReason().equals("External System")){
// test quickly each LED
Expand Down Expand Up @@ -426,15 +465,23 @@ void loop() {
}

// handle state behaviours (trigger loopCycles of different states depending on current state)
if(!nightMode && !ledOff && (millis() - lastStep > behaviorUpdatePeriod) && (millis() - lastLEDdirect > TIMEOUT_LEDDIRECT)){
if(!ledOff && (millis() - lastStep > behaviorUpdatePeriod) && (millis() - lastLEDdirect > TIMEOUT_LEDDIRECT)){
updateStateBehavior(currentState);
lastStep = millis();
}

// Turn off LEDs if ledOff is true or nightmode is active
if((ledOff || nightMode) && !waitForTimeAfterReboot){
// Turn off LEDs if ledOff is true
if(ledOff && !waitForTimeAfterReboot){
ledmatrix.gridFlush();
}

// Apply night mode brightness
if(nightMode && !ledOff && !waitForTimeAfterReboot){
ledmatrix.setBrightness(nightModeBrightness);
}
else if(!nightMode && !ledOff && !waitForTimeAfterReboot){
ledmatrix.setBrightness(brightness);
}

// periodically write colors to matrix
if(millis() - lastAnimationStep > PERIOD_MATRIXUPDATE && !waitForTimeAfterReboot && (millis() - lastLEDdirect > TIMEOUT_LEDDIRECT)){
Expand All @@ -446,7 +493,7 @@ void loop() {
handleButton();

// handle state changes
if(stateAutoChange && (millis() - lastStateChange > PERIOD_STATECHANGE) && !nightMode && !ledOff){
if(stateAutoChange && (millis() - lastStateChange > PERIOD_STATECHANGE) && !ledOff){
// increment state variable and trigger state change
stateChange((currentState + 1) % NUM_STATES, false);

Expand Down Expand Up @@ -897,6 +944,16 @@ void loadColorShiftStateFromEEPROM()
logger.logString("ColorShiftActive: " + String(dynColorShiftActive));
}

/**
* @brief Load the night mode brightness from EEPROM
*
*/
void loadNightmodeBrightnessFromEEPROM()
{
nightModeBrightness = EEPROM.read(ADR_NM_BRIGHTNESS);
logger.logString("Night mode brightness: " + String(nightModeBrightness));
}

/**
* @brief Handler for handling commands sent to "/cmd" url
*
Expand Down Expand Up @@ -969,6 +1026,7 @@ void handleCommand() {
nightModeEndMin = split(timestr, '-', 3).toInt();
brightness = split(timestr, '-', 4).toInt();
dynColorShiftSpeed = split(timestr, '-', 5).toInt();
nightModeBrightness = split(timestr, '-', 6).toInt();
if(nightModeStartHour < 0 || nightModeStartHour > 23) nightModeStartHour = 22;
if(nightModeStartMin < 0 || nightModeStartMin > 59) nightModeStartMin = 0;
if(nightModeEndHour < 0 || nightModeEndHour > 23) nightModeEndHour = 7;
Expand All @@ -981,11 +1039,13 @@ void handleCommand() {
EEPROM.write(ADR_NM_END_M, nightModeEndMin);
EEPROM.write(ADR_BRIGHTNESS, brightness);
EEPROM.write(ADR_COLSHIFTSPEED, dynColorShiftSpeed);
EEPROM.write(ADR_NM_BRIGHTNESS, nightModeBrightness);
EEPROM.commit();
logger.logString("Nightmode starts at: " + String(nightModeStartHour) + ":" + String(nightModeStartMin));
logger.logString("Nightmode ends at: " + String(nightModeEndHour) + ":" + String(nightModeEndMin));
logger.logString("Brightness: " + String(brightness));
logger.logString("ColorShiftSpeed: " + String(dynColorShiftSpeed));
logger.logString("Night mode brightness: " + String(nightModeBrightness));
ledmatrix.setBrightness(brightness);
lastNightmodeCheck = millis() - PERIOD_NIGHTMODECHECK;
}
Expand Down Expand Up @@ -1139,6 +1199,8 @@ void handleDataRequest() {
message += ",";
message += "\"brightness\":\"" + String(brightness) + "\"";
message += ",";
message += "\"nightModeBrightness\":\"" + String(nightModeBrightness) + "\"";
message += ",";
message += "\"colorshift\":\"" + String(dynColorShiftActive) + "\"";
message += ",";
message += "\"colorshiftspeed\":\"" + String(dynColorShiftSpeed) + "\"";
Expand Down
6 changes: 3 additions & 3 deletions wordclockfunctions.ino
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ String timeToString(uint8_t hours,uint8_t minutes){
}
else if(minutes >= 20 && minutes < 25)
{
message += "ZEHN VOR HALB ";
message += "ZWANZIG NACH ";
}
else if(minutes >= 25 && minutes < 30)
{
Expand All @@ -130,7 +130,7 @@ String timeToString(uint8_t hours,uint8_t minutes){
}
else if(minutes >= 40 && minutes < 45)
{
message += "ZEHN NACH HALB ";
message += "ZWANZIG VOR ";
}
else if(minutes >= 45 && minutes < 50)
{
Expand All @@ -150,7 +150,7 @@ String timeToString(uint8_t hours,uint8_t minutes){
{
hours -= 12;
}
if(minutes >= 20)
if(minutes >= 25)
{
hours++;
}
Expand Down
16 changes: 2 additions & 14 deletions wordclockfunctions.ino_swiss
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ const String clockStringSwiss = "ESPESCHAFUFVIERTUBFZAAZWANZGSIVORABOHWORTUHRHA
*/
void drawMinuteIndicator(uint8_t minutes, uint32_t color){
//separate LEDs for minutes in an additional row
{
switch (minutes%5)
{
case 0:
Expand All @@ -31,7 +30,6 @@ void drawMinuteIndicator(uint8_t minutes, uint32_t color){
ledmatrix.setMinIndicator(0b1111, color);
break;
}
}
}

/**
Expand Down Expand Up @@ -93,20 +91,10 @@ int showStringOnClock(String message, uint32_t color){
* @param minutes minutes of the time value
* @return String time as sentence
*/
String timeToString(uint8_t hours, uint8_t minutes, bool puristModeActive){
String timeToString(uint8_t hours, uint8_t minutes){

//ES IST
String message = "";

if(puristModeActive){
message = "";
if(minutes < 5 || (minutes >=30 && minutes < 35)){
message = "ES ESCH ";
}
}
else{
message = "ES ESCH ";
}
String message = "ES ESCH ";

//show minutes
if(minutes >= 5 && minutes < 10)
Expand Down