5050
5151#define EEPROM_SIZE 32 // size of EEPROM to save persistent variables
5252#define ADR_NM_START_H 0
53- #define ADR_NM_END_H 4
54- #define ADR_NM_START_M 8
55- #define ADR_NM_END_M 12
56- #define ADR_BRIGHTNESS 16
57- #define ADR_MC_RED 20
58- #define ADR_MC_GREEN 22
59- #define ADR_MC_BLUE 24
53+ #define ADR_NM_END_H 1
54+ #define ADR_NM_START_M 2
55+ #define ADR_NM_END_M 3
56+ #define ADR_BRIGHTNESS 4
57+ #define ADR_MC_RED 5
58+ #define ADR_MC_GREEN 6
59+ #define ADR_MC_BLUE 7
60+ #define ADR_BRIGHTNESS_FRAME 10
61+ #define ADR_FRAMELIGHTACTIVE 11
6062#define ADR_STATE 26
6163#define ADR_NM_ACTIVATED 27
6264#define ADR_COLSHIFTSPEED 28
6567
6668
6769#define NEOPIXELPIN 5 // pin to which the NeoPixels are attached
70+ #define NEOPIXELPIN_FRAME 4 // pin to which the NeoPixels for the frame light are attached
6871#define BUTTONPIN 14 // pin to which the button is attached
6972#define LEFT 1
7073#define RIGHT 2
@@ -101,6 +104,8 @@ enum direction {right, left, up, down};
101104// height of the led matrix
102105#define HEIGHT 11
103106
107+ #define NUM_LEDS_FRAME_LIGHT 56
108+
104109// own datatype for state machine states
105110#define NUM_STATES 6
106111enum ClockState {st_clock, st_diclock, st_spiral, st_tetris, st_snake, st_pingpong};
@@ -149,6 +154,7 @@ Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(WIDTH, HEIGHT+1, NEOPIXELPIN,
149154 NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
150155 NEO_GRB + NEO_KHZ800);
151156
157+ Adafruit_NeoPixel backgroundLEDStrip = Adafruit_NeoPixel(NUM_LEDS_FRAME_LIGHT, NEOPIXELPIN_FRAME, NEO_GRB + NEO_KHZ800);
152158
153159// seven predefined colors24bit (green, red, yellow, purple, orange, lightgreen, blue)
154160const uint32_t colors24bit[NUM_COLORS] = {
@@ -161,6 +167,7 @@ const uint32_t colors24bit[NUM_COLORS] = {
161167 LEDMatrix::Color24bit (0 , 0 , 255 ) };
162168
163169uint8_t brightness = 40 ; // current brightness of leds
170+ uint8_t brightnessFrame = 40 ; // brightness of leds for frame light
164171bool animationDir = false ;
165172
166173// timestamp variables
@@ -198,6 +205,7 @@ uint8_t dynColorShiftPhase = 0; // stores the phase of the dynamic
198205uint8_t dynColorShiftSpeed = 1 ; // stores the speed of the dynamic color shift -> used to calc update period
199206bool hourAnimation = false ; // stores if the hour animation is active
200207uint32_t hourAnimationDuration = 18000 ; // stores the duration of the hour animation in seconds
208+ bool frameLightActive = false ; // stores if frame light is active
201209
202210// nightmode settings
203211uint8_t nightModeStartHour = 22 ;
@@ -228,6 +236,9 @@ void setup() {
228236 // configure button pin as input
229237 pinMode (BUTTONPIN, INPUT_PULLUP);
230238
239+ // init background LED strip
240+ backgroundLEDStrip.begin ();
241+
231242 // setup Matrix LED functions
232243 ledmatrix.setupMatrix ();
233244 ledmatrix.setCurrentLimit (CURRENT_LIMIT_LED);
@@ -463,6 +474,8 @@ void loop() {
463474 // periodically write colors to matrix
464475 if (millis () - lastAnimationStep > PERIOD_MATRIXUPDATE && !waitForTimeAfterReboot && (millis () - lastLEDdirect > TIMEOUT_LEDDIRECT)){
465476 ledmatrix.drawOnMatrixSmooth (filterFactor);
477+ if (frameLightActive && !nightMode) turnOnFrameLight (maincolor_clock);
478+ else turnOffFrameLight ();
466479 lastAnimationStep = millis ();
467480 }
468481
@@ -874,6 +887,8 @@ void loadCurrentStateFromEEPROM(){
874887 EEPROM.write (ADR_STATE, currentState);
875888 EEPROM.commit ();
876889 }
890+
891+ frameLightActive = EEPROM.read (ADR_FRAMELIGHTACTIVE);
877892}
878893
879894/* *
@@ -903,9 +918,13 @@ void loadNightmodeSettingsFromEEPROM()
903918void loadBrightnessSettingsFromEEPROM ()
904919{
905920 brightness = EEPROM.read (ADR_BRIGHTNESS);
921+ brightnessFrame = EEPROM.read (ADR_BRIGHTNESS_FRAME);
906922 if (brightness < 10 ) brightness = 10 ;
923+ if (brightnessFrame < 10 ) brightnessFrame = 10 ;
907924 logger.logString (" Brightness: " + String (brightness));
925+ logger.logString (" Brightness Frame: " + String (brightnessFrame));
908926 ledmatrix.setBrightness (brightness);
927+ backgroundLEDStrip.setBrightness (brightnessFrame);
909928}
910929
911930/* *
@@ -1004,24 +1023,29 @@ void handleCommand() {
10041023 nightModeEndMin = split (timestr, ' -' , 3 ).toInt ();
10051024 brightness = split (timestr, ' -' , 4 ).toInt ();
10061025 dynColorShiftSpeed = split (timestr, ' -' , 5 ).toInt ();
1026+ brightnessFrame = split (timestr, ' -' , 6 ).toInt ();
10071027 if (nightModeStartHour < 0 || nightModeStartHour > 23 ) nightModeStartHour = 22 ;
10081028 if (nightModeStartMin < 0 || nightModeStartMin > 59 ) nightModeStartMin = 0 ;
10091029 if (nightModeEndHour < 0 || nightModeEndHour > 23 ) nightModeEndHour = 7 ;
10101030 if (nightModeEndMin < 0 || nightModeEndMin > 59 ) nightModeEndMin = 0 ;
10111031 if (brightness < 10 ) brightness = 10 ;
1032+ if (brightnessFrame < 10 ) brightnessFrame = 10 ;
10121033 if (dynColorShiftSpeed == 0 ) dynColorShiftSpeed = 1 ;
10131034 EEPROM.write (ADR_NM_START_H, nightModeStartHour);
10141035 EEPROM.write (ADR_NM_START_M, nightModeStartMin);
10151036 EEPROM.write (ADR_NM_END_H, nightModeEndHour);
10161037 EEPROM.write (ADR_NM_END_M, nightModeEndMin);
10171038 EEPROM.write (ADR_BRIGHTNESS, brightness);
1039+ EEPROM.write (ADR_BRIGHTNESS_FRAME, brightnessFrame);
10181040 EEPROM.write (ADR_COLSHIFTSPEED, dynColorShiftSpeed);
10191041 EEPROM.commit ();
10201042 logger.logString (" Nightmode starts at: " + String (nightModeStartHour) + " :" + String (nightModeStartMin));
10211043 logger.logString (" Nightmode ends at: " + String (nightModeEndHour) + " :" + String (nightModeEndMin));
10221044 logger.logString (" Brightness: " + String (brightness));
1045+ logger.logString (" Brightness Frame: " + String (brightnessFrame));
10231046 logger.logString (" ColorShiftSpeed: " + String (dynColorShiftSpeed));
10241047 ledmatrix.setBrightness (brightness);
1048+ backgroundLEDStrip.setBrightness (brightnessFrame);
10251049 lastNightmodeCheck = millis () - PERIOD_NIGHTMODECHECK;
10261050 }
10271051 else if (server.argName (0 ) == " resetwifi" ){
@@ -1123,6 +1147,14 @@ void handleCommand() {
11231147 EEPROM.write (ADR_HOURANIMATION, hourAnimation);
11241148 EEPROM.commit ();
11251149 }
1150+ else if (server.argName (0 ) == " frameLight" ){
1151+ Serial.println (" FrameLight change via Webserver" );
1152+ String str = server.arg (0 );
1153+ if (str == " 1" ) frameLightActive = true ;
1154+ else frameLightActive = false ;
1155+ EEPROM.write (ADR_FRAMELIGHTACTIVE, frameLightActive);
1156+ EEPROM.commit ();
1157+ }
11261158 server.send (204 , " text/plain" , " No Content" ); // this page doesn't send back content --> 204
11271159}
11281160
@@ -1182,11 +1214,15 @@ void handleDataRequest() {
11821214 message += " ," ;
11831215 message += " \" brightness\" :\" " + String (brightness) + " \" " ;
11841216 message += " ," ;
1217+ message += " \" brightnessFrame\" :\" " + String (brightnessFrame) + " \" " ;
1218+ message += " ," ;
11851219 message += " \" colorshift\" :\" " + String (dynColorShiftActive) + " \" " ;
11861220 message += " ," ;
11871221 message += " \" colorshiftspeed\" :\" " + String (dynColorShiftSpeed) + " \" " ;
11881222 message += " ," ;
11891223 message += " \" houranimation\" :\" " + String (hourAnimation) + " \" " ;
1224+ message += " ," ;
1225+ message += " \" frameLight\" :\" " + String (frameLightActive) + " \" " ;
11901226 }
11911227 message += " }" ;
11921228 server.send (200 , " application/json" , message);
@@ -1207,3 +1243,22 @@ String leadingZero2Digit(int value){
12071243 msg += String (value);
12081244 return msg;
12091245}
1246+
1247+ /* *
1248+ * @brief Turn on the frame light with given color
1249+ *
1250+ * @param color
1251+ */
1252+ void turnOnFrameLight (uint32_t color){
1253+ backgroundLEDStrip.fill (color);
1254+ backgroundLEDStrip.show ();
1255+ }
1256+
1257+ /* *
1258+ * @brief Turn off the frame light
1259+ *
1260+ */
1261+ void turnOffFrameLight (){
1262+ backgroundLEDStrip.clear ();
1263+ backgroundLEDStrip.show ();
1264+ }
0 commit comments