Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
Компоненты и материалы
| Arduino Nano R3 | 1 |
| NeoPixel лента (144 LED) | 1 |
| LCD 16x2 (белый на синем) с I2C модулем | 1 |
| RTC (Real Time Clock) | 1 |
| Тактильные кнопки 12мм (SparkFun) | 4 |
| Резистор 10 кОм | 3 |
| Резистор 475 Ом | 1 |
| Диод 1N4007 | 3 |
| DC-DC понижающий преобразователь (регулируемый) | 1 |
| Рамка для фото RIBBA (IKEA) | 1 |
| Корпус Gewiss 150×110 мм | 1 |
| Алюминиевые полоски 230×10×1 мм (для сетки) | 1 |
О проекте
Мой увлечение Arduino-часами привели к созданию «Word Clock» (словесных часов). Живу в Италии — сделал на итальянском. Вдохновился туториалом «Word Clock Javelin», внес мелкие правки — и вот они, «Часы Италии»!
Помимо времени на итальянском, добавил поздравления с днями рождения семьи (включая кота). Корпус — рамка IKEA RIBBA, внутренности — из подручных материалов:


Экран (матрица букв) нарисован в Inkscape. Панель 12×12 букв, поле 200 мм. Нет 3D-принтера — сетку сделал из алюминиевых полосок, изолировал контакты LED пено-прокладкой (также разделяет свет).
Электрическая схема





- Время держит RTC.
- Настройка времени: 3 кнопки (P1, P2, P3) и 16×2 LCD (см. проект «Clock Set Date Time»). Кнопки подключены через pull-down схему.
- LCD светится только при настройке — джампер заменён кнопкой.
- Диод D1 — защита от переполюсовки питания.
- Диод D2 — отключает питание NeoPixel при перепрошивке (защита от перегрузки).
- Диод D3 — понижает напряжение до 5В для NeoPixel.
Приложены: принципиальная схема, Fritzing-файл, топология печатной платы.
Матрица LED




Лента подключена зигзагом: слева направо вверху, потом справа налево ниже, и т.д.
Библиотеки Arduino
- RTC
- LiquidCrystal_I2C
- Adafruit_NeoPixel
Пояснение кода
Код разбит на 5 основных частей:
DisplayDateTime— вывод даты/времени на LCDHourClock— отображение часов на матрицеMinuteClock— отображение минутAuguri— поздравления с днями рожденияpaintWord(arrWord[], color)— сердцевина: зажигает заданные LED заданным цветом
Для точности минут добавлены индикаторы 1,2,3,4 (последние 4 минуты в 5-минутном интервале).
Пример: «SONO LE ORE DIECI E VENTI 4» = 10:24 (10:20 + 4 мин), «SONO LE DIECI MENO QUINDICI 2» = 09:47 (09:45 + 2 мин).
Сборка


- Разобрать рамку, вымыть стекло.
- Вставить печать на ацетате (прозрачная плёнка).
- Вставить бумажную печать.
- Вставить алюминиевую сетку.
- Вставить панель с LED.
- Приклеить фанерку чуть крупнее коробки управления.
- Закрутить коробку саморезами.
Критично точно совместить две печати (плёнку и бумагу)!
Место установки

Висят в гостиной — смотрятся отлично.
Код
Italian WordClock (Arduino)
/* :Project: WordClock :Author: Tiziano Bianchettin :Date: 25/09/2016 ... */
#include
#include
#include
#include
#define PIN 9
#define NUM_LEDS 144
#define GIORNO 255
#define SERA 25
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
int intBrightness;
uint32_t Red = strip.Color(255,0,0);
uint32_t Green = strip.Color(0,255,0);
uint32_t Blue = strip.Color(0,0,255);
uint32_t White = strip.Color(255,255,255);
uint32_t Yellow = strip.Color(255,255,0);
uint32_t Purple = strip.Color(60,0,255);
uint32_t Off = strip.Color(0,0,0);
LiquidCrystal_I2C lcd(0x27,16,2);
RTC_DS1307 RTC;
int P1=6, P2=7, P3=8;
int oraagg, minagg, annoagg, meseagg, dayagg, menu=0, ora;
// Массивы индексов LED для каждого слова (SONO, UNA, DUE, ... AUGURI, SIMONE, ... E, MENO, VENTI, ...)
// ... (полные массивы в исходнике)
void setup() {
strip.begin(); strip.show();
lcd.begin(); lcd.backlight(); lcd.clear();
pinMode(P1,INPUT); pinMode(P2,INPUT); pinMode(P3,INPUT);
Serial.begin(9600); Wire.begin(); RTC.begin();
if (!RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); }
}
void loop() {
if(digitalRead(P1)) { menu++; }
if(menu==0) {
DisplayDateTime();
DateTime now = RTC.now();
intBrightness = (now.hour()>=19 || now.hour()<7) ? SERA : GIORNO;
strip.setBrightness(intBrightness);
int timeMin = now.minute();
int modMin = timeMin % 5;
// Мигание слова SONO и индикаторов минут 1-4 разными цветами
// ...
HourClock(); MinuteClock(); Auguri(); strip.show();
}
// Меню настройки времени: menu 1-6 (час, мин, год, месяц, день, сохранение)
// ...
delay(100);
}
// Функции DisplayDateTime, DisplaySetHour, ..., HourClock, MinuteClock, Auguri, paintWord
// ... (полный код во вложении)
Полный скетч во вложении (файл Italian WordClock).
3D-модели и схемы
Векторный рисунок для печати (SVG)
wordklock_aWvuaZRw4N.svg
Схемы (Fritzing и фото)
wordklock_JBoZPYrsYr.fzz (Fritzing project)
Производственный процесс
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Слово-часы (Word Clock) на Arduino — DIY-часы с текстовой индикацией времени
- Точные словесные часы: отображение времени в словах с точностью до минуты
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Набор USB-MIDI адаптера для Arduino Micro / Leonardo — полный список деталей
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Точный тест времени реакции на Arduino UNO