Ка вы помните я уже делал часы на адресных светодиодах и Arduino. Если вы не в курсе смотрите мой проект: Классные самодельные настенные светодиодные часы на arduino.
Продумать реализацию часов на светодиодах можно много. И сделанных примеров в интернете большое количество. Недавно я нашел примеры реализации часов на 60 светодиодах. Вот некоторый из них:
Пример 1. Часы на Arduino, модуле реального времени RTC 1307 и светодиодной ленте WS2812b.
В качестве корпуса авто использует уже готовые стрелочные часы. Плюс данного корпуса в том, что кроме часового циферблата размечены еще и минутны. Светодиодная лента приклеена на корпус по кругу. Отверстия для стрелок закрыто светодиодом.
Вот такие симпатичные часы получаются и за небольшие деньги. Хоть вешай их себе в гостиную. Но для этого нужно подготовить стенку, чтобы часы гармонично вписывались. Интересно обои под покраску, цена данного удовольствия какая?
Код проекта.
/*
This is my sketch for a NEO PIXEL ring LED clock.
*/
// Includes below:
#include <Wire.h>
#include <stdio.h>
#include <Adafruit_NeoPixel.h>
#include <RTClib.h>
RTC_DS1307 RTC; // Create RTC object
// Define things here and set things up.
#define LED_Loop 60
#define PIN 6 // This is defining which Arduino pin is driving the Pixel ring used pin 6 but any digital will work
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_Loop, PIN, NEO_GRB + NEO_KHZ800);
int LED[LED_Loop];
int THREE = (LED_Loop / 4);
int SIX = (THREE * 2);
int NINE = (THREE * 3);
int TWELVE = (LED_Loop-1);
int HR_Fade = 7;
int MN_Fade;
long HR_Colour;
long SE_Colour = 0x000055;
long THIS_LED;
int Led_Flag;
int argh;
// trying this way to get colours working.
int HR_R;
int HR_G;
int HR_B;
int HR1_R = 0x55;
int HR1_G = 0;
int HR1_B = 0;
int HR2_R = 0x0D;
int HR2_G = 0;
int HR2_B = 0x0D;
int MN_R = 0;
int MN_G = 33;
int MN_B = 0;
//int SE_R = 0;
//int SE_G = 0;
//int SE_B = 0x55;
int hour_led;
int minute_led;
int second_led;
int new_minute;
//----------------------------- Set up here -----------------------------//
void setup()
{
// put your setup code here, to run once:
delay(2000); // This is just to give you time to open the window and watch.
Serial.begin(9600);
Serial.println("-------------------------------");
Serial.println("Setting up");
Wire.begin();
strip.begin();
strip.show(); // Initialize all pixels to 'off'
if (! RTC.isrunning())
{
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Serial.println("Done setting up");
Serial.println("-------------------------------");
}
//----------------------------- MAIN LOOP here -----------------------------//
void loop()
{
// Get time
DateTime now = RTC.now();
// 24 hour time change colour of hour hand.
int hr = now.hour();
if (hr < 12)
{
//HR_Colour = HR_Colour1;
HR_R = HR1_R;
HR_G = HR1_G;
HR_B = HR1_B;
}
else
{
//HR_Colour = HR_Colour2;
HR_R = HR2_R;
HR_G = HR2_G;
HR_B = HR2_B;
}
int mins = now.minute(); // This line is only incase any maths had to be done.
second_led = now.second();
//
// calculate leds
hour_led = (((LED_Loop/12) * hr) + (mins / (LED_Loop/5)))%LED_Loop;
if (hour_led == 60)
{
hour_led = 59;
}
minute_led = mins;
// Debug code below
//
//------------------------------------------//
/*
Serial.print(now.year());
Serial.print('/');
Serial.print(now.month());
Serial.print('/');
Serial.print(now.day());
Serial.print(' ');
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.print(now.second());
Serial.println();
*/
//------------------------------------------//
/*
Serial.println("=========================");
Serial.println(hr);
Serial.println(mins);
Serial.println("-------------------------");
Serial.println(hour_led);
Serial.println(minute_led);
Serial.println(second_led);
*/
//------------------------------------------//
//
// Show LEDs ------------------ Main loop here -----------------
// Keep this at the top so it doesn't mess up any other settings when LEDs are
// turned on.
strip.setPixelColor(second_led-1,SE_Colour/2);
strip.setPixelColor(second_led-2,SE_Colour/4);
strip.setPixelColor(second_led-3,SE_Colour/8);
strip.setPixelColor(second_led-4,SE_Colour/16);
strip.setPixelColor(second_led-5,0);
//
// show THREE, SIX, NINE and TWELVE
//
strip.setPixelColor (THREE, 0x050505);
strip.setPixelColor (SIX, 0x050505);
strip.setPixelColor (NINE, 0x050505);
strip.setPixelColor (TWELVE, 0x050505);
//
// Now start setting LEDs below here.
//
if (second_led == 0)
{
strip.setPixelColor(LED_Loop-1, SE_Colour/2);
strip.setPixelColor(LED_Loop-2,SE_Colour/4);
strip.setPixelColor(LED_Loop-3,SE_Colour/8);
strip.setPixelColor(LED_Loop-4,SE_Colour/16);
strip.setPixelColor(LED_Loop-5,0);
new_minute = 1;
}
if (second_led == 1)
{
strip.setPixelColor(second_led-1, SE_Colour/2);
strip.setPixelColor(LED_Loop-1, SE_Colour/4);
strip.setPixelColor(LED_Loop-2,SE_Colour/8);
strip.setPixelColor(LED_Loop-3,SE_Colour/16);
strip.setPixelColor(LED_Loop-4,0);
}
if (second_led == 2)
{
strip.setPixelColor(second_led-1, SE_Colour/2);
strip.setPixelColor(second_led-2, SE_Colour/4);
strip.setPixelColor(LED_Loop-1, SE_Colour/8);
strip.setPixelColor(LED_Loop-2,SE_Colour/16);
strip.setPixelColor(LED_Loop-3,0);
}
if (second_led == 3)
{
strip.setPixelColor(second_led-1, SE_Colour/2);
strip.setPixelColor(second_led-2, SE_Colour/4);
strip.setPixelColor(second_led-3, SE_Colour/8);
strip.setPixelColor(LED_Loop-1,SE_Colour/16);
strip.setPixelColor(LED_Loop-2,0);
}
if (second_led == 4)
{
strip.setPixelColor(second_led-1, SE_Colour/2);
strip.setPixelColor(second_led-2, SE_Colour/4);
strip.setPixelColor(second_led-3, SE_Colour/8);
strip.setPixelColor(second_led-4,SE_Colour/16);
strip.setPixelColor(LED_Loop-1,0);
}
/*
if (Led_Flag == 0)
{
//
Led_Flag = 1;
THIS_LED = strip.getPixelColor(second_led);
// This is where I am at.
Serial.print(second_led);
Serial.print(" ");
Serial.println(THIS_LED);
}
*/
/*---------------- Draw SECOND HAND on clock ----------------*/
strip.setPixelColor(second_led,SE_Colour);
// strip.setPixelColor(second_led,SE_Colour+THIS_LED);
// strip.setPixelColor(second_led-1,THIS_LED);
if (new_minute == 1)
{
//new_minute = 0;
// strip.setPixelColor(minute_led-1,MN_Colour/50);
}
/*---------------- Draw MINUTE HAND on clock ----------------*/
//strip.setPixelColor(minute_led,MN_Colour);
// MN_Fade for fading.
strip.setPixelColor(minute_led,MN_R,MN_G,MN_B);
strip.setPixelColor(minute_led+1, MN_R, (MN_G * (second_led*10/6)/100) , MN_B);
strip.setPixelColor(minute_led-1, MN_R, (MN_G * (100-(second_led*10/6))/100) , MN_B);
/*---------------- Draw HOUR HAND on clock ----------------*/
strip.setPixelColor(hour_led,HR_R,HR_G,HR_B);
//strip.setPixelColor((hour_led-1)%LED_Loop,HR_R/HR_Fade,HR_G,HR_B/HR_Fade);
//strip.setPixelColor((hour_led+1)%LED_Loop,HR_R/HR_Fade,HR_G,HR_B/HR_Fade);
/*
strip.setPixelColor(hour_led,HR_Colour);
strip.setPixelColor((hour_led-1)%LED_Loop,HR_Colour);
strip.setPixelColor((hour_led+1)%LED_Loop,HR_Colour);
*/
if (second_led > minute_led)
{
new_minute = 0;
}
/*
if (second_led != argh)
{
Led_Flag = 0;
argh = second_led;
}
*/
//
// show alarms
//
strip.show();
delay(400);
// ------------------ End of Main loop here -----------------
}
Код я не проверял на работоспособность. Если у вас возникнут трудности пишите в комментарии.
Пример 2. Часы на Arduino, модуле реального времени RTC 1307 и кольце светодиодов WS2812b.
В данном примере автор купил готовое кольцо из 60 светодиодов WS2812b. Циферблат нарисовал самостоятельно, разместив его в центре кольца.
В связи с тем, что кольцо было куплено данные часы наварят ли получаться дешевле. А может даже и дороже по сравнению с первый вариантом. Но зато тут меньше проблем с подбором корпуса и светодиодной ленты.
Что понравилось мне в данном пример, это то, что код всего лишь 70 строчек.
#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define PIXEL 60
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS1307 RTC; // Establish clock object
DateTime Clock; // Holds current clock time
byte hourval, minuteval, secondval;
void setup() {
Serial.begin(9600);
Wire.begin(); // Begin I2C
RTC.begin(); // begin clock
if (! RTC.isrunning()) {
// Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
}
// RTC.adjust(DateTime(__DATE__, __TIME__));
strip.begin();
strip.show(); // Initialize all pixels to 'off'
strip.setBrightness(20);
}
void loop() {
Clock = RTC.now(); // get the RTC time
secondval = Clock.second(); // get seconds
minuteval = Clock.minute(); // get minutes
hourval = Clock.hour(); // get hours
if(hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
hourval = (hourval*60 + minuteval) / 12;
strip.setPixelColor(hourval, 0x008080);strip.setPixelColor(hourval-1, 0x004040);strip.setPixelColor(hourval+1, 0x004040);
// strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
strip.setPixelColor(minuteval, 0x800080);
// strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
strip.setPixelColor(secondval, 0x808000);//strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
strip.show();
strip.setPixelColor(hourval, 0x000000);strip.setPixelColor(hourval-1, 0x000000);strip.setPixelColor(hourval+1, 0x000000);
strip.setPixelColor(hourval-2, 0x000000);strip.setPixelColor(hourval+2, 0x000000);
strip.setPixelColor(minuteval, 0x000000);strip.setPixelColor(minuteval-1, 0x000000);strip.setPixelColor(minuteval+1, 0x000000);
strip.setPixelColor(secondval, 0x000000);//strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);
delay(25);
/*
Serial.print(hourval, DEC);
Serial.print(':');
Serial.print(minuteval, DEC);
Serial.print(':');
Serial.println(secondval, DEC);
*/
}
Этот пример можно пробовать реализовать в Digispark, в связи с тем что там очень мало памяти под программу.
Появились вопросы. Не стесняйся задавай из в комментарии.
Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.
Спасибо за внимание!
Понравилась статья? Поделитесь ею с друзьями:
Комментарии
Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.