Thermo T-Shirt
Monitorizarea temperaturii corpului este un proces cu aplicații variate în lumea medicală. Dintre utilizările deja consacrate amintim:
Printre aplicațiile care se depărtează puțin de sfera medicală se numără:
Proiectul nostru constă în realizarea unui dispozitiv utilitar care să poată fi folosit pentru a monitoriza temperatura locală la suprafața pielii pentru o persoană, în timp. Exista două moduri de monitorizare:
Proiectul dezvoltat prezintă următoarea interfață de utilizare:
Plăcuța principală conține următoarele extensii:
Componentele de bază ale plăcuței sunt:
Lista pieselor folosite:
Cantitate | Denumire |
---|---|
1 | ENC28J60 |
1 | crystal 25 MHz |
5 | R47 |
3 | R270 |
1 | R2K7 |
2 | R10K |
1 | R240 |
2 | C18pF |
1 | C10uF |
2 | C10nF |
2 | C100nF |
1 | TS1086 |
1 | soclu |
1 | placă de test |
Senzorii folositi sunt DS18B20, senzori de temperatură digitali. Senzorii sunt conectati între ei și totodată cu ATMega 16. (datasheet)
Lista pieselor folosite:
Cantitate | Denumire |
---|---|
6 | DS18B20 |
6 | R4K7 |
Compilator: javac 1.6.0_06
Mediu de dezvoltare: Eclipse Galileo 3.5
Viewer-ul este scris în Java peste SWING, și se folosește de API-ul nativ Java pentru a lansa conexiuni HTTP. Interfața cu utilizatorul se poate observa în imaginea de mai jos:
Din interfață se pot realiza următoarele operații:
Compilator: avr-gcc
Mediu de dezvoltare: Notepad++
Codul programat pe microcontroller se compune din două module logice importante:
1. Codul pentru serverul web va crea ca raspuns la cererile HTTP o pagina cu sintaxa celei asteptate de Viewer:
uint16_t print_webpage(uint8_t *buf, uint8_t on_off) { char buffer[30]; uint16_t plen; page=0; plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n")); plen = fill_tcp_data_p(buf, plen, PSTR("<HTML><BODY bgcolor=LightCyan>\n")); sprintf(buf, "%2d %2d %2d %2d %2d %2d\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]); plen = fill_tcp_data(buf, plen, buffer); plen = fill_tcp_data_p(buf, plen, PSTR("</BODY>\n</HTML>\n")); return plen; }
2. Codul pentru citirea senzorilor se foloseste de biblioteca implementata in “ds18x20lib.h”:
//----------------------------------------- // Stabilim porturile folosite de biblioteca //----------------------------------------- #define DS1820_PIN PINA //DS1820 PIN #define DS1820_PORT PORTA //DS1820 PORT #define DS1820_DDR DDRA //DS1820 DDR //----------------------------------------- // Headerele functiilor folosite in biblioteca //----------------------------------------- uint8_t ds1820_reset(uint8_t); void ds1820_wr_bit(uint8_t,uint8_t); uint8_t ds1820_re_bit(uint8_t); uint8_t ds1820_re_byte(uint8_t); void ds1820_wr_byte(uint8_t,uint8_t); float ds1820_read_temp(uint8_t); uint8_t ds1820_init(uint8_t);
3. Codul care fare “refresh la temperaturi sta intr-o intrerupere care se executa periodic (pe timer-ul 2 al lui atmega16):
// Output compare interrupt handler for timer2. SIGNAL(SIG_OUTPUT_COMPARE2) { // Update-eaza temperaturile periodic cu ceea ce citeste de la senzori sprintf(buf, "%d %d %d %d %d %d\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]); temp[0] = ds1820_read_temp(PA1); temp[1] = ds1820_read_temp(PA2); temp[2] = ds1820_read_temp(PA3); temp[3] = ds1820_read_temp(PA4); temp[4] = ds1820_read_temp(PA5); temp[5] = ds1820_read_temp(PA6); // Decomenteaza linia de mai jos pentru debugging pe seriala: // printf("Has read temperatures: %d %d %d %d %d %d\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]); }
4. Cea mai mare parte din debugging a avut loc pe portul serial. Codul pentru initializarea serialei este:
// Initializeaza seriala si ataseaza stdin si stdout USART_init(); stdin = &mystdin; stdout = &mystdout; // Fa un prim test de functionalitate: printf("Serial Initialized\n");
Pentru sursele complete si alte detalii de implementare, downloadati arhiva de la sectiunea de Downloads.
Modulul Ethernet:
Modul temperatura:
Montajul Ethernet - ATMega 16
Montajul Ethernet-ATmega 16 - Senzori:
Prin conectarea controller-ului ENC28J60 cu ATMega16 se ușurează comunicarea unui calculator senzorii. Astfel, datele primite de la senzori pot fi afișate într-o pagină web, sau trimite comenzi sistemului pentru a schimba anumiți parametri. În cazul nostru, ele sunt folosite pentru a trimite viewer-ului care afișează real-time temperatura primită per senzor.
Problemele cele mai mari au fost de la mufa de conector (căreia i-am găsit foarte greu datasheet-ul și cel existent nu este foarte clar).
Senzorii de temperatura se pot strica foarte usor daca se supraincalzesc, dupa care incep sa dea temperaturi gresite. Am stricat in acest mod trei dintre senzori (doi dintre ei citesc aproape mereu 0, iar al treilea citeste temperaturi negative).
Bugurile probabil sunt de la senzori. Pentru că este un proiect foarte interesant o sa-l finisam pana cand totul va merge corect.
Later edit:
Major breakthrough: am reusit sa scoatem masuratorile din placuta. Am constatat ca probabil ca am ars o parte din senzori, pentru ca dau masuratori aleatorii (Senzorul 3 si 4 din figura de mai sus). Senzorul 0 a fost lasat liber in aer la temperatura camerei (oscila între 22 și 23 de grade, sau 23 și 24, ceea ce verifica precizia de 0.5 grade Celsius menționată în datasheet), iar senzorul 2 a fost incalzit cu mâna și a urcat încet-încet până la 28 grade, unde a staționat.
A fost un drum lung, și pe alocuri am avut senzația că am aruncat bani mulți pe componente care nu merg, dar în final a fost OK.