Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Итальянские часы со словами

Компоненты и расходные материалы

Arduino Nano R3
× 1
полоса NeoPixel
144
× 1
Стандартный ЖК-экран Adafruit - 16x2, белый на синем
с модулем I2C
× 1
Часы реального времени (RTC)
× 1
Кнопочный переключатель SparkFun, 12 мм
× 4
Резистор 10 кОм
× 3
Резистор 475 Ом
× 1
1N4007 - высоковольтный диод с высоким номинальным током
× 3
Регулируемый понижающий преобразователь постоянного тока
× 1
Настенный каркас RIBBA (Ikea)
× 1
Крышка коробки Gewiss 150 x 110
× 1
алюминиевые полосы 230 мм x 10 мм x 1 мм
× 1

Об этом проекте

Моя страсть к часам Arduino привела меня к созданию «Word Clock», так как я живу в Италии, я говорил по-итальянски. На реализацию проекта меня вдохновил учебник «Word Clock Javelin», я внес несколько небольших изменений ... и вот для вас «Word Clock of Italy»!

В дополнение к «часам» на итальянском я хотел добавить дни рождения моей семьи (включая кошку). Для построения «каркаса» я использовал уже сделанный IKEA, а для внутренних изменений использовал материал, который был у меня дома:

Для реализации на экране будет показан узор, нарисованный в Inkscape.

Моя панель имеет размеры 12 x 12 букв и занимает площадь 200 мм. Поскольку у меня нет 3D-принтера, я сделал сетку из алюминиевых полос и изолировал контакт светодиода с помощью липкой губки, это также служило для изоляции света.

Электронная схема

Чтобы сохранить время, я использовал RTC .

Чтобы настроить время, я добавил кнопки (P1, P2, P3) и дисплей 16 x 2 (см. Также проект «Clock Set Date Time»). Как видно из схемы подключения, кнопки подключаются к Arduino через выпадающее меню . цепь.

Так как дисплей служит только для регулировки времени, я заменил перемычку на кнопку . , поступая так, он освещает только свое использование. Диод D1 служит для защиты от обратной полярности.

Диод D2 служит для того, чтобы не запитывать неопиксельную полоску, когда по какой-либо причине мы должны изменить скетч Arduino (слишком большой ток может его повредить). Диод D3 служит для вывода на 5 вольт напряжения Neopixel.

Прилагаю принципиальную схему, схему Фритзинга, макет печатной платы.

Матрица

Чтобы реализовать матрицу, я соединил различные полоски, как на картинке. Зигзагообразно сверху слева, чтобы спуститься.

Библиотеки Arduino

  • RTC
  • LiquidCrystal_I2C
  • Adafruit_NeoPixel

Пояснение к коду

Код разделен на 5 основных частей:

  • «DisplayDateTime»:отображает дату и время на ЖК-дисплее.
  • «HourClock»:отображает часы на панели.
  • «MinuteClock»:отображает минуты на панели.
  • "Авгури":С днем ​​рождения!
  • «Void paintWord (arrWord int [], uint32_t intColor)» - это сердце кода для включения неопикселя, «arrWord int []» - светодиоды, которые должны гореть, «uint32_t intColor» - их цвет

Чтобы получить более точные часы, я добавил числа 1, 2, 3, 4, соответствующие прогрессивным минутам.

Пример :«SONO LE ORE DIECI E VENTI 4» означает 10:24 (10:20 + 00:04), «SONO LE DIECI MENO QUINDICI 2» означает 09:47 (09:45 + 00:02)

Сборка

  • Откройте раму и хорошо очистите стекло.
  • Вставить печать из ацетата
  • Вставьте бумагу для печати. ​​
  • Вставить сетку
  • Вставьте панель со светодиодами.
  • Вставьте кусок фанеры размером чуть больше блока управления.
  • Закрепите блок управления саморезами.

Обратите особое внимание на выравнивание двух отпечатков

Расположение

Поставил в гостиной назад, чтобы она выглядела хорошо.

Код

  • Итальянские WordClock
