Proiectul consta in realizarea unui server web care poate servi informatii de la diversi senzori. Sistemul are la baza microcontrolerul AVR, la acesta fiind adaugate un modul pentru legatura ethernet si um modul cu senzori. Sistemul poate accesa informatii de la mai multi senzori, cum ar fi senzori de temperatura, presiune si umiditate. Astfel va putea comunica informatii meteo complete de la locul unde se afla sistemul. Informatiile sunt trimise prin TCP si pot si accesate pe web din orice locatie. Pentru securitate se poate cere o parola inainte de afisarea datelor.
Din motive financiare, modelul de mai jos contine doar un senzor de temperatura.
Un tutorial pentru realizarea modulului de baza cu microcontrolerul ATMega16 se gaseste aici.
Placa de extensie Ethernet are la baza urmatoarele componente:
Schema acestui modul:
Lista piese:
Cantitate | Denumire |
---|---|
1 | ENC28J60 |
1 | TS8P8C-PCB-TRAF |
1 | crystal 25MHz |
4 | R47 |
3 | R270 |
1 | R2k7 |
2 | R10k |
2 | C15pF |
1 | C10uF |
4 | C100nF |
1 | R240 |
1 | POTENTIOMETRU 5k |
1 | LM317 |
Aceasta placa de extensie contine senzorii de temperatura, umiditate si presiune:
Schema acestui modul:
Lista piese:
Cantitate | Denumire |
---|---|
1 | LM335 |
1 | R2k2 |
Comunicatia intre sistem si browser se face prin pachete TCP. Softul are la baza laboratorul 5 de PM
Datele de la senzorul de temperatura sunt preluate prin ADC.
Functii pentru senzor:
int ADC_get(uint8_t channel) { ADMUX &= 0xE0; ADMUX += channel; loop_until_bit_is_set(ADCSRA,ADIF); return ADC; } void ADC_init(void) { ADMUX = (1 << ADLAR); ADCSRA = (1<<ADEN) | (1 << ADPS2)| (1 << ADPS1) | (1 << ADPS0); } #define VALUE_ON_ZERO 2730 uint16_t print_webpage(uint8_t *buf, uint8_t on_off) { uint16_t plen; plen = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n")); ... // read sensor on ADC0 int temp; temp = 5 * ((1000 * ADC_get(0)) / 1023) - VALUE_ON_ZERO; // autmatically reload page every minute: plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\nRefresh: 60\r\n\r\n")); plen=fill_tcp_data_p(buf,plen,PSTR("<h2>Sensors on Web")); plen=fill_tcp_data(buf,plen,MY_IP_STR); plen=fill_tcp_data_p(buf,plen,PSTR("</h2>\n")); plen=fill_tcp_data_p(buf,plen,PSTR("<pre>\n")); plen=fill_tcp_data_p(buf,plen,PSTR("s0 temperature: ")); itoa(temp,buffer,10); adddecimalpoint(buffer); plen=fill_tcp_data(buf,plen,buffer); plen=fill_tcp_data_p(buf,plen,PSTR("'C [")); itoa(c2f(temp),buffer,10); adddecimalpoint(buffer); plen=fill_tcp_data(buf,plen,buffer); plen=fill_tcp_data_p(buf,plen,PSTR("'F]\n")); plen=fill_tcp_data_p(buf,plen,PSTR("</pre>\n")); plen=fill_tcp_data_p(buf,plen,PSTR("<br>")); plen=fill_tcp_data_p(buf,plen,PSTR("<a href=\"./\">refresh page</a>\n")); ... return plen; }
Functii pentru timp:
void initTimer2(void) { // Configurare timer2 ca sa dea o intrerupere la o milisecunda // (Prescaler & Output Compare Interrupt) TCCR2 = (1 << WGM21) | (1 << CS22); TCNT2 = 0; // init counter OCR2 = 0xFA; // value to compare against TIMSK = (1 << OCIE2); } // Output compare interrupt handler for timer2. SIGNAL(SIG_OUTPUT_COMPARE2) { // "algoritmul" pentru incrementarea secundelor, minutelor si orelor milisec += 1; if (milisec == 1000) { secunde += 1; if (secunde == 60){ secunde = 0; minute += 1; if (minute == 60){ minute = 0; ore += 1; if (ore == 24) ore = 0; } } } } uint16_t print_webpage(uint8_t *buf, uint8_t on_off) { ... plen = fill_tcp_data_p(buf, plen, PSTR("<html><head><META HTTP-EQUIV=REFRESH CONTENT=10></head>" "<body bgcolor=aqua style=\"text-align: center\">Time up<br>")); sprintf(buffer, "%02d:%02d:%02d", ore, minute, secunde); plen = fill_tcp_data(buf, plen, buffer); plen = fill_tcp_data_p(buf, plen, PSTR("</body></html>")); ... }
In urma realizarii placutei de baza am obtinut montajul urmator (se observa si senzorul de demperatura):
Modulul ethernet (vedere fata):
Modulul etehrnet (vedere spate):
Intregul montaj conectat:
In final nu am reusit sa descopar problema cu modulul ethernet. In momentul alimentarii se aprinde ledul pentru link fara sa introduc vreun cablu.
Conectarea prin SPI a controller-ului ethernet ENC28J60 la un ATMega16 produce un sistem capabil sa ofere informatii si cotrol prin internet. Astfel se pot afisa pagini web cu informatii de la diversi senzori si se pot trimite comenzi sistemului pentru a schimba anumiti parametri.
Gasiti aici o arhiva cu fisierele obtinute in urma realizarii proiectului: surse, scheme, etc.