#include <Arduino.h>
#include <TimerInterrupt_Generic.h>
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);
}
}
}
Comments