Итальянские WordClock Arduino
 / *:Проект:WordClock:Автор:Тициано Бьянчеттин:Дата:25.09.2016:Редакция:1:Лицензия:Public Domainthanks to:http://www.instructables.com/id/Javelins-Word-Clock / http://arduinoenonsolo.blogspot.it/2012/12/orologio-con-arduino-e-il-ds1307.html http://www.mauroalfieri.it/ http://www.danielealberti.it/ http://www.maffucci.it/ Мой профессор лаборатории электроники "Перито Карли" * /// ************ библиотеки ************** // # include  #include  #include  #include  // *********** neopixel ********* ******* // # определить PIN 9 // pin neopixel # define NUM_LEDS 144 // 12 x 12 # define GIORNO 255 ​​// full on #define SERA 25 // десятая полоса onAdafruit_NeoPixel =Adafruit_NeoPixel (NUM_LEDS, PIN , NEO_GRB + NEO_KHZ800); // 144 светодиода, вывод 9int intBrightness; // **************** ЦВЕТА *********** // uint32_t Red =strip.Color (255, 0, 0); uint32_t Зеленый =strip.Color (0, 255, 0); uint32_t Blue =strip.Color (0, 0, 255); uint32_t Белый =strip.Color (255, 255, 255); uint32_t Желтый =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); // Отображение I2C 16 x 2RTC_DS1307 RTC; int P1 =6; // Кнопка SET MENU'int P2 =7; // Кнопка + int P3 =8; // Кнопка -int oraagg; int minagg; int annoagg; int meseagg; int dayagg; int menu =0; int ora; // ******** Презентация ********* // int txtSONO [] ={1,2,3,4,6,7,9,10,11, -1}; // ******** Часы ********* // int txtUNA [] ​​={20,21,22, -1}; int txtDUE [] ={17,18,19, -1}; int txtTRE [] ={57,58,59, -1}; int txtQUATTRO [ ] ={96,97,98,99,100,101,102, -1}; int txtCINQUE [] ={30,31,32,33,34,35, -1}; int txtSEI [] ={103,104,105, -1}; int txtSETTE [] ={48,49,50,51,52, -1}; int txtOTTO [] ={72,73,74,75, -1}; int txtNOVE [] ={60,61,62,63 , -1}; int txtDIECI [] ={12,13,14,15,16, -1}; int txtUNDICI [] ={84,85,86,87,88,89, -1}; int txtDODOCI [ ] ={90,91,92,93,94,95, -1}; // ******** С днем ​​рождения ********* // int txtAUGURI [] ={24, 25,26,27,28,29, -1}; int txtSIMONE [] ={36,37,38,39,40,41, -1}; int txtJACOPO [] ={42,43,44,45, 46,47, -1}; int txtMINU [] ={53,54,55,56, -1}; int txtTIZIANO [] ={65,66,67,68,69,70,71, -1}; int txtMARILENA [] ​​={76,77,78,79,80,81,82,83, -1}; // ******** Минуты ********* // int txtE [] ={107, -1}; int txtMENO [] ={116,117,118,119, -1}; int txtMUN O [] ={5, -1}; int txtMDUE [] ={64, -1}; int txtMTRE [] ={106, -1}; int txtMQUATTRO [] ={125, -1}; int txtMCINQUE [ ] ={132,133,134,135,136,137, -1}; int txtMDIECI [] ={120,121,122,123,124, -1}; int txtQUINDICI [] ={108,109,110,111,112,113,114,115, -1}; int txtVENTI [] ={139,140,141,142] int txt ={139,140,141,142] txt ={139,140,141,142] {126,127,128,129,130,131, -1}; void setup () {strip.begin (); strip.show (); lcd.begin (); lcd.backlight (); lcd.clear (); pinMode (P1, ВХОД); pinMode (P2, ВХОД); pinMode (P3, ВХОД); Serial.begin (9600); Wire.begin (); RTC.begin (); if (! RTC.isrunning ()) {Serial.println («RTC НЕ работает!»); // Устанавливаем дату и время во время компиляции RTC.adjust (DateTime (__ DATE__, __TIME__)); } // RTC.adjust (DateTime (__ DATE__, __TIME__)); // удаляем "//" для настройки времени // По умолчанию на дисплее отображаются дата и время int menu =0;} void loop () {// проверяем, нажали ли вы кнопку SET и увеличиваем ли индекс меню if (digitalRead ( P1)) {меню =меню + 1; } // в какую подпрограмму нам перейти? если (меню ==0) {DisplayDateTime (); // void DisplayDateTime DateTime now =RTC.now (); if ((now.hour ()> =19) || (now.hour () <7)) {// настраиваем яркость день - ночь intBrightness =SERA; } еще {intBrightness =GIORNO; } strip.setBrightness (intBrightness); strip.show (); int timeMin =now.minute (); int modMin =timeMin% 5; // https://www.arduino.cc/en/Reference/Modulo if (modMin ==0) {// каждую минуту светодиоды меняют цвет и загораются соответствующие числа paintWord (txtSONO, White); paintWord (txtMQUATTRO, ВЫКЛ); } иначе, если (modMin ==1) {paintWord (txtSONO, желтый); paintWord (txtMUNO, Красный); } иначе, если (modMin ==2) {paintWord (txtSONO, Green); paintWord (txtMUNO, Выкл.); paintWord (txtMDUE, Синий); } иначе, если (modMin ==3) {paintWord (txtSONO, Blue); paintWord (txtMDUE, Выкл.); paintWord (txtMTRE, зеленый); } иначе, если (modMin ==4) {paintWord (txtSONO, Red); paintWord (txtMTRE, Выкл.); paintWord (txtMQUATTRO, желтый); } HourClock (); // пусто HourClock MinuteClock (); // пусто MinuteClock Auguri (); // пусто Auguri strip.show (); } если (меню ==1) {DisplaySetHour (); } если (меню ==2) {DisplaySetMinute (); } если (меню ==3) {DisplaySetYear (); } если (меню ==4) {DisplaySetMonth (); } если (меню ==5) {DisplaySetDay (); } если (меню ==6) {StoreAgg (); задержка (500); меню =0; } delay (100);} void showStrip () {#ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.show (); #endif #ifndef ADAFRUIT_NEOPIXEL_H // FastLED FastLED.show (); #endif} void setPixel (int Pixel, байт красный, байт зеленый, байт синий) {#ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.setPixelColor (Pixel, strip.Color (красный, зеленый, синий)); #endif #ifndef ADAFRUIT_NEOPIXEL_H // Светодиоды FastLED [пиксель] .r =красный; светодиоды [пиксель] .g =зеленый; светодиоды [пиксель] .b =синий; #endif} void setAll (красный байт, зеленый байт, синий байт) {for (int i =0; i  =40) {// из 40 минут добавить 1 к «часу» ora =ora + 1; } переключатель (или) {case 0:case 12:case 24:paintWord (txtUNDICI, Off); strip.show (); если (modMin ==0) {paintWord (txtDODOCI, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtDODOCI, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtDODOCI, зеленый); strip.show (); } иначе, если (modMin ==3) {paintWord (txtDODOCI, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtDODOCI, красный); strip.show (); } ломать; case 1:case 13:paintWord (txtDODOCI, Off); strip.show (); если (modMin ==0) {paintWord (txtUNA, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtUNA, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtUNA, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtUNA, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtUNA, Red); strip.show (); } ломать; case 2:case 14:paintWord (txtUNA, Off); strip.show (); если (modMin ==0) {paintWord (txtDUE, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtDUE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtDUE, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtDUE, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtDUE, Red); strip.show (); }ломать; case 3:case 15:paintWord (txtDUE, Off); strip.show (); если (modMin ==0) {paintWord (txtTRE, белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtTRE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtTRE, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtTRE, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtTRE, красный); strip.show (); } ломать; case 4:case 16:paintWord (txtTRE, Off); strip.show (); если (modMin ==0) {paintWord (txtQUATTRO, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtQUATTRO, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtQUATTRO, зеленый); strip.show (); } иначе, если (modMin ==3) {paintWord (txtQUATTRO, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtQUATTRO, красный); strip.show (); } ломать; case 5:case 17:paintWord (txtQUATTRO, Off); strip.show (); если (modMin ==0) {paintWord (txtCINQUE, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtCINQUE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtCINQUE, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtCINQUE, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtCINQUE, Red); strip.show (); } ломать; case 6:case 18:paintWord (txtCINQUE, Off); strip.show (); если (modMin ==0) {paintWord (txtSEI, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtSEI, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtSEI, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtSEI, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtSEI, Red); strip.show (); } ломать; case 7:case 19:paintWord (txtSEI, Off); strip.show (); если (modMin ==0) {paintWord (txtSETTE, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtSETTE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtSETTE, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtSETTE, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtSETTE, Red); strip.show (); } ломать; case 8:case 20:paintWord (txtSETTE, Off); strip.show (); если (modMin ==0) {paintWord (txtOTTO, белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtOTTO, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtOTTO, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtOTTO, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtOTTO, красный); strip.show (); } ломать; case 9:case 21:paintWord (txtOTTO, Off); strip.show (); если (modMin ==0) {paintWord (txtNOVE, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtNOVE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtNOVE, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtNOVE, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtNOVE, Red); strip.show (); } ломать; case 10:case 22:paintWord (txtNOVE, Off); strip.show (); если (modMin ==0) {paintWord (txtDIECI, белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtDIECI, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtDIECI, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtDIECI, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtDIECI, Red); strip.show (); } ломать; case 11:case 23:paintWord (txtDIECI, Off); strip.show (); если (modMin ==0) {paintWord (txtUNDICI, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtUNDICI, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtUNDICI, Green); strip.show (); } иначе, если (modMin ==3) {paintWord (txtUNDICI, Blue); strip.show (); } иначе, если (modMin ==4) {paintWord (txtUNDICI, Red); strip.show (); }ломать; }} void MinuteClock () {DateTime now =RTC.now (); int timeMin =now.minute (); int modMin =timeMin% 5; // https://www.arduino.cc/en/Reference/Modulo switch (now.minute ()) {case 5:case 6:case 7:case 8:case 9:if (modMin ==0) {paintWord (txtE, белый); paintWord (txtMCINQUE, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtE, желтый); paintWord (txtMCINQUE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtE, Green); paintWord (txtMCINQUE, зеленый); strip.show (); } иначе, если (modMin ==3) {paintWord (txtE, Blue); paintWord (txtMCINQUE, Синий); strip.show (); } иначе, если (modMin ==4) {paintWord (txtE, Red); paintWord (txtMCINQUE, Красный); strip.show (); }ломать; case 10:case 11:case 12:case 13:case 14:paintWord (txtMCINQUE, Off); strip.show (); если (modMin ==0) {paintWord (txtE, Белый); paintWord (txtMDIECI, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtE, желтый); paintWord (txtMDIECI, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtE, Green); paintWord (txtMDIECI, Зеленый); strip.show (); } иначе, если (modMin ==3) {paintWord (txtE, Blue); paintWord (txtMDIECI, Синий); strip.show (); } иначе, если (modMin ==4) {paintWord (txtE, Red); paintWord (txtMDIECI, Красный); strip.show (); } ломать; case 15:case 16:case 17:case 18:case 19:paintWord (txtMDIECI, Off); strip.show (); если (modMin ==0) {paintWord (txtE, Белый); paintWord (txtQUINDICI, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtE, желтый); paintWord (txtQUINDICI, Желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtE, Green); paintWord (txtQUINDICI, Зеленый); strip.show (); } иначе, если (modMin ==3) {paintWord (txtE, Blue); paintWord (txtQUINDICI, Синий); strip.show (); } иначе, если (modMin ==4) {paintWord (txtE, Red); paintWord (txtQUINDICI, Красный); strip.show (); }ломать; case 20:case 21:case 22:case 23:case 24:paintWord (txtQUINDICI, Off); strip.show (); если (modMin ==0) {paintWord (txtE, Белый); paintWord (txtVENTI, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtE, желтый); paintWord (txtVENTI, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtE, Green); paintWord (txtVENTI, Зеленый); strip.show (); } иначе, если (modMin ==3) {paintWord (txtE, Blue); paintWord (txtVENTI, Синий); strip.show (); } иначе, если (modMin ==4) {paintWord (txtE, Red); paintWord (txtVENTI, Красный); strip.show (); }ломать; case 25:case 26:case 27:case 28:case 29:if (modMin ==0) {paintWord (txtE, White); paintWord (txtVENTI, Белый); paintWord (txtMCINQUE, Белый); strip.show (); } иначе, если (modMin ==1) {paintWord (txtE, желтый); paintWord (txtVENTI, желтый); paintWord (txtMCINQUE, желтый); strip.show (); } иначе, если (modMin ==2) {paintWord (txtE, Green); paintWord (txtVENTI, Зеленый); paintWord (txtMCINQUE, Green); ... Этот файл был усечен, загрузите его, чтобы увидеть все его содержимое. 
Итальянские WordClock

Изготовленные на заказ детали и корпуса

wordklock_aWvuaZRw4N.svg

Схема

wordklock_JBoZPYrsYr.fzz

Производственный процесс

  1. Сигнал тревоги для растений, предупреждающий о жажде
  2. Простые часы со словами (Arduino)
  3. Word Clock с минутным разрешением времени в словах
  4. Счетчик кВтч Sigfox
  5. Монитор температуры Bluetooth
  6. Блокировка, управляемая жестами
  7. Компаньон IC
  8. USB-MIDI-адаптер
  9. Изолированный аналоговый вход для Arduino
  10. Измерьте время реакции