Наверняка многие из вас смотрели блокбастер “Мстители: война бесконечности”. Тем, кому данный фильм понравился, надеюсь, понравится и представленный в данной статье проект электронных часов на основе платы Arduino Nano. Но также он может понравиться и более широкому кругу энтузиастов электроники.
Решил перевести данный проект с хаба проектов Arduino (ссылка на оригинал приведена в конце статьи) поскольку внешний вид данных часов показался мне очень привлекательным и футуристическим. Казалось бы, использованы такие простые материалы как зеркало и адресная светодиодная лента, а как получилось здорово. Описания у проекта почти никакого нет, но зато весь процесс изготовления данных часов бесконечности очень подробно показан на видео, приведенном в конце статьи. Дословно с источника название данного проекта переводится как “бесконечные зеркальные часы” (Infinity mirror clock), но мне кажется, что “часы бесконечности” гораздо лучше звучит и более наглядно характеризует данный проект.
Также на нашем сайте вы можете посмотреть и другие проекты часов на основе платы Arduino:
- GPS часы;
- часы реального времени с будильником на основе Arduino;
- бинарные часы на светодиодах с использованием Arduino;
- часы на Arduino и 4-х разрядном семисегментном индикаторе;
- умные часы (Smart Watch) на основе Arduino, OLED дисплея и смартфона.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Модуль часов реального времени DS1302 (купить на AliExpress).
- Резистор 10 кОм – 3 шт. (купить на AliExpress).
- Адресная светодиодная лента.
Схема проекта
Схема часов бесконечности на основе платы Arduino Nano представлена на следующем рисунке.
Как видите, схема достаточно проста. К плате Arduino необходимо подключить только модуль часов реального времени и адресную светодиодную ленту.
Сборка конструкции проекта
Процесс сборки подробно показан на видео в конце статьи, а здесь приведены фотографии ключевых элементов конструкции проекта.
Защитный кожух:
Обод, на который крепится адресная светодиодная лента:
Собранный корпус часов:
Исходный код программы (скетча)
В коде программы нам необходимо считывать время с модуля часов реального времени и отображать его с помощью адресной светодиодной ленты. Более подробно о подключении такой ленты к плате Arduino вы можете прочитать в этой статье.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
#include <Adafruit_NeoPixel.h> #include <stdio.h> #include <DS1302.h> #ifdef __AVR__ #include <avr/power.h> #endif #define PIN 8 #define NUMPIXELS 60 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); namespace { byte ysaat; byte ydak; byte saat; byte dak; byte sn; byte kontrol=0; const int kCePin = 5; // Chip Enable const int kIoPin = 6; // Input/Output const int kSclkPin = 7; // Serial Clock DS1302 rtc(kCePin, kIoPin, kSclkPin); } void printTime() { // считываем время с модуля часов реального времени Time t = rtc.time(); saat=t.hr; dak=t.min; sn=t.sec; if(saat>=12){saat=saat-12;} pixels.setPixelColor(5*saat, pixels.Color(25,25,255)); pixels.setPixelColor(dak, pixels.Color(0,200,10)); pixels.setPixelColor(sn, pixels.Color(255,0,0)); pixels.show(); //Serial.println(t.sec); //pixels.setPixelColor(t.hr, pixels.Color(0,0,0)); //pixels.setPixelColor(t.sec-1, pixels.Color(0,0,0)); pixels.show(); if(sn==0) { pixels.setPixelColor(dak-1, pixels.Color(0,0,0)); pixels.setPixelColor(dak, pixels.Color(0,200,10)); pixels.show(); for(int i=1;i<60;i++) { pixels.setPixelColor(i, pixels.Color(0,0,0)); } } if(dak==0) { pixels.setPixelColor(59, pixels.Color(0,0,0)); } } void animasyon() { colorWipe(strip.Color(255, 0, 0), 25); // Red colorWipe(strip.Color(0, 255, 0), 25); // Green colorWipe(strip.Color(0, 0, 255), 25); theaterChase(strip.Color(127, 127, 127), 50); // White theaterChase(strip.Color(127, 0, 0), 50); // Red theaterChase(strip.Color(0, 0, 127), 50); for(int i=1;i<60;i++) { pixels.setPixelColor(i, pixels.Color(0,0,0)); } } void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); } } void theaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //do 10 cycles of chasing for (int q=0; q < 3; q++) { for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //зажигаем каждый 3-й пиксел в ленте } strip.show(); delay(wait); for (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); // выключаем каждый 3-й пиксел в ленте } } } } void yenisaat() { //kontrol=0; saat=ysaat; dak=ydak; Time t(2018, 2, 23,ysaat, ydak, 0, Time::kFriday); rtc.time(t); } int clockSet =10; int up=11; int down=12; void setup() { Serial.begin(9600); #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif strip.begin(); strip.show(); pixels.begin(); pinMode( clockSet,INPUT); rtc.writeProtect(false); rtc.halt(false); } void loop() { if (kontrol==1) { pixels.setPixelColor(5*ysaat, pixels.Color(25,25,255)); pixels.show(); delay(100); pixels.setPixelColor(5*ysaat, pixels.Color(0,0,0)); pixels.show(); delay(100); if (digitalRead(up)==HIGH) { ysaat++; while(digitalRead(up)==HIGH); if(ysaat==12){ysaat=0;} } if (digitalRead(down)==HIGH) { ysaat--; while(digitalRead(down)==HIGH); if(ysaat==255){ysaat=11;} } pixels.setPixelColor(5*ysaat, pixels.Color(25,25,255)); pixels.show(); delay(100); pixels.setPixelColor(5*ysaat, pixels.Color(0,0,0)); pixels.show(); delay(100); yenisaat(); if(digitalRead(clockSet)==HIGH) { while(digitalRead(clockSet)==HIGH) { pixels.setPixelColor(kontrol, pixels.Color(255,255,255)); pixels.show(); } pixels.setPixelColor(kontrol, pixels.Color(0,0,0)); pixels.show(); kontrol++; ysaat=saat;ydak=dak;} } if (kontrol==2) { if(digitalRead(clockSet)==HIGH) { kontrol++; while(digitalRead(clockSet)==HIGH) { } ysaat=saat;ydak=dak; } if (digitalRead(up)==HIGH) { ydak++; while(digitalRead(up)==HIGH); if(ydak==60){ysaat=0;} } if (digitalRead(down)==HIGH) { ydak--; while(digitalRead(down)==HIGH); if(ydak==255){ydak=59;} } pixels.setPixelColor(ydak, pixels.Color(0,205,10)); pixels.show(); yenisaat(); delay(100); pixels.setPixelColor(ydak, pixels.Color(0,0,0)); pixels.show(); delay(100); } if (kontrol==3) { kontrol=0; yenisaat(); } while (kontrol==0) { if(digitalRead(up)==HIGH) { animasyon (); } if(digitalRead(clockSet)==HIGH) { kontrol++; while(digitalRead(clockSet)==HIGH); ysaat=saat;ydak=dak;} printTime(); } } |
Добрый вечер. На схеме не понятно, куда подключается светодиодная лента?
Добрый день. Ее сигнальный контакт подключается к цифровому контакту 8 платы Ардуино, это хорошо видно по программе. И в представленном видео это тоже видно
Не очень понятно с корпусом часов ,Там применено 2 стекла или зеркало со стеклом .В Начале видео видно что циферблат полностью прозрачный ,но когда показана сборка то первое стекло к которому ставится лента ,похоже зеркало ,так что на самом деле
К сожалению, с этим вопросом не могу подсказать, я же эту статью только перевел, лично этот проект не собирал
Здравствуйте, скажите а можно выключить "шлейф" за секундной стрелкой? Что-бы просто светился один светодиод секундной стрелки ...
Добрый день. Точно не знаю, к сожалению, потому что не собирал данный проект но попробуйте поизменять по одному циклы где i изменяется от 1 до 60 - измените 60 на 2, так вы будете зажигать всего один пиксел
Здравствуйте .Можете ли вы заменить цвета отображения -часы на красный =минуты на -зеленый =секунды на синий?
Добрый вечер. Для смены цветов на нужные вам измените параметры цвета в функциях pixels.Color в 38, 39 и 40 строках программы
Спасибо
Надеюсь у вас получится собрать данный проект
Собрал на проводках-поменял назначения СД -работает даже в проте и к стати добил ваш градусник https://microkontroller.ru/arduino-projects/komnatnyj-termometr-na-arduino-nano/ теперь работает ,но переключение эффектов глючит -не стал добиваться нормальной работы .
Я рад что у вас получилось