Veaceslav MUNTEANU - Ceas deșteptător cu termometru

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

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 :)

Descriere generală

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:

 Imagine 1

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:

  • Port A sunt pinii care vor controla LCD-ul.
  • Port C sunt pinii care controlează termometrul și difuzorul
  • Port D sunt pinii dedicați pentru cele 4 butoane de control.

Hardware Design

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:

  • LCD-ul Raystar RC1602A care l-am cumparat eu e diferit ca timming-uri si secventa de initializare de cel din laborator, recomand cumpararea R1602B
  • Bibliotecile disponibile pe net pentru comunicarea cu 1-wire (termometru) va pot arde porturile de pe placuta

Software Design

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:

  • lcd.h/lcd.c - codul destinat pentru interfața cu LCD-ul RayStar R1602A
/* 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);	
  • ds18b20.h/ds18b20.c - codul pentru interfața de citire a temperaturii de pe termometrul digital DS18b20+
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);
  • display.h/display.c - formatarea meniurilor pentru afisare pe display
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);
  • main.c - întreruperile/ butoanele

Rezultate Obţinute

Î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ă :)

Concluzii

Proiectul a fost greu de implementat însă a fost destul de interesant.

  • Experiență mai bogată în interacțiunile hardware/software, nu doar exerciții pe hardware care deja era făcut să meargă (exerciții lab)
  • Implementare după datasheet-uri
  • Mai mult fludor în plămâni decât pe plăcuță :)

Download

Codul sursă poate di descărcat de aici:

pm_clock_termo.zip

Jurnal

  • 25-04-2013 - Lipit LCD-ul si butoanele. LCD-ul nu functioneaza
  • 16-05-2013 - Lipit difuzor si termometru. LCD-ul functioneaza
  • 18-05-2013 - Codul pentru termometru mi-a ars tot port C
  • 20-05-2013 - Proiectul este gata și functionează
  • 21-05-2013 = Mutat termometrul mai departe de componentele care degajă căldură

Bibliografie/Resurse

pm/prj2013/sstegaru/20.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0