Table of Contents

Nume proiect

Thermo T-Shirt

Autori

Introducere

Monitorizarea temperaturii corpului este un proces cu aplicații variate în lumea medicală. Dintre utilizările deja consacrate amintim:

Figura 1

Figura 2

Printre aplicațiile care se depărtează puțin de sfera medicală se numără:

Figura 3

Descriere generală

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:

Schema bloc

Hardware Design

Schema generală

Extensii

Plăcuța principală conține următoarele extensii:

Modul Ethernet

Componentele de bază ale plăcuței sunt:

Lista pieselor folosite:

Cantitate Denumire
1ENC28J60
1crystal 25 MHz
5R47
3R270
1R2K7
2R10K
1R240
2C18pF
1C10uF
2C10nF
2C100nF
1TS1086
1soclu
1placă de test
Modul Senzori

Senzorii folositi sunt DS18B20, senzori de temperatură digitali. Senzorii sunt conectati între ei și totodată cu ATMega 16. (datasheet)

Lista pieselor folosite:

Cantitate Denumire
6DS18B20
6R4K7

Software Design

Viewer-ul

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:

  1. Se poate alege, înainte de începerea eșantionării de date de la plăcuța conectată in rețea, care senzori să fie monitorizați. Nu este necesar să se folosească toți senzorii la o sesiune de monitorizare. Pentru o mai bună vizualizare a datelor, utilizatorul poate alege să amplaseze grafic punctele de măsură folosindu-se de un model uman.
  2. Se poate specifica adresa IP a plăcuței. Aceasta va implementa un server Web care va răspunde la cereri HTTP prin comunicarea temperaturilor.
  3. Se poate comuta în orice moment (chiar și în timpul monitorizării) între monitorizarea temperaturilor instantanee sau a temperaturilor medii dintre eșantionări (temperaturile instantanee pot avea fluctuații irelevante pentru o serie de aplicații, dar cele medii pot ascunde detalii importante la alte aplicații)
  4. Se poate salva log-ul tuturor monitorizărilor dintr-o sesiune pentru a putea permite prelucrări statistice ulterioare (în format text). Fiecare eșantionare este prefixată în log de ora, minutul și secunda la care au fost făcute măsurătorile.

Codul de pe microcontroller

Compilator: avr-gcc

Mediu de dezvoltare: Notepad++

Codul programat pe microcontroller se compune din două module logice importante:

  1. Implementarea serverului WEB, construită cu ajutorul scheletului de cod al laboratorului 5.
  2. Implementarea folosind întreruper a codului care citește datele de la senzorii de temperatură.

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.

Jurnal

Rezultate Obţinute

Modulul Ethernet:

Modul temperatura:

Montajul Ethernet - ATMega 16

Montajul Ethernet-ATmega 16 - Senzori:

Concluzii

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.

Download

Bibliografie/Resurse