#include #include struct charlie_t { uint8_t anode; uint8_t cathode; uint8_t value; }; volatile charlie_t LEDs[30] = { { 12, 13, 1}, // top 0 { 15, 16, 1}, // 1m 1 { 16, 15, 1}, // 2m 2 { 15, 5, 1}, // 3m 3 { 5, 15, 1}, // 4m 4 { 13, 5, 1}, // 5m 5 { 5, 13, 1}, // 10m 6 { 13, 16, 1}, // 15m 7 { 16, 13, 1}, // 20m 8 { 13, 15, 1}, // 25m 9 { 15, 13, 1}, // 30m 10 { 13, 14, 1}, // 35m 11 { 14, 13, 1}, // 40m 12 { 15, 14, 1}, // 45m 13 { 14, 15, 1}, // 50m 14 { 13, 12, 1}, // 55m 15 { 12, 16, 1}, // 1h 16 { 16, 12, 1}, // 2h 17 { 12, 5, 1}, // 3h 18 { 5, 12, 1}, // 4h 19 { 12, 14, 1}, // 5h 20 { 14, 12, 1}, // 10h 21 { 12, 15, 1}, // 15h 22 { 15, 12, 1}, // 20h 23 { 14, 16, 1}, { 16, 14, 1}, { 14, 5, 1}, { 5, 14, 1}, { 16, 5, 1}, { 5, 16, 1} }; void IRAM_ATTR TimerHandler() { static uint8_t i=0; // switch off current LED digitalWrite(LEDs[i].anode, LOW); pinMode(LEDs[i].anode, INPUT); pinMode(LEDs[i].cathode, INPUT); i++; i %= 24; if (LEDs[i].value == 1) { pinMode(LEDs[i].anode, OUTPUT); pinMode(LEDs[i].cathode, OUTPUT); digitalWrite(LEDs[i].anode, HIGH); digitalWrite(LEDs[i].cathode, LOW); } } void clearLEDs() { for (uint8_t i = 0; i < 24; i++) { LEDs[i].value = 0; } } // Init ESP8266 timer 1 ESP8266Timer ITimer; void setup() { clearLEDs(); Serial.begin(115200); // Interval in microsecs ITimer.attachInterruptInterval(500, TimerHandler); } void minutes(uint8_t min) { for (uint8_t i = 0; i < (min / 5); i++) { LEDs[5+i].value = 1; } for (uint8_t i = 0; i < (min % 5); i++) { LEDs[1+i].value = 1; } } void hours(uint8_t hrs) { for (uint8_t i = 0; i < (hrs / 5); i++) { LEDs[20+i].value = 1; } for (uint8_t i = 0; i < (hrs % 5); i++) { LEDs[16+i].value = 1; } } void loop() { uint8_t h, m; for (h=0; h<24; h++) { for (m=0; m<60; m++) { Serial.printf("%02d:%02d\r\n", h, m); clearLEDs(); minutes(m); hours(h); delay(50); } } }