Sensors on Web

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.

Descriere generala

Schema bloc a modulelor hardware:

Schema bloc a modulelor software:

Hardware Design

Modulul Atmel ATMega16

Un tutorial pentru realizarea modulului de baza cu microcontrolerul ATMega16 se gaseste aici.

Modulul Ethernet

Placa de extensie Ethernet are la baza urmatoarele componente:

  • controler Ethernet ENC28J60 (datasheet). Acest chip comunica cu microcontrolerul prin intermediul interfetei SPI.
  • jack 10BASE-T de tip MagJack (datasheet). Jack-ul are led-uri si componente magnetice integrate.

Schema acestui modul:

Lista piese:

Cantitate Denumire
1ENC28J60
1TS8P8C-PCB-TRAF
1crystal 25MHz
4R47
3R270
1R2k7
2R10k
2C15pF
1C10uF
4C100nF
1R240
1POTENTIOMETRU 5k
1LM317

Modulul Senzori

Aceasta placa de extensie contine senzorii de temperatura, umiditate si presiune:

  • senzor temperatura si umiditate LM335(datasheet)

Schema acestui modul:

Lista piese:

CantitateDenumire
1LM335
1R2k2

Software Design

  • Limbaj de programare: C
  • Mediu de dezvoltare si compilare: WinAVR Programmers Notepad

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.

Surse si functii implementate

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>"));
...
}

Jurnal

  • imprimare PCB, gaurire
  • lipit piese pentru placa de baza
  • detectare bug si incarcare bootloader
  • realizat scheme pentru modul de senzor si ethernet
  • cumparat piese
  • lipire modul ethernet
  • am realizat ca nu este buna alimentarea din 5V
  • cumparat piese pentru stabilizator tensiune 3.3V
  • lipire alimentare
  • lipire senzori
  • scris cod
  • incercare de incarcare cod; bootloaderul nu mergea
  • reincarcare bootloader prin SPI
  • programare microcontroller
  • ledul pentru link de la ethernet sta aprins mereu; am cautat tot probleme in hard si nu am gasit nimic
  • am mai modificat putin programul incercand sa identific potentiale probleme
  • am inlocuit condensatorii de la quartz cu unii de 18pF; tot nu merge
  • am inlocuit condensatorii de la RX si TX cu unii de 10nF; tot nu merge

Rezultate Obtinute

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.

Concluzii

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.

Download

Gasiti aici o arhiva cu fisierele obtinute in urma realizarii proiectului: surse, scheme, etc.

Bibliografie/Resurse

Resurse Software

Resurse Hardware

pm/prj2010/dtudose/sow.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