Word Clock italiano
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Sobre este projeto
Minha paixão por relógios Arduino, me levou a fazer um "Word Clock", já que moro na Itália, falava italiano. Para a realização do projeto, inspirei-me num tutorial “Word Clock Javelin”, fiz algumas pequenas alterações ... e aqui para vocês “Word Clock of Italy”!
Além de "contar o horário" em italiano, queria acrescentar os aniversários da minha família (incluindo o gato). Para a construção do “framework” utilizei um já feito pela IKEA, e as modificações internas utilizei o material que tinha em casa:
Para a realização da tela será mostrado o padrão desenhado com o Inkscape.
Meu painel mede 12 x 12 letras com uma pegada de 200 mm. Como não tenho impressora 3D, fiz a grade com tiras de alumínio, e isolei o contato do LED com a esponja adesiva, isso também serviu para isolar a luz.
Circuito eletrônico
Para manter o tempo, usei um RTC .
Para poder acertar a hora, adicionei botões (P1, P2, P3) e um display 16 x 2. (Veja também o projeto “Clock Set Date Time”). Como pode ser visto no diagrama de fiação, os botões são conectados ao Arduino por meio de um pull-down o circuito.
Como a tela serve apenas para ajustar o tempo, substituí o jumper por um botão , ao fazer isso, ele ilumina apenas para seu uso. O diodo D1 serve como proteção contra polaridade reversa.
O diodo D2 serve para não alimentar a tira de neopixel, quando, por algum motivo, temos que trocar o sketch do Arduino (muita corrente pode danificá-lo). O diodo D3 serve para trazer para 5 volts, a tensão em Neopixel.
Estou anexando o diagrama de circuito, o esquema de Fritzing, o layout do PCB.
Matriz
Para realizar a matriz conectei as várias faixas conforme a imagem. Ziguezagueando do canto superior esquerdo para descer.
Bibliotecas Arduino
- RTC
- LiquidCrystal_I2C
- Adafruit_NeoPixel
Explicação do código
O código é dividido em 5 partes principais:
- "DisplayDateTime":exibe a data e a hora no display LCD
- "HourClock":exibe as horas no painel
- "MinuteClock":exibe os minutos no painel
- "Auguri":feliz aniversário
- "Void paintWord (arrWord int [], uint32_t intColor)" é o coração do código para ligar o neopixel, "arrWord int []" são os LEDs que devem acender, "uint32_t intColor" é sua cor
Para obter um relógio mais preciso, adicionei os números 1, 2, 3, 4 correspondentes aos minutos progressivos.
Exemplo :“SONO LE ORE DIECI E VENTI 4” significa 10:24 (10:20 + 00:04), “SONO LE DIECI MENO QUINDICI 2” significa 09:47 (09:45 + 00:02)
Montagem
- Abra a moldura e limpe bem o vidro
- Impressão de inserção em acetato
- Insira o papel de impressão
- Insira a grade
- Insira o painel com os LEDs
- Cole um pedaço de madeira compensada, um pouco maior que a caixa de controle
- Prenda com parafusos auto-roscantes a caixa de controle
Preste muita atenção ao alinhamento das duas impressões
Localização
Coloque na sala de estar atrás dela com bom aspecto.
Código
- WordClock italiano
WordClock italiano Arduino
/ *:Projeto:WordClock:Autor:Tiziano Bianchettin:Data:25/09/2016:Revisão:1:Licença: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/ Meu professor de laboratório eletrônico "Perito Carli" * /// ************ bibliotecas ************** // # include#include #include #include // *********** neopixel ********* ******* // # define PIN 9 // pin neopixel # define NUM_LEDS 144 // 12 x 12 # define GIORNO 255 // completo em # define SERA 25 // um décimo onAdafruit_NeoPixel strip =Adafruit_NeoPixel (NUM_LEDS, PIN , NEO_GRB + NEO_KHZ800); // 144 led, pino 9int intBrightness; // ***************** CORES *********** // uint32_t Red =strip.Color (255, 0, 0); uint32_t Verde =tira.Cor (0, 255, 0); uint32_t Azul =tira.Cor (0, 0, 255); uint32_t Branco =tira.Cor (255, 255, 255); uint32_t Amarelo =tira.Cor (255 , 255, 0); uint32_t Roxo =tira.Cor (60, 0, 255); uint32_t Desligado =tira.Cor (0, 0, 0); LiquidCrystal_I2C lcd (0x27,16,2); // Exibe I2C 16 x 2RTC_DS1307 RTC; int P1 =6; // Botão SET MENU'int P2 =7; // Botão + int P3 =8; // Botão -int oraagg; int minagg; int annoagg; int meseagg; int dayagg; int menu =0; int ora; // ******** Apresentação ********* // int txtSONO [] ={1,2,3,4,6,7,9,10,11, -1}; // ******** Horas ********* // 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}; // ******** Feliz aniversário ********* // 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}; // ******** Minutos ********* // 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,142,143, -1}; {126,127,128,129,130,131, -1}; configuração de vazio () {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 ()) {Serial.println ("RTC NÃO está em execução!"); // Define a data e hora no momento da compilação RTC.adjust (DateTime (__ DATE__, __TIME__)); } // RTC.adjust (DateTime (__ DATE__, __TIME__)); // removendo "//" para ajustar a hora // A exibição padrão mostra a data e a hora int menu =0;} void loop () {// verifique se você pressiona o botão SET e aumenta o índice do menu if (digitalRead ( P1)) {menu =menu + 1; } // em qual sub-rotina devemos ir? if (menu ==0) {DisplayDateTime (); // void DisplayDateTime DateTime now =RTC.now (); if ((now.hour ()> =19) || (now.hour () <7)) {// ajusta o brilho dia - noite intBrightness =SERA; } else {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) {// a cada minuto os LEDs mudam de cor e acendem o número correspondente paintWord (txtSONO, White); paintWord (txtMQUATTRO, OFF); } else if (modMin ==1) {paintWord (txtSONO, amarelo); paintWord (txtMUNO, vermelho); } else if (modMin ==2) {paintWord (txtSONO, Green); paintWord (txtMUNO, Off); paintWord (txtMDUE, azul); } else if (modMin ==3) {paintWord (txtSONO, Blue); paintWord (txtMDUE, Off); paintWord (txtMTRE, verde); } else if (modMin ==4) {paintWord (txtSONO, vermelho); paintWord (txtMTRE, Off); paintWord (txtMQUATTRO, amarelo); } HourClock (); // void HourClock MinuteClock (); // void MinuteClock Auguri (); // vazio Auguri strip.show (); } if (menu ==1) {DisplaySetHour (); } if (menu ==2) {DisplaySetMinute (); } if (menu ==3) {DisplaySetYear (); } if (menu ==4) {DisplaySetMonth (); } if (menu ==5) {DisplaySetDay (); } if (menu ==6) {StoreAgg (); atraso (500); menu =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, byte vermelho, byte verde, byte azul) {#ifdef ADAFRUIT_NEOPIXEL_H // NeoPixel strip.setPixelColor (Pixel, strip.Color (red, green, blue)); #endif #ifndef ADAFRUIT_NEOPIXEL_H // leds FastLED [Pixel] .r =vermelho; leds [Pixel] .g =verde; leds [Pixel] .b =azul; #endif} void setAll (byte vermelho, byte verde, byte azul) {for (int i =0; i =40) {// a partir dos 40 minutos, adicione 1 a "hora" ora =ora + 1; } switch (ora) {case 0:case 12:case 24:paintWord (txtUNDICI, Off); strip.show (); if (modMin ==0) {paintWord (txtDODOCI, branco); strip.show (); } else if (modMin ==1) {paintWord (txtDODOCI, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtDODOCI, Green); strip.show (); } else if (modMin ==3) {paintWord (txtDODOCI, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtDODOCI, Red); strip.show (); } pausa; caso 1:caso 13:paintWord (txtDODOCI, Off); strip.show (); if (modMin ==0) {paintWord (txtUNA, branco); strip.show (); } else if (modMin ==1) {paintWord (txtUNA, amarelo); strip.show (); } else if (modMin ==2) {paintWord (txtUNA, Green); strip.show (); } else if (modMin ==3) {paintWord (txtUNA, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtUNA, vermelho); strip.show (); } pausa; caso 2:caso 14:paintWord (txtUNA, Off); strip.show (); if (modMin ==0) {paintWord (txtDUE, branco); strip.show (); } else if (modMin ==1) {paintWord (txtDUE, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtDUE, Green); strip.show (); } else if (modMin ==3) {paintWord (txtDUE, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtDUE, Red); strip.show (); }pausa; caso 3:caso 15:paintWord (txtDUE, Off); strip.show (); if (modMin ==0) {paintWord (txtTRE, branco); strip.show (); } else if (modMin ==1) {paintWord (txtTRE, amarelo); strip.show (); } else if (modMin ==2) {paintWord (txtTRE, Green); strip.show (); } else if (modMin ==3) {paintWord (txtTRE, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtTRE, vermelho); strip.show (); } pausa; caso 4:caso 16:paintWord (txtTRE, Off); strip.show (); if (modMin ==0) {paintWord (txtQUATTRO, branco); strip.show (); } else if (modMin ==1) {paintWord (txtQUATTRO, amarelo); strip.show (); } else if (modMin ==2) {paintWord (txtQUATTRO, Green); strip.show (); } else if (modMin ==3) {paintWord (txtQUATTRO, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtQUATTRO, vermelho); strip.show (); } pausa; caso 5:caso 17:paintWord (txtQUATTRO, Off); strip.show (); if (modMin ==0) {paintWord (txtCINQUE, branco); strip.show (); } else if (modMin ==1) {paintWord (txtCINQUE, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtCINQUE, Green); strip.show (); } else if (modMin ==3) {paintWord (txtCINQUE, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtCINQUE, Red); strip.show (); } pausa; caso 6:caso 18:paintWord (txtCINQUE, Off); strip.show (); if (modMin ==0) {paintWord (txtSEI, branco); strip.show (); } else if (modMin ==1) {paintWord (txtSEI, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtSEI, Green); strip.show (); } else if (modMin ==3) {paintWord (txtSEI, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtSEI, Red); strip.show (); } pausa; caso 7:caso 19:paintWord (txtSEI, Off); strip.show (); if (modMin ==0) {paintWord (txtSETTE, branco); strip.show (); } else if (modMin ==1) {paintWord (txtSETTE, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtSETTE, Green); strip.show (); } else if (modMin ==3) {paintWord (txtSETTE, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtSETTE, Red); strip.show (); } pausa; caso 8:caso 20:paintWord (txtSETTE, Off); strip.show (); if (modMin ==0) {paintWord (txtOTTO, branco); strip.show (); } else if (modMin ==1) {paintWord (txtOTTO, amarelo); strip.show (); } else if (modMin ==2) {paintWord (txtOTTO, Green); strip.show (); } else if (modMin ==3) {paintWord (txtOTTO, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtOTTO, Red); strip.show (); } pausa; caso 9:caso 21:paintWord (txtOTTO, Off); strip.show (); if (modMin ==0) {paintWord (txtNOVE, branco); strip.show (); } else if (modMin ==1) {paintWord (txtNOVE, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtNOVE, Green); strip.show (); } else if (modMin ==3) {paintWord (txtNOVE, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtNOVE, Red); strip.show (); } pausa; caso 10:caso 22:paintWord (txtNOVE, Off); strip.show (); if (modMin ==0) {paintWord (txtDIECI, branco); strip.show (); } else if (modMin ==1) {paintWord (txtDIECI, Yellow); strip.show (); } else if (modMin ==2) {paintWord (txtDIECI, Green); strip.show (); } else if (modMin ==3) {paintWord (txtDIECI, Blue); strip.show (); } else if (modMin ==4) {paintWord (txtDIECI, vermelho); strip.show (); } pausa; caso 11:caso 23:paintWord (txtDIECI, Off); strip.show (); if (modMin ==0) {paintWord (txtUNDICI, branco); strip.show (); } else if (modMin ==1) {paintWord (txtUNDICI, Yellow); strip.show(); } else if ( modMin ==2){ paintWord(txtUNDICI, Green); strip.show(); } else if ( modMin ==3){ paintWord(txtUNDICI, Blue); strip.show(); } else if ( modMin ==4){ paintWord(txtUNDICI, Red); strip.show(); }break; }}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, White); paintWord(txtMCINQUE, White); strip.show(); } else if ( modMin ==1){ paintWord(txtE, Yellow); paintWord(txtMCINQUE, Yellow); strip.show(); } else if ( modMin ==2){ paintWord(txtE, Green); paintWord(txtMCINQUE, Green); strip.show(); } else if ( modMin ==3){ paintWord(txtE, Blue); paintWord(txtMCINQUE, Blue); strip.show(); } else if ( modMin ==4){ paintWord(txtE, Red); paintWord(txtMCINQUE, Red); strip.show(); }break; case 10:case 11:case 12:case 13:case 14:paintWord(txtMCINQUE, Off); strip.show(); if ( modMin ==0){ paintWord(txtE, White); paintWord(txtMDIECI, White); strip.show(); } else if ( modMin ==1){ paintWord(txtE, Yellow); paintWord(txtMDIECI, Yellow); strip.show(); } else if ( modMin ==2){ paintWord(txtE, Green); paintWord(txtMDIECI, Green); strip.show(); } else if ( modMin ==3){ paintWord(txtE, Blue); paintWord(txtMDIECI, Blue); strip.show(); } else if ( modMin ==4){ paintWord(txtE, Red); paintWord(txtMDIECI, Red); strip.show(); } pausa; case 15:case 16:case 17:case 18:case 19:paintWord(txtMDIECI, Off); strip.show(); if ( modMin ==0){ paintWord(txtE, White); paintWord(txtQUINDICI, White); strip.show(); } else if ( modMin ==1){ paintWord(txtE, Yellow); paintWord(txtQUINDICI, Yellow); strip.show(); } else if ( modMin ==2){ paintWord(txtE, Green); paintWord(txtQUINDICI, Green); strip.show(); } else if ( modMin ==3){ paintWord(txtE, Blue); paintWord(txtQUINDICI, Blue); strip.show(); } else if ( modMin ==4){ paintWord(txtE, Red); paintWord(txtQUINDICI, Red); strip.show(); }break; case 20:case 21:case 22:case 23:case 24:paintWord(txtQUINDICI, Off); strip.show(); if ( modMin ==0){ paintWord(txtE, White); paintWord(txtVENTI, White); strip.show(); } else if ( modMin ==1){ paintWord(txtE, Yellow); paintWord(txtVENTI, Yellow); strip.show(); } else if ( modMin ==2){ paintWord(txtE, Green); paintWord(txtVENTI, Green); strip.show(); } else if ( modMin ==3){ paintWord(txtE, Blue); paintWord(txtVENTI, Blue); strip.show(); } else if ( modMin ==4){ paintWord(txtE, Red); paintWord(txtVENTI, Red); strip.show(); }break; case 25:case 26:case 27:case 28:case 29:if ( modMin ==0){ paintWord(txtE, White); paintWord(txtVENTI, White); paintWord(txtMCINQUE, White); strip.show(); } else if ( modMin ==1){ paintWord(txtE, Yellow); paintWord(txtVENTI, Yellow); paintWord(txtMCINQUE, Yellow); strip.show(); } else if ( modMin ==2){ paintWord(txtE, Green); paintWord(txtVENTI, Green); paintWord(txtMCINQUE, Green);...This file has been truncated, please download it to see its full contents.
Italian WordClock
Peças personalizadas e gabinetes
wordklock_aWvuaZRw4N.svgEsquemas
wordklock_JBoZPYrsYr.fzzProcesso de manufatura