uwezi icon

20220329_berlin_clock

uwezi | PRO | 03/28/22 11:43:07 PM UTC | 0 ⭐ | 1665 👁️ | Never ⏰ | []
Arduino |

2.23 KB

|

None

|

0 👍

/

0 👎

#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