[PROJEKT] Wielokanałowy termometr i termostat z wyświetlaczem OLED [2]
Pierwszą część artykułu możesz przeczytać tu.
Działanie termometru
Do magistrali 1-wire można podłączać kilka sensorów. Teoretycznie ich liczba może być duża, ale ze względu na możliwości wyświetlania na zastosowanym wyświetlaczu nie powinno ich być więcej niż 4. Program dopuszcza maksymalnie 20 czujników.
Po wyzerowaniu mikrokontrolera są wykonywane inicjalizacje: wyświetlacza OLED, interfejsu I2C do komunikacji z pamięcią i magistrali 1-wire. Następnie jest wykonywana procedura FindDevices wyszukująca czujniki na magistrali i program przechodzi do wyświetlania jednego z trzech ekranów temperatury:
- ekran 1 (poniżej), na którym wyświetlana jest ilość wykrytych czujników, kanał pomiarowy do którego dołączono funkcję termostatu i w kolejnych wierszach mierzone temperatury z dołączonych czujników,
- ekran 2 (poniżej). Ten ekran jest przeznaczony do realizowania funkcji termometru domowego wyświetlającego 2 temperatury: wewnętrzna i zewnętrzną. Temperatura wewnętrzna jest odczytywana z pierwszego czujnika na liście, a temperatura zewnętrzna z drugiego czujnika na liście. Żeby ekran 2 działał poprawnie potrzebne jest dołączenie przynajmniej 2 czujników do magistrali,
- ekran 3 (poniżej) spełnia funkcje termometru pokojowego z linijką przedstawiająca graficznie tendencje zmian temperatury w pomieszczeniu.
Po włączeniu zasilania z pamięci EEPROM jest odczytywany numer ekranu aktywnego przed wyłączeniem i taki sam ekran zostanie wyświetlony ponownie. Przełączanie pomiędzy ekranami jest wykonywane poprzez przyciskanie ośki impulsatora.
Do wyświetlania informacji na ekranie 1 jest wykorzystana najmniejsza czcionka 8x6pikseli. Nie jest to zbyt czytelne, ale można na ekranie zmieścić najwięcej informacji.
Na listingu 16 pokazano procedurę realizującą funkcje ekranu 1. Na początku z pamięci EEPROM są odtwarzane nastawy termostatu: temperatura progu, histereza i kanał termostatu. Potem jest wyświetlana liczba wykrytych czujników i kanał pomiarowy, do którego jest podłączony termostat. Pomiar temperatury i jej wyświetlanie jest realizowane w nieskończonej pętli. Pomiar temperatury jest wykonywany co 2 sekundy. Po każdym z cykli pomiarowych sprawdzany jest warunek zadziałania termostatu.
List. 16. Funkcja ekran 1
void ekran1(void){ char buf[20]; short i; unsigned char chn, tst, kod; poc:tg=td=1;//bity sterownia termostatem EEWr(11,1);//aktywny ekran RestoreTermostat();//odtworzenie histerezy i progu termostatu chn=EERead(21);//aktywny kanał termostatu OledCls(); sprintf(buf,"ilosc czujnikow = %u",numROMs);//wyświetlenie ilości czujników OledTxtRam(buf,1,0); sprintf(buf,"termostat kanal = %u",chn);//wyświetlenie kanału termostatu OledTxtRam(buf,1,1); while (1) {//pętla główna ConvT(); // Konwersja temperatury tmsek=750;//oczekiwanie 750msek na zakończenie pomiaru while(1){//pętla oczekiwania na akcję if(tmsek<=0)//zakończenie oczekiwania 750msek break; if(ST==0)//naciśnięcie ośki impulsatora { while(ST==0);//naciśnięty przycisk - koniec funkcji __delay_ms(50); return; } kod=GetEncoder(); if(kod==KOD_IMP_UP||kod==KOD_IMP_DWN)//obrót oski – ustawianie termostatu { ekran4();//ustaw termostat OledCls(); goto poc;} } for(i=1;i<=numROMs;i++) { // odczytanie pomiarów ze wszystkich czujników temperature[i] = Get_Temp(i); sprintf (Temperatura,"T%u = %-2.2f *C",i,temperature[i]);//wyświetlanie temperatur OledTxt(" ",1,i+2); OledTxtRam(Temperatura,1,i+2); if(i==chn)//sprawdzenie warunku termostatu { tst=CheckTermostat(temperature[chn]);//sprawdzanie termostatu if(tst==1) OledTxt("(*)",16,chn+2);//wyświetlanie wskaźnika działania termostatu if(tst==0) OledTxt(" ",16,chn+2); } } tmsek=2000;//pomiar co 2 sekundy while(1){ if(tmsek<=0) break; if(ST==0){ while(ST==0);//naciśniecie oski - koniec funkcji __delay_ms(50); return;} kod=GetEncoder(); if(kod==KOD_IMP_UP||kod==KOD_IMP_DWN)//obrót oski - ustawiane termostatu {ekran3(); OledCls(); goto poc;} } } }
Ekran2 do wyświetlania mierzonych temperatur używa czcionki o średnim rozmiarze 16x10pikseli. Widoczność tak wyświetlanych informacji jest zadawalająca nawet z odległości kilku metrów. W założeniu ekran 2 ma pełnić funkcję domowego tremometru do pomiaru temperatury wewnętrznej i zewnętrznej. Rozdzielczość pomiaru została ograniczona do jednego miejsca po przecinku.