LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

[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,

02

  • 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,

03

  • ekran 3 (poniżej) spełnia funkcje termometru pokojowego z linijką przedstawiająca graficznie tendencje zmian temperatury w pomieszczeniu.

04

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.

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.