Autorul poate fi contactat la adresa: Login pentru adresa
Ceas deșteptător cu termometru.
Proiectul are ca scop crearea unui gadget util, pe care o să-l folosesc. Ceasul va fi dotat cu un afisaj led alfanumeric, care va arăta mereu ora și temperatura care este citită de la termometrul digital. Prin intermediul celor 4 butoane, utilizatorul va avea posibilitatea să navigheze prin meniu si sa seteze ora si alarma. Melodia pentru alarma va fi integrata in codul programului (lipsa SD-card-ului nu-mi permite sa aleg melodii), iar volumul alarmei va fi unul destul de mare, ca să-i trezească și pe cei mai somnoroși :)
Pentru a face proiectul cât mai compact și pentru a evita o mulțime de fire, am proiectat o forma de timp sandwitch, cu placuta de test peste pacuța de baza care conține controller-ul.
Cele 2 placi arată în modul următor:
Toate firele de de pe placa de test vor fi ascunse si practic invizibile:
Pentru fi placa de test peste placa de baza am montat pini mama, astfel se asigură o construcție solidă. Placa de test este putin mai mare decât placuta initiala, optional se poate de tăiat deoarce toate componente nu vor depași marginile placii de baza.
Distributie pini:
Lista de componete adiționale(înafară de pachetul de baza care a costat 45 Roni)
Componente | Cantitate | Cost | Observatii |
---|---|---|---|
LCD Alfanumeric | 1 | 22.5 Roni | Greu de interfatat |
Push Buttons | 5 | ~ 2 Roni | |
Termometru Digital | 1 | 5.3 Roni | |
Sir pini mama | 1 | 12 Roni | |
Rezistente 1k | 10 | ~1 Ron | |
Placuta test | 1 | 7 Roni |
Schema hardware și pinii conectați:
Pentru a scrie codul proiectului am folosit WinAvr. Programmer's Notepad era integrat și configurat cu target-urile corespunzătoare pentru make: All și Clean
Codul este structurat în 4 părți:
/* Initializare modul LCD. Trebuie apelata inainte de a se face orice operatie cu LCD-ul */ void LCD_init(); /* Trimite o instructiune catre lcd (vezi datasheet) */ void LCD_writeInstruction(unsigned char _instruction); /** Scrie o instructiune fara a verifica busy-flag-ul, folosit la initializare pentru instructiunile * pentru care nu se poate verifica BF **/ void LCD_writeInstruction_no_busy(unsigned char _instruction); /* Trimite date catre LCD pentru afisare */ void LCD_writeData(unsigned char _data); /* Trimite un byte catre LCD la modul general (nu conteaza daca e instructiune sau date) */ void LCD_write(unsigned char _byte); /* Asteptam pana cand lcd-ul devine disponibil pt o noua comanda */ void LCD_waitNotBusy(); /* Asteapta un numar de cicli de ceas */ void LCD_waitInstructions(unsigned char _instructions); /* Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere) */ void LCD_print(char* _msg); /* Afiseaza imformatia pe LCD (mai multe caractere, poate trece pe alta linie) */ void LCD_printn(char* _msg, uint8_t n);
uint8_t therm_reset(); void therm_write_bit(uint8_t bit); uint8_t therm_read_bit(void); uint8_t therm_read_byte(void); void therm_read_temperature(int8_t *digit_part, uint16_t *decimal_part);
void display_data(int8_t state, int8_t hours, int8_t minutes, int8_t seconds, int8_t alarm_h, int8_t alarm_m, int8_t alarm_on, int8_t digit, uint16_t decimal); /** * Afiseaza ora, alarma si temperatura */ void display_state0(int8_t hours, int8_t minutes, int8_t seconds, int8_t alarm_h, int8_t alarm_m, int8_t alarm_on, int8_t digit, uint16_t decimal); /** * Afiseaza meniul de setare al orei - setare ora */ void display_state1(int8_t hours, int8_t minutes); /** * Afiseaza meniul de setare al orei - setare minute */ void display_state2(int8_t hours, int8_t minutes); /** * Afiseaza meniul setare alarma - ora alarma */ void display_state3(int8_t alarm_h, int8_t alarm_m); /** * Afiseaza meniul setare alarma - minute alarma */ void display_state4(int8_t alarm_h, int8_t alarm_m); /** * Afiseaza meniul setare alarma - activare/dezactivare */ void display_state5(int8_t alarm_on);
În urma realizării proiectului am obținut un ceas deșteptător cu termometru. Mai util este termometrul care îmi spune că sunt +30 grade în cameră :)
Proiectul a fost greu de implementat însă a fost destul de interesant.
Codul sursă poate di descărcat de aici: