[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ę.


Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



