Часы на светодиодном RGB кольце (WS2812)(Arduino)

RGB (на контроллере WS2812) кольца бывают разного размера с разным кол-вом светодиодов, для создания часов было выбрано кольцо с 12 светодиодами.

Считывать время с часов очень просто, красное свечение светодиода обозначают часы, синее минуты, а зеленое секунды. Так как RGB кольцо имеет только 12 светодиодов, то показания минут и секунд кратно пяти, а часов 12-и. При совпадении положения минут, секунд или часов в одном светодиоде горят одновременно 2 или три цвета.

#include <Adafruit_NeoPixel.h> // https://github.com/adafruit/Adafruit_NeoPixel.git
#include <Wire.h> 
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
 DS3231 clock;
 RTCDateTime DateTime;
 Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, 2, NEO_GRB + NEO_KHZ400);// 4 трека, D2
 
byte i,s,m,h,mm,sm,sh,mh;
unsigned long t;
 
void setup(){
  strip.begin();Wire.begin(); clock.begin();
// clock.setDateTime(__DATE__, __TIME__);
}
 
void loop(){ 
    DateTime=clock.getDateTime();
    s = DateTime.second/5;
    m = DateTime.minute/5;
    h = DateTime.hour;
    if(h>11){h=h-12;}
    if(s==m){sm=10;}else{sm=0;}
    if(s==h){sh=10;}else{sh=0;}
    if(m==h){mh=10;}else{mh=0;}
 
    if(s==0){strip.setPixelColor(11, strip.Color(0, 0, 0));}
    else{strip.setPixelColor(s-1, strip.Color(0, 0, 0)); }
    if(m==0){strip.setPixelColor(11, strip.Color(0, 0, 0));}
    else{strip.setPixelColor(m-1, strip.Color(0, 0, 0)); }
    if(h==0){strip.setPixelColor(11, strip.Color(0, 0, 0));}
    else{strip.setPixelColor(h-1, strip.Color(0, 0, 0)); }
    strip.setPixelColor(s, strip.Color(0, 10, 0));
    strip.setPixelColor(m, strip.Color(0, sm, 10));
    strip.setPixelColor(h, strip.Color(10, sh, mh));
    strip.show();
}

RGB кольцо на контроллере W2812 питается от напряжения 5 В, выход D2 Arduino подключается ко входу DI светодиодного кольца. В качестве источника точного времени используются часы реального времени DS3231.

Так же в центр светодиодного кольца можно добавить индикатор TM1637 часового типа (с двумя точками в центре) и выводить время (часы и минуты).

 

#include <Adafruit_NeoPixel.h>           // https://github.com/adafruit/Adafruit_NeoPixel.git
#include <Wire.h>
#include <STM32_TM1637.h>                // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip
#include <DS3231.h>                      //https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
 DS3231 clock;
 RTCDateTime DateTime;
 STM32_TM1637 tm(4,3);// CLK, DIO
 Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, 2, NEO_GRB + NEO_KHZ400);// 4 трека, D2
 
byte i,s,m,h,mm,sm,sh,mh;
unsigned long t;
 
void setup(){
  pinMode(5,INPUT);
  strip.begin();Wire.begin(); clock.begin();
  tm.brig(5);
  clock.setOutput(DS3231_1HZ);
// clock.setDateTime(__DATE__, __TIME__);
}
 
void loop(){ 
    DateTime=clock.getDateTime();
    s = DateTime.second/5;
    m = DateTime.minute/5;
    h = DateTime.hour;
    if(h>11){h=h-12;}
    if(s==m){sm=10;}else{sm=0;}
    if(s==h){sh=10;}else{sh=0;}
    if(m==h){mh=10;}else{mh=0;}
 
    if(s==0){strip.setPixelColor(11, strip.Color(0, 0, 0));}
    else{strip.setPixelColor(s-1, strip.Color(0, 0, 0)); }
    if(m==0){strip.setPixelColor(11, strip.Color(0, 0, 0));}
    else{strip.setPixelColor(m-1, strip.Color(0, 0, 0)); }
    if(h==0){strip.setPixelColor(11, strip.Color(0, 0, 0));}
    else{strip.setPixelColor(h-1, strip.Color(0, 0, 0)); }
    strip.setPixelColor(s, strip.Color(0, 10, 0));
    strip.setPixelColor(m, strip.Color(0, sm, 10));
    strip.setPixelColor(h, strip.Color(10, sh, mh));
    strip.show();
    tm.print_time(DateTime.hour*100+DateTime.minute, digitalRead(5));
   // delay(500);
}

Для мигания двоеточия в TM1637, необходимо выход SQW DS3231 подключить ко входу Arduino D5.

Дополнительные материалы:

Добавить комментарий

Войти с помощью: