[PROJEKT] Wielokanałowy termometr i termostat z wyświetlaczem OLED [2]
List. 17. Funkcja ekran 2
void ekran2(void){ short i; unsigned char termostatus,chn, kod; poc: td=tg=1; EEWr(11,2);//ekran 2 chn=EERead(21);//aktywny kanał termostatu RestoreTermostat();//odtworzenie z eeprom progu i histerezy OledCls(); OledTxt("Pomiar temperatur",1,0); if(numROMs>1)//więcej niż 1 czujnik OledTxt("Tz=",1,7); OledTxt("Tw=",1,3); while (1) { ConvT(); // konwersja temperatury dla wszsytkich czujników. tmsek=750;//750msek dla zakończenia konwersji while(1){ if(tmsek<=0) break; if(ST==0)//naciśnięcie ośki inpulsatora { while(ST==0); __delay_ms(50); return; } kod=GetEncoder(); if(kod==KOD_IMP_UP||kod==KOD_IMP_DWN)//obrot oski - ustawiane termostatu {ekran4();//ustaw termostat OledCls(); goto poc;} } for(i=1;i<=numROMs;i++) { odczytanie wszystkich temperatur temperature[i] = Get_Temp(i); } termostatus=CheckTermostat(temperature[chn]);//sprawdzenie warunku termostatu if(termostatus==1) { if(chn==1) OledTxt("(*)",18,3); if(chn==2) OledTxt("(*)",18,7); } if(termostatus==0){ if(chn==1) OledTxt(" ",18,3); if(chn==2) OledTxt(" ",18,7); } sprintf(Temperatura, "T1=%-2.2f *C", temperature[1]); if(Temperatura[4]=='.') {Temperatura[6]=Temperatura[5]; Temperatura[5]=Temperatura[4]; Temperatura[4]=Temperatura[3]; Temperatura[3]='0';} DispTempMid(Temperatura+3,3,1); if(numROMs>1){ sprintf(Temperatura, "T1=%-2.2f *C", temperature[2]); if(Temperatura[4]=='.') {Temperatura[6]=Temperatura[5]; Temperatura[5]=Temperatura[4]; Temperatura[4]=Temperatura[3]; Temperatura[3]='0';} DispTempMid(Temperatura+3,3,3); } tmsek=2000; while(1){ if(tmsek<=0) break; if(ST==0){ while(ST==0); __delay_ms(50); return;} kod=GetEncoder(); if(kod==KOD_IMP_UP||kod==KOD_IMP_DWN)//obrot oski - ustawiane termostatu {ekran4();//ustaw termostat OledCls(); goto poc;} } } }
Ekran 3 używa największej czcionki do wyświetlania temperatury z pierwszego czujnika na liście. Oprócz wartości cyfrowej w dolnej części wyświetlacza pojawia się cos w rodzaju analogowego wskaźnika tendencji zmian temperatury. Po każdym pomiarze odczytana wartość jest reprezentowana przez słupek o szerokości 2 pikseli i wysokości od 1 do 24 pikseli.
Założyłem, że temperatura pokojowa będzie się zmieniać od +18stC do +30stC z rozdzielczością co 0.5stC. Daje nam to 12stopni z rozdzielczością 0,5 stopnia czyli 24 zmiany co 0,5stC. Przyrost o 0,5stC powoduje zwiększenie wysokości słupka o 1 piksel. W podobny sposób można dobrać zmianę długości słupków dla innego zakresu temperatur.
Maksymalna wysokość słupków (24 piksele) jest podyktowana rozdzielczością i wielkością matrycy wyświetlacza. Zwiększenie maksymalnej wysokości o kolejne 8 pikseli, a co za tym idzie zwiększenie dokładność wskazań nie było możliwe do wyświetlenia.
Funkcja termostatu
Termometr ma wbudowaną funkcję termostatu z histerezą. Działanie termostatu określają: kanał pomiarowy do którego termostat jest podłączony, temperatura progowa Tt i wartość histerezy. Jeżeli podczas inicjalizacji temperatura jest niższa od temperatury progowej Tt, to przekaźnik jest załączony. Załóżmy, że temperatura rośnie i osiąga wartość Tt. Wtedy przekaźnik się wyłącza i jest wyłączony do momentu, kiedy temperatura nie spadnie do wartości Tt-Th – rysunek 2. Wprowadzenie histerezy jest niezbędne, bo w przeciwnym przypadku niewielkie zmiany temperatury w pobliżu Tt powodowałyby ciągłe załączanie i wyłączanie przekaźnika.
Termostat jest w pełni programowany. Można ustawić histerezę od 0,1oC do 2,5oC z krokiem co 0,1oC, oraz temperaturę progową w całym zakresie pomiarowym. Do programowania jest przeznaczony ekran4 (rysunek poniżej). Można go wywołać z każdego z ekranów pomiaru temperatury przez obrót ośki impulsatora w dowolna stronę.