'STEROWNIK PIECO C.O. WERSJA 1.8h


$regfile = "m32def.dat"
$crystal = 3686400
$hwstack = 44                                               'domyślnie 32
$swstack = 18                                               '8
$framesize = 34                                             '24
$lib "ds1307clock.lib"                                      ' biblioteka do obsługi zegarka ds1307
'$lib "mcsbyte.lbx"
$baud = 38400
Dim Czy_byl_reset As Bit
Czy_byl_reset = Mcucsr.wdrf                                 'jeśli był reset z watchdoga to mcucsr.wdrf=1
Config Watchdog = 2048                                      'czuwający piesek (co 2 sekundy sprawdza poprawność
Stop Watchdog
Config Serialout = Buffered , Size = 40                     'konfiguracja bufora wyjściowego dla rs232
Config Serialin = Buffered , Size = 4 , Bytematch = 13      'bytematch=13 po odebraniu znaku CR skocz do podprogramu "Serial0charmatch"
Config Lcdbus = 4
Config Lcd = 20 * 4
Initlcd
Cls
'Wyświetlacz LCD 20 * 4 Sygnały jak poniżej
'Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc. 5 , E = Portc.1 , Rs = Portc.0
'KONFIGURACJĘ PINÓW USTAWIĆ W OPCJACH BASCOMA !!!!!!!
'//////////// KONFIGURACJA WEJŚĆ I WYJŚĆ  ///////////////////////////
Ddra = &B11111111                                           'pa2-podśw. lcd,
Ddrb = &B10011000                                           'pb6 i pb7 wejście (impulsator)
Ddrc = &B11111111
Ddrd = &B11111000                                           'pd5 (Oc1a) Wentylator, pd6-pompka CO
Portd = &B11111111
Config Scl = Porta.4                                        'choć nadal trzeba określić jakie końcówki
Config Sda = Porta.3                                        'będą liniami SCL i SDA
Deflcdchar 0 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3               ' znak stopnia Celsjusza
'Deflcdchar 0 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32       'znak stopnia
Cls
Deflcdchar 1 , 28 , 8 , 8 , 3 , 5 , 7 , 4 , 4               ' Tp
Cls
Deflcdchar 2 , 28 , 8 , 8 , 32 , 4 , 7 , 5 , 7              ' Tb
Cls
Deflcdchar 3 , 28 , 8 , 8 , 32 , 7 , 1 , 2 , 7              'Tz
Cls
'Deflcdchar 4 , 28 , 8 , 8 , 1 , 1 , 7 , 5 , 7               'Td
Deflcdchar 4 , 28 , 8 , 8 , 32 , 4 , 5 , 6 , 5              ' Tk
'Deflcdchar 5 , 32 , 4 , 21 , 14 , 14 , 21 , 4 , 32          ' sniezynka
Cls
Deflcdchar 6 , 32 , 9 , 18 , 14 , 10 , 14 , 25 , 2          'wentylator
Cls
Cursor Off : Cls
'////////////////////////////////////////////////////////////////////////
'************************************************************************
'//////////// ZMIENNE UŻYWANE DLA IMPULSATORA I MENU ////////////////////
Config Int0 = Falling                                       'falling to narastające zbocze ?
Enable Interrupts
Enable Int0
On Int0 Aktywacja_impulsatora                               'po naciśnięciu impulsatora skocz do menu
Dim Aktywuj_menu As Bit                                     'zmienna pomocnicza (z przerwania, żeby obsluga impulsatora nie była w przerwaniu)
Dim Tryb As Byte , Rezultat As Integer
Dim Licznik As Byte , A As Byte , C As Byte
Dim Podmenu_1 As Byte , Rozpalanie As Bit , Licz_rozpalanie As Integer       ', Rozpalanie_2 As Bit
Aktywuj_menu = 1                                            'wyłączone wejście do menu
In1 Alias Pinb.0                                            'wejście 1 impulsatora  PINB.6
In2 Alias Pinb.2                                            'wejście 2 impulsatora  PINB.7
Int_0 Alias Pind.2                                          'wejście int0 czyli naciśnięcie impulsatora
Declare Sub Menu
Declare Sub Wyswietlacz
'///////////////////////////////////////////////////////////////////
'*******************************************************************
'//////////// ZMIENNE UŻYWANE DLA TEMPERATURY  ////////////////////
'Declare Sub Procedura_odczytu
Declare Sub Odczyt_temperatury
'Declare Sub Warunki_wyswietlania
'Declare Sub Porownanie_temperatur
Declare Sub Odczyt_nr_ident
'Declare Sub Weryfikacja_adresu
Config 1wire = Portb.1

Dim Liczba_ukl As Byte                                      'liczba czujników na magistrali
Dim I As Byte
Dim Adres(8) As Byte                                        'adres pastylki                                        'deklaracja tablicy zmiennych
Dim T As Integer                                            ', T11 As Single
Dim T1 As Integer
Dim Znak_temp As Bit , Znak_temp_zewn As Bit
Dim X As Byte , Y As Byte , Tbg As Byte , Ts As Byte , Tsd As Byte , Tkomin As Byte
Dim Tb As Byte , Tp As Byte , Tz As Byte , Roznica_z_bojlerem As Integer , Czy_ujemna As Bit
Dim Czas_wlaczenia_podlogowki As Byte
Dim Czas_pracy_bojlera_noc As Word , Czas_pracy_bojlera_dzien As Byte , Licznik_minut As Word , Poprzednia_min As Byte
Dim Min_kontrolna As Byte , Tgaraz As Byte , Twarsztacik As Byte , Tsyp As Byte , Tbaby As Byte
'///////////////////////////////////////////////////////////////////////////
'***************************************************************************
'//////////// ZMIENNE UŻYWANE DLA ELEKTROZAWORÓW ///////////////////////////
Declare Sub Sterowanie_zaworami
Declare Sub Obsluga_bojlera
Declare Sub Obsluga_podlogowki
Config Timer0 = Timer , Prescale = 1024                     'konfiguracja Timer1 jako timer z podziałem preskalera przez 256
Config Pina.= Input                                       'linia PC5 wejście potwierdzenia otwarcia zaworu
Config Pina.= Input                                       'linia PC4 wejście potwierdzenia zamknięcia zaworu
Wlaczaj_zawory Alias Portd.4                                'Przelacz_obroty to przekaznik przelaczajacy
Przelacz_obroty Alias Portd.3                               'otworz_zawory to przekaźnik włączający zawory
Bojler Alias Portb.3                                        'przekaźnik bojlera
Podlogowka Alias Porta.5                                    'przekaźnik podłogówki
Buzzer Alias Portb.4
'Pompka Alias Portd.4
On Ovf0 Odliczanie_czasu
Dim Kontrolka As Bit , Sekundy As Integer                   'zmienne pomocnicze do zabezpieczenia przy uszkodzonych krańcówkach
Dim Sterowanie_zaworow As Byte
'////////////////////////////////////////////////////////////////////////
'************************************************************************
'//////////// ZMIENNE UŻYWANE DLA WENTYLATORA ///////////////////////////

Declare Sub Sterowanie_wentylatorem
Config Timer2 = Timer , Async = Off , Prescale = 1024
On Timer2 Odliczanie_rozpalania
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
                          'konfiguracja Timer1 jako generatora sygnału PWM, rozdzielczość 10 bit, zliczający w dół
                          'maksymalna wartość Pwm1a dla rozdzielczości 10 bitów wynosi 1023 (poziom niski trwa cały czas)
                          'dla Pwm1a=0 poziom wysoki trwa cały czas
                          'dla Prescale=1024 częstotliwość przebiegu wynosi 0,3s
Pwm1a = 0                                                   'wentylator wyłączony (cały czas poziom niski na Pd5)
Pwm1b = 0
Enable Interrupts                                           'odblokowanie globalnego systemu przerwań
Enable Timer0 : Enable Timer2                               'odblokowanie przerwania od przepełnienia Timer0 i Timer2
Load Timer0 , 0                                             'przerwanie wywoływane co 0,06553600s dla Q=4MHz i prescale=1024
Load Timer2 , 0
Stop Timer0 : Stop Timer2
Dim Tpust As Byte , Troznicowa As Byte
Dim Tryb_pracy As Byte
Dim Bylo_rozpalone As Bit , Rozpalanie_nieudane As Byte
'////////////////////////////////////////////////////////////////////////
'************************************************************************
'//////////// ZMIENNE UŻYWANE DLA ZEGARKA     ///////////////////////////
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Declare Sub Zmiana_czasu
'Dim _sec As Byte , _min As Byte , _hour As Byte
'Dim _day As Byte , _month As Byte , _year As Byte
Config Clock = User                                         ' this will dim the bytes automatic
Dim Weekday As Byte , Zmienna As Byte
Dim Dzien_tygodnia As String * 3
Dim Godzina As Byte , Minuta As Byte , Flaga_zmiany_czasu As Bit , Miesiac As Byte , Dzien As Byte
'_day = 27 : _month = 3 : _year = 12 : Weekday = 2           'przekonwertuj
'Gosub Setdate
'_sec = 00 : _min = 18 : _hour = 14
'Gosub Settime

'///////////////////////////////////////////////////////////////////
'*******************************************************************
'//////////// ZMIENNE POZOSTAŁE   ////////////////////
Dim Status_urzadzen As Byte
Tpust = 56 : Tryb_pracy = 3 : Czas_wlaczenia_podlogowki = 20
'Speaker Alias Portd.7       'buzzer
Nad_odb Alias Porta.6                                       'nadawanie/odbiór dla max 485
Led_lcd Alias Porta.2                                       'Podświetlenie LCD
Set Led_lcd                                                 'włącz podświetlanie LED wyświetlacza LCD
Set Nad_odb                                                 'ustaw max 485 do nadawania
Wlaczaj_zawory = 0 : Przelacz_obroty = 0 : Bojler = 0 : Podlogowka = 0 : Buzzer = 0
= 1 : Tryb = 0 : Aktywuj_menu = 1 : Rozpalanie = 1 : Licz_rozpalanie = 0 : Bylo_rozpalone = 0
Rozpalanie_nieudane = 0 : Czas_pracy_bojlera_noc = 0 : Czas_pracy_bojlera_dzien = 0
Sterowanie_zaworow = 1
'Bojler = 1 : Podlogowka = 1 : otworz_zawory = 1 : Buzzer = 1
'Call Wyswietlacz
Gosub Odczyt_temperatury : Gosub Odczyt_temperatury : Gosub Odczyt_temperatury
Pwm1b = 1023 : Pwm1a = 1023
Cls
Locate 1 , 1
Lcd "sterownik pieca co"
Locate 2 , 1
Lcd "   wersja 1.8h "
Locate 3 , 1
Lcd "   kompilacja"
Locate 4 , 1
Lcd "bascom 1.11.9.8"
Wait 2
Pwm1b = 0 : Pwm1a = 0
Readeeprom Tryb_pracy , 1
Readeeprom Tpust , 2
Readeeprom Czas_wlaczenia_podlogowki , 3
Readeeprom Sterowanie_zaworow , 4
Cls
'reset PORTA.2
'gosub Odczyt_nr_ident
Start Watchdog
'***************************************************************************************
'****************   PĘTLA GŁÓWNA PROGRAMU    *******************************************
'***************************************************************************************
Do
    If Aktywuj_menu = 0 Then Gosub Menu                     'jeśli było wywołane przerwanie int0 to skocz do obsługi impulsatora
    Gosub Getdatetime : Gosub Wybor_dnia_tygodnia           'odczyt czasu i dnia tygodnia
    Gosub Zmiana_czasu
    Gosub Odczyt_temperatury
    Gosub Wyswietlacz
    Gosub Sterowanie_wentylatorem
    Gosub Obsluga_podlogowki : Gosub Obsluga_bojlera
    Gosub Sterowanie_zaworami                               'sprawdzaj zawory

Loop


'***************************************************************************************
'****************   PODPROGRAMY    *****************************************************
'***************************************************************************************
'/////////////////////////////////////////////////
'///////////////////    ZEGAREK    ///////////////
'/////////////////////////////////////////////////

Getdatetime:                                                'odczytaj czas
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) : Weekday = Makedec(weekday)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
  Reset Watchdog
Return

Setdate:                                                    'ustaw datę
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year) : Weekday = Makebcd(weekday)       'przekonwertuj
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w
  I2cwbyte 3
  I2cwbyte Weekday                                          ' send address
  I2cwbyte _day                                             ' starting address in 1307
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
  Reset Watchdog
Return

Settime:                                                    'ustaw czas
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
  Reset Watchdog
Return

Wybor_dnia_tygodnia:
  Start Watchdog
  Select Case Weekday
    Case 1 : Dzien_tygodnia = "pon"
    Case 2 : Dzien_tygodnia = " wt"
    Case 3 : Dzien_tygodnia = " sr"
    Case 4 : Dzien_tygodnia = "czw"
    Case 5 : Dzien_tygodnia = "pia"
    Case 6 : Dzien_tygodnia = "sob"
    Case 7 : Dzien_tygodnia = "nie"
  End Select
  Reset Watchdog
Return

'/////////////////////////////////////////////////
'////    IMPULSATOR  CZYLI MENU    ///////////////
'/////////////////////////////////////////////////
Sub Menu
   Initlcd : Reset Watchdog : Set Buzzer : Pwm1a = 0 : Waitms 20       ':InitLCD - może pomoże na krzaki. Toggle Rozpalanie_2  'zmień stan zmiennej rozpalanie_2, żeby drugi raz móc wyłączyć wentylator
   Rezultat = 0 : Tryb = 0 : C = 1 : Licznik = 1 : Podmenu_1 = 0 : Int_0 = 1 : Sekundy = 0
   Disable Int0 : Cls                                       ' Wyłączenie przerwania, wciśnięcie knefla jako akceptacja
   Locate 4 , 1 : Lcd "OPUSC MENU       "
   Locate 3 , 1 : Lcd "USTAW CZAS       "
   Locate 2 , 1 : Lcd "USTAW TEMPERATURE"
   Locate 1 , 1 : Lcd "TRYB PRACY PIECA "
   Reset Watchdog : Wait 1 : Reset Watchdog
   If Int_0 = 0 Then                                        'jeśli w dalszym ciągu wciśnięty knefel
      Toggle Rozpalanie                                     'włącz/wyłącz (naprzemian po kolejnych wejściach do menu) rozpalanie
      Licz_rozpalanie = 0 : Rozpalanie_nieudane = 0         'wyzeruj zmienną i wpisz, że to pierwsza próba rozpalenia
      If Rozpalanie = 0 Then                                'jeśli rozpalasz ogień
         Load Timer2 , 0                                    'uruchom timer 2 do liczenia czasu
         Start Timer2                                       'jakiego potrzebujesz do rozpalenia
      Else
         Stop Timer2 : Licz_rozpalanie = 20001 : Rozpalanie_nieudane = 1       'warunki przerwania rozpalania
      End If
   End If
   Reset Buzzer
   Cursor On : Cursor Blink
   Load Timer0 , 0
   Start Timer0                                             'uruchomienie timera0 do odliczania czasu, jak nic się nie zrobi przez 10s to opuści MENU

   Do
      Gosub Impulsator
      If Licznik > 6 Then Licznik = 1
      If Licznik < 1 Then Licznik = 6                       'TO TRZEBA SPRAWDZIĆ
      If C = 0 Then
          Select Case Licznik
                Case 1:                                     'JESCZE MUSI BYĆ USTAWIANIE TEMP ALARMU
                      Locate 4 , 1 : Lcd "OPUSC MENU       "       'opuszczenie menu bez wprowadzania zmian
                      Locate 3 , 1 : Lcd "USTAW CZAS       "       'ustawienie zegarka
                      Locate 2 , 1 : Lcd "USTAW TEMPERATURE"       'ustawienie utrzymywanej temperatury
                      Locate 1 , 1 : Lcd "TRYB PRACY PIECA " : Podmenu_1 = 1       'ustawienie trybu pracy pieca
                     'Locate 0,1 : Lcd "5 PRACA PODLOGOWKI "
                     'Locate 0,1 : Lcd "6 PRACA ZAWOROW    "

                Case 2:
                      Locate 4 , 1 : Lcd "PRACA ZAWOROW    "
                      Locate 3 , 1 : Lcd "OPUSC MENU       "       'opuszczenie menu bez wprowadzania zmian
                      Locate 2 , 1 : Lcd "USTAW CZAS       "       'ustawienie zegarka
                      Locate 1 , 1 : Lcd "USTAW TEMPERATURE" : Podmenu_1 = 2       'ustawienie utrzymywanej temperatury
                     'Locate 0 , 1 : Lcd "4 TRYB PRACY PIECA "        'ustawienie trybu pracy pieca
                     'Locate 0 , 1 : Lcd "5 PRACA PODLOGOWKI "

                Case 3:
                      Locate 4 , 1 : Lcd "PRACA PODLOGOWKI "
                      Locate 3 , 1 : Lcd "PRACA ZAWOROW    "
                      Locate 2 , 1 : Lcd "OPUSC MENU       "       'opuszczenie menu bez wprowadzania zmian
                      Locate 1 , 1 : Lcd "USTAW CZAS       " : Podmenu_1 = 3       'ustawienie zegarka
                     'Locate 0 , 1 : Lcd "3 USTAW TEMPERATURE"        'ustawienie utrzymywanej temperatury
                     'Locate 0 , 1 : Lcd "4 TRYB PRACY PIECA "        'ustawienie trybu pracy pieca

                Case 4:
                      Locate 4 , 1 : Lcd "TRYB PRACY PIECA "       'ustawienie trybu pracy pieca
                      Locate 3 , 1 : Lcd "PRACA PODLOGOWKI "
                      Locate 2 , 1 : Lcd "PRACA ZAWOROW    "
                      Locate 1 , 1 : Lcd "OPUSC MENU       " : Podmenu_1 = 0       'opuszczenie menu bez wprowadzania zmian
                     'Locate 0 , 1 : Lcd "2 USTAW CZAS       "        'ustawienie zegarka
                     'Locate 0 , 1 : Lcd "3 USTAW TEMPERATURE"        'ustawienie utrzymywanej temperatury

                Case 5:
                      Locate 4 , 1 : Lcd "USTAW TEMPERATURE"       'ustawienie utrzymywanej temperatury
                      Locate 3 , 1 : Lcd "TRYB PRACY PIECA "       'ustawienie trybu pracy pieca
                      Locate 2 , 1 : Lcd "PRACA PODLOGOWKI "
                      Locate 1 , 1 : Lcd "PRACA ZAWOROW    " : Podmenu_1 = 5
                     'Locate 0 , 1 : Lcd "1 OPUSC MENU       "        'opuszczenie menu bez wprowadzania zmian
                     'Locate 0 , 1 : Lcd "2 USTAW CZAS       "        'ustawienie zegarka

                Case 6:
                      Locate 4 , 1 : Lcd "USTAW CZAS       "       'ustawienie zegarka
                      Locate 3 , 1 : Lcd "USTAW TEMPERATURE"       'ustawienie utrzymywanej temperatury
                      Locate 2 , 1 : Lcd "TRYB PRACY PIECA "       'ustawienie trybu pracy pieca
                      Locate 1 , 1 : Lcd "PRACA PODLOGOWKI " : Podmenu_1 = 4
                     'Locate 0 , 1 : Lcd "6 PRACA ZAWOROW    "
                     'Locate 0 , 1 : Lcd "1 OPUSC MENU       "        'opuszczenie menu bez wprowadzania zmian

          End Select
          C = 1
      End If
      If Int_0 = 0 Then Sekundy = 900                       'opuść pętle, gdy upłynęła minuta
   Loop Until Sekundy = 900                                 'opuść pętle, gdy upłynęła minuta
   Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0
   Waitms 300 : Reset Buzzer

   If Podmenu_1 = 1 Then                                    'jeśli wybrane podmenu "TRYB PRACY PIECA" wtedy wykonaj
       Reset Watchdog : Rezultat = 0 : Tryb = 0 : C = 1 : Licznik = 1 : Adres(7) = Tryb_pracy
       Cls                                                  ': Disable Int0       'wyłączenie przerwania, wciśnięcie knefla jako akceptacja
       Locate 4 , 1 : Lcd "OPUSC MENU         "
       Locate 3 , 1 : Lcd "TRYB DZIENNY       "
       Locate 2 , 1 : Lcd "TRYB NOCNY         "
       Locate 1 , 1 : Lcd "TRYB DZIEN I NOC   "
       Load Timer0 , 0                                      'uruchomienie timera0 do odliczania czasu,
       Start Timer0                                         'jak nic się nie zrobi przez 10s to opuści MENU
       Do
         Gosub Impulsator
         If Licznik > 4 Then Licznik = 1
         If Licznik < 1 Then Licznik = 4
         If C = 0 Then
            Select Case Licznik
               Case 1:
                     Locate 4 , 1 : Lcd "OPUSC MENU         "       'Opusc menu
                     Locate 3 , 1 : Lcd "TRYB DZIENNY       "       ' wentylator pracuje tylko w dzień
                     Locate 2 , 1 : Lcd "TRYB NOCNY         "       ' wentylator pracuje tylko w nocy
                     Locate 1 , 1 : Lcd "TRYB DZIEN I NOC   " : Tryb_pracy = 1       'wentylator pracuje zawsze
               Case 2:
                     Locate 4 , 1 : Lcd "TRYB DZIEN I NOC   "
                     Locate 3 , 1 : Lcd "OPUSC MENU         "
                     Locate 2 , 1 : Lcd "TRYB DZIENNY       "
                     Locate 1 , 1 : Lcd "TRYB NOCNY         " : Tryb_pracy = 2
               Case 3:
                     Locate 4 , 1 : Lcd "TRYB NOCNY         "
                     Locate 3 , 1 : Lcd "TRYB DZIEN I NOC   "
                     Locate 2 , 1 : Lcd "OPUSC MENU         "
                     Locate 1 , 1 : Lcd "TRYB DZIENNY       " : Tryb_pracy = 3
               Case 4:
                     Locate 4 , 1 : Lcd "TRYB DZIENNY       "
                     Locate 3 , 1 : Lcd "TRYB NOCNY         "
                     Locate 2 , 1 : Lcd "TRYB DZIEN I NOC   "
                     Locate 1 , 1 : Lcd "OPUSC MENU         " : Tryb_pracy = Adres(7)       ': Exit Do
            End Select
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0
      Writeeeprom Tryb_pracy , 1                            'pod adresem 1 w eeprom jest Tryb pracy
      Waitms 300 : Reset Buzzer : Reset Watchdog
   End If

   If Podmenu_1 = 2 Then                                    'jeśli wybrane podmenu "USTAW TEMPERATURE" wtedy wykonaj
       Reset Watchdog : Rezultat = 0 : Tryb = 0 : C = 1
       Cls                                                  ': Disable Int0       'wyłączenie przerwania, wciśnięcie knefla jako akceptacja
       Licznik = Tpust                                      'przypisanie zmiennej 'licznik' 'ustawioną temperaturę'
       Locate 1 , 1 : Lcd "USTAW. ZADANEJ TEMP "
       Locate 3 , 1 : Lcd "    Tpust=" ; Tpust
       Load Timer0 , 0                                      'uruchomienie timera0 do odliczania czasu,
       Start Timer0                                         'jak nic się nie zrobi przez 10s to opuści MENU
       Do
         Gosub Impulsator
         If Licznik > 98 Then Licznik = 1
         If Licznik < 1 Then Licznik = 99
         If C = 0 Then
            Tpust = Licznik                                 'przypisanie zmiennej 'Tpust' zmiennej 'Licznik'
            Locate 1 , 1 : Lcd "USTAW. ZADANEJ TEMP "
            Locate 3 , 1 : Lcd "    Tpust="
            If Tpust > 9 Then
               Lcd Tpust
            Else
               Lcd "0" ; Tpust
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0
      Writeeeprom Tpust , 2                                 'pod adresem 2 jest temp ustawiona
      Waitms 300 : Reset Buzzer
   End If

   If Podmenu_1 = 3 Then                                    'jeśli wybrane podmenu "USTAW CZAS" wtedy wykonaj
       Rezultat = 0 : Tryb = 0 : C = 1
       Cls                                                  ': Disable Int0       'wyłączenie przerwania, wciśnięcie knefla jako akceptacja
       Gosub Getdatetime                                    ': _min = Makedec(_min)
       Licznik = _min                                       'przypisanie zmiennej 'licznik' 'MINUTY'
       Locate 1 , 1 : Lcd "  USTAWIANIE CZASU  "
       Locate 2 , 1 : Lcd "    ustaw minuty    "
       Locate 3 , 1 : Lcd "     " ; _hour ; ":" ; _min ; "     "
       Load Timer0 , 0                                      'uruchomienie timera0 do odliczania czasu,
       Start Timer0                                         'jak nic się nie zrobi przez 10s to opuści MENU
       Do                                                   'ustawianie minut
         Gosub Impulsator
         If Licznik > 59 Then Licznik = 0
         If Licznik < 0 Then Licznik = 59
         If C = 0 Then
            _min = Licznik : _sec = 0                       ': _min = Makebcd(_min) : _sec = Makebcd(_sec)
'            Locate 1 , 1 : Lcd "  USTAWIANIE CZASU  "
'            Locate 2 , 1 : Lcd "    ustaw minuty    "
            Locate 3 , 9
            If _min < 10 Then
               Lcd "0" ; _min ; "   "
            Else
               Lcd _min ; "    "
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0 : Gosub Settime
      Waitms 300 : Reset Buzzer : Cls

      Gosub Getdatetime : Licznik = _hour                   ' : _hour = Makedec(_hour)            'przypisanie zmiennej
      Locate 1 , 1 : Lcd "  USTAWIANIE CZASU  "
      Locate 2 , 1 : Lcd "   ustaw godziny    "
      Locate 3 , 1 : Lcd "     " ; _hour ; ":" ; _min ; "     "
      Load Timer0 , 0                                       'uruchomienie timera0 do odliczania czasu,
      Start Timer0                                          'jak nic się nie zrobi przez 10s to opuści MENU
      Do
         Gosub Impulsator
         If Licznik > 23 Then Licznik = 0
         If Licznik < 0 Then Licznik = 23
         If C = 0 Then
            _hour = Licznik : _sec = 0                      ': _hour = Makebcd(_hour)  : _sec = Makebcd(_sec)
'            Locate 1 , 1 : Lcd "  USTAWIANIE CZASU  "
'            Locate 2 , 1 : Lcd "   ustaw godziny    "
            Locate 3 , 7
            If _hour < 10 Then
               Lcd "0" ; _hour ; " "
            Else
               Lcd _hour ; "  "
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0 : Gosub Settime
      Waitms 300 : Reset Buzzer : Cls

      Gosub Getdatetime : Licznik = _year                   'przypisanie zmiennej
      Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
      Locate 2 , 1 : Lcd "     ustaw rok      "
      Locate 3 , 1 : Lcd "      " ; _day ; ":" ; _month ; ":" ; _year ; "     "
      Load Timer0 , 0                                       'uruchomienie timera0 do odliczania czasu,
      Start Timer0                                          'jak nic się nie zrobi przez 10s to opuści MENU
      Do
         Gosub Impulsator
         If Licznik > 99 Then Licznik = 0
         If Licznik < 0 Then Licznik = 99
         If C = 0 Then
            _year = Licznik
'            Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
'            Locate 2 , 1 : Lcd "     ustaw rok      "
            Locate 3 , 13
            If _year < 10 Then
               Lcd "0" ; _year
            Else
               Lcd _year
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0 : Gosub Setdate
      Waitms 300 : Reset Buzzer : Cls

      Gosub Getdatetime : Licznik = _month                  ':_month = Makedec(_month)             'przypisanie zmiennej
      Cls
      Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
      Locate 2 , 1 : Lcd "   ustaw miesiac    "
      Locate 3 , 1 : Lcd "      " ; _day ; ":" ; _month ; ":" ; _year ; "     "
      Load Timer0 , 0                                       'uruchomienie timera0 do odliczania czasu,
      Start Timer0                                          'jak nic się nie zrobi przez 10s to opuści MENU
      Do
         Gosub Impulsator
         If Licznik > 12 Then Licznik = 1
         If Licznik < 1 Then Licznik = 12
         If C = 0 Then
            _month = Licznik                                ' przypisanie zmiennej
'            Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
'            Locate 2 , 1 : Lcd "   ustaw miesiac    "
            Locate 3 , 10
            If _month < 10 Then
               Lcd "0" ; _month
            Else
               Lcd _month
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0 : Gosub Setdate
      Waitms 300 : Reset Buzzer : Cls

      Gosub Getdatetime : Licznik = _day                    'przypisanie zmiennej
      Cls
      Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
      Locate 2 , 1 : Lcd "    ustaw dzien     "
      Locate 3 , 1 : Lcd "      " ; _day ; ":" ; _month ; ":" ; _year ; "     "
      Load Timer0 , 0                                       'uruchomienie timera0 do odliczania czasu,
      Start Timer0                                          'jak nic się nie zrobi przez 10s to opuści MENU
      Do
         Gosub Impulsator
         If Licznik > 31 Then Licznik = 1
         If Licznik < 1 Then Licznik = 31
         If C = 0 Then
            _day = Licznik
'            Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
'            Locate 2 , 1 : Lcd "    ustaw dzien     "
            Locate 3 , 7
            If _day < 10 Then
               Lcd "0" ; _day
            Else
               Lcd _day
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0 : Gosub Setdate
      Waitms 300 : Reset Buzzer : Cls

      Gosub Getdatetime : Licznik = Weekday                 'przypisanie zmiennej
      Gosub Wybor_dnia_tygodnia
      Cls
      Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
      Locate 2 , 1 : Lcd "ustaw dzien tygodnia"
      Locate 3 , 1 : Lcd "      " ; Dzien_tygodnia ; "     "
      Load Timer0 , 0                                       'uruchomienie timera0 do odliczania czasu,
      Start Timer0                                          'jak nic się nie zrobi przez 10s to opuści MENU
      Do
         Gosub Impulsator
         If Licznik > 7 Then Licznik = 1
         If Licznik < 1 Then Licznik = 7
         If C = 0 Then
            Weekday = Licznik
            Gosub Wybor_dnia_tygodnia
'            Locate 1 , 1 : Lcd "  USTAWIANIE DATY   "
'            Locate 2 , 1 : Lcd "ustaw dzien tygodnia"
            Locate 3 , 1
            Lcd "      " ; Dzien_tygodnia ; "     "
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Set Buzzer : Stop Timer0 : Sekundy = 0 : Gosub Setdate
      Waitms 300 : Reset Buzzer : Cls
   End If

   If Podmenu_1 = 4 Then                                    'jeśli wybrane podmenu "PRACA PODŁOGÓWKI" wtedy wykonaj
       Rezultat = 0 : Tryb = 0 : C = 1
       Cls                                                  ': Disable Int0       'wyłączenie przerwania, wciśnięcie knefla jako akceptacja
       Licznik = Czas_wlaczenia_podlogowki                  'przypisanie zmiennej 'licznik' 'ustawioną temperaturę'
       Locate 1 , 1 : Lcd "USTAW CZAS NA JAKI"
       Locate 2 , 1 : Lcd " MA BYC  WLACZONE "
       Locate 3 , 1 : Lcd "OGRZEW. PODLOGOWE "
       Locate 4 , 1 : Lcd "   Min/Godz=" ; Czas_wlaczenia_podlogowki       'ilość minut na godzinę
       Load Timer0 , 0                                      'uruchomienie timera0 do odliczania czasu,
       Start Timer0                                         'jak nic się nie zrobi przez 10s to opuści MENU
       Do
         Gosub Impulsator
         If Licznik > 60 Then Licznik = 1
         If Licznik < 1 Then Licznik = 59
         If C = 0 Then
            Czas_wlaczenia_podlogowki = Licznik             'przypisanie zmiennej 'Tpust' zmiennej 'Licznik'
            Locate 1 , 1 : Lcd "USTAW CZAS NA JAKI"
            Locate 2 , 1 : Lcd " MA BYC  WLACZONE "
            Locate 3 , 1 : Lcd "OGRZEW. PODLOGOWE "
            Locate 4 , 1 : Lcd "   Min/Godz="               'ilość minut na godzinę
            If Czas_wlaczenia_podlogowki > 9 Then
               Lcd Czas_wlaczenia_podlogowki
            Else
               Lcd "0" ; Czas_wlaczenia_podlogowki
            End If
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Reset Watchdog : Stop Timer0 : Sekundy = 0
      Writeeeprom Czas_wlaczenia_podlogowki , 3             'pod adresem 3 w eeprom jest czas wlaczenia podlogowki
      Waitms 300 : Reset Watchdog
   End If

   If Podmenu_1 = 5 Then                                    'jeśli wybrane podmenu "PRACA PODŁOGÓWKI" wtedy wykonaj
       Rezultat = 0 : Tryb = 0 : C = 1
       Cls                                                  ': Disable Int0       'wyłączenie przerwania, wciśnięcie knefla jako akceptacja
       Locate 4 , 1 : Lcd "RECZNE OTW./ZAMYK. "
       Locate 3 , 1 : Lcd "ZAMKNIJ ZAWORY     "
       Locate 2 , 1 : Lcd "OTWORZ ZAWORY      "
       Locate 1 , 1 : Lcd "OPUSC BEZ OTW/ZAMYK"
       Load Timer0 , 0                                      'uruchomienie timera0 do odliczania czasu,
       Start Timer0                                         'jak nic się nie zrobi przez 10s to opuści MENU
       Do
         Gosub Impulsator
         If Licznik > 3 Then Licznik = 1
         If Licznik < 1 Then Licznik = 3
         If C = 0 Then
            Select Case Licznik
               Case 1:
                     Locate 4 , 1 : Lcd "RECZNE OTW./ZAMYK. "
                     Locate 3 , 1 : Lcd "ZAMKNIJ ZAWORY     "
                     Locate 2 , 1 : Lcd "OTWORZ ZAWORY      "
                     Locate 1 , 1 : Lcd "PRACA AUTOMATYCZNA " : Sterowanie_zaworow = 1       'praca w automacie, zależnie od temperatur na piecu i bojlerze
               Case 2:
                     Locate 4 , 1 : Lcd "RECZNE OTW./ZAMYK. "
                     Locate 3 , 1 : Lcd "PRACA AUTOMATYCZNA "
                     Locate 2 , 1 : Lcd "ZAMKNIJ ZAWORY     "
                     Locate 1 , 1 : Lcd "OTWORZ ZAWORY      " : Sterowanie_zaworow = 2       'otwarcie ręcznie na stałe
               Case 3:
                     Locate 4 , 1 : Lcd "RECZNE OTW./ZAMYK. "
                     Locate 3 , 1 : Lcd "OTWORZ ZAWORY      "
                     Locate 2 , 1 : Lcd "PRACA AUTOMATYCZNA "
                     Locate 1 , 1 : Lcd "ZAMKNIJ ZAWORY     " : Sterowanie_zaworow = 3       'zamknięcie ręcznie na stałe
            End Select
            C = 1
         End If
         If Int_0 = 0 Then Sekundy = 900
      Loop Until Sekundy = 900                              'opuść pętle, gdy upłynęła minuta
      Stop Timer0 : Sekundy = 0
      Writeeeprom Sterowanie_zaworow , 4                    'pod adresem 1 w eeprom jest sterowani_zaworow
      Waitms 300 : Reset Watchdog
   End If

   Print "x"                                                'polecenie wyczyszczenia ekranu tv (każde wejście do menu czyści ekran tv)
   Reset Watchdog : Set Buzzer
   Cursor Off : Cursor Noblink : Cls
   Aktywuj_menu = 1 : Waitms 500
   Deflcdchar 0 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3            ' znak stopnia Celsjusza
   Deflcdchar 1 , 28 , 8 , 8 , 3 , 5 , 7 , 4 , 4            ' Tp
   Deflcdchar 2 , 28 , 8 , 8 , 32 , 4 , 7 , 5 , 7           ' Tb
   Deflcdchar 3 , 28 , 8 , 8 , 32 , 7 , 1 , 2 , 7           'Tz
   Deflcdchar 4 , 28 , 8 , 8 , 1 , 1 , 7 , 5 , 7            'Td
   Deflcdchar 6 , 32 , 9 , 18 , 14 , 10 , 14 , 25 , 2       'wentylator
   Cls
   Reset Watchdog : Reset Buzzer : Set Gifr.intf0 : Enable Int0       'wyzerowanie flagi zgłoszenia przerwania
End Sub

'PODPROGRAM ZMIANY CZASU Z LETNIEGO NA ZIMOWY I ODWROTNIE
Sub Zmiana_czasu
Miesiac = _month
Dzien = _day

If Miesiac = 3 And Dzien >= 25 Then                         'zmiana czasu na letni (ostatnia niedziela marca)
   Gosub Polnoc
   If Weekday = 7 Then                                      'jeśli dniem tygodnia jest ostatnia niedziela marca wtedy
      Godzina = _hour : Minuta = _min
      If Godzina = 2 And Minuta = 0 Then                    'jeśli jest 2 w nocy
         _hour = 3                                          'przestaw czas na letni (godzina do przodu), flagi nie trzeba zmieniać (czas przestawiany do przodu)
         Gosub Settime
      End If
   End If
End If

If Miesiac = 10 And Dzien >= 25 Then                        'zmiana czasu na zimowy (ostatnia niedziela października)
   Gosub Polnoc
   If Weekday = 7 Then                                      'jeśli akurat jest ostatnia niedziela miesiąca
      Godzina = _hour : Minuta = _min
      If Godzina = 3 And Minuta = 0 Then                    'jeśli jest 3 w nocy wtedy
         If Flaga_zmiany_czasu = 0 Then                     'jeśli ustawiona flaga zmiany czasu to
            _hour = 2 : Flaga_zmiany_czasu = 1              'cofnij czas o godzinę i zmień flagę, żeby ponownie nie przestawiać czasu
            Gosub Settime
         End If
      End If
   End If
End If
End Sub

Polnoc:
'   Weekday = Dayofweek()                                    'przepisz dzień tygodnia (1 dla poniedziałku, 7 dla niedzieli)
'   Weekday = Weekday + 1                                    'dayofweek liczony jest w zakresie 0-6 (0 to poniedziałek)
   If _hour = 0 And _min = 0 Then                           'jeśli jest północ
         Flaga_zmiany_czasu = 0                             'przestaw flagę zmiany czasu
   End If
Return

Impulsator:
   Reset Watchdog
   If Sekundy = 900 Then                                    'jeśli minęło ok 60 sek.
      Stop Timer0                                           'zatrzymaj timer0
'      sekundy = 900 'i opuść menu
   End If                                                   'odmierzanie minuty w celu wyjścia, gdy nie ma akcji
   Rezultat = 0 : C = 1
   Select Case Tryb
      Case 0:
         If In1 = 1 And In2 = 1 Then Incr Tryb              'jezeli dwa rozwarte
      Case 1:
         If In1 = 1 And In2 = 0 Then
            Rezultat = 1 : C = 0
            Incr Tryb
         End If
         If In1 = 0 And In2 = 1 Then
            Rezultat = -: C = 0
            Incr Tryb
         End If
      Case 2:
            If In1 = 0 And In2 = 0 Then Incr Tryb
      Case 3:
            If In1 = 1 And In2 = 0 Then
               Rezultat = -: C = 0 : Tryb = 0
            End If
            If In1 = 0 And In2 = 1 Then
               Rezultat = 1 : C = 0 : Tryb = 0
            End If
   End Select
   Licznik = Licznik + Rezultat
   Reset Watchdog
'   If Podmenu_1 = 2 Then
'      If Licznik > 98 Then Licznik = 1
'      If Licznik < 1 Then Licznik = 99
'   End If
'   If
'      If Licznik > 4 Then Licznik = 1
'      If Licznik < 1 Then Licznik = 0
'   End If
Return
'*******************************************************************************************************************************************
'/////////////////////////////////////////////////////////////
'////    POMIARY I WYŚWIETLANIE TEMPERATUR     ///////////////
'/////////////////////////////////////////////////////////////
Sub Odczyt_temperatury
   Reset Watchdog
   Gosub Konwersja_temperatury                              'wyślij polecenie konwersji temperatury do wszystkich czujników

   For I = 0 To 8                                           'TEMPERATURA BOJLERA
       Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_pieca)                  'odczyt adresu czujnika z BOJLERA
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' jeśli go nie ma
      Locate 2 , 1 : Gosub Kreski                           ' wyświetl "*****" na LCD
   Else
      Gosub Procedura_odczytu
      Tb = T1                                               'przepisz temperaturę pieca do zmiennej Tp
      Locate 2 , 1 : Lcd Chr(2) ; "="                       'wyświetl na poz."1,1" "Tp="
      Y = 2 : X = 3                                         'określenie pozycji na wyświetlaczu LCD
      Gosub Warunki_wyswietlania
      Gosub Wyswietl_temp                                   'Temperatura wyświetlana na pozycji "1,1"
   End If

   For I = 0 To 8                                           'TEMPERATURA PIECA
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_bojlera)                'TEMPERATURA PIECA (SĄ ZAMIENIONE ADRESY W PAMIĘCI)
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          'jeśli go nie ma
      Locate 3 , 1 : Gosub Kreski
   Else
      Gosub Procedura_odczytu
      Tp = T1                                               'przepisz temperaturę pieca do zmiennej Tb
      Locate 3 , 1 : Lcd Chr(1) ; "="                       'wyświetl na poz."2,1" "Tb="
      Y = 3 : X = 3                                         'określenie pozycji na wyświetlaczu LCD
      Gosub Warunki_wyswietlania
      Gosub Wyswietl_temp                                   'Temperatura wyświetlana na pozycji "2,1"
   End If

   Gosub Porownanie_temperatur                              'sprawdzenie różnicy temperatur między piecem a bojlerem

   For I = 0 To 8                                           'TEMPERATURA ZEWNĘTRZNA
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_temp_zewn)
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
      Locate 2 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tz = T1                                               'przepisz temperaturę pieca do zmiennej Tz
      Locate 2 , 9 : Lcd Chr(3) ; "="                       'wyświetl na poz."1,8" "Tz="
      Y = 2 : X = 11                                        'określenie pozycji na wyświetlaczu LCD
      Gosub Warunki_wyswietlania
      Gosub Wyswietl_temp                                   'Temperatura wyświetlana na pozycji "1,8"
      If Znak_temp = 1 Then                                 'potrzebne do wyświetlania na TV
          Znak_temp_zewn = 1
      Else
          Znak_temp_zewn = 0
      End If
   End If

   For I = 0 To 8                                           'TEMPERATURA W SALONIE
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_temp_salon)
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Ts = T1                                               'przepisz temperaturę pieca do zmiennej Tpok
'      Locate 3 , 9 : Lcd Chr(4) ; "="                       'wyświetl na poz."1,8" "Td="
'      Y = 3 : X = 11                                        'określenie pozycji na wyświetlaczu LCD
'      Gosub Warunki_wyswietlania
'      T1 = Tkomin                                           'CHWILOWO, ŻEBY MIEĆ PODGLĄD TEMP. W KOMINIE NA WYŚW. LCD
'      Gosub Wyswietl_temp                                   'Temperatura wyświetlana na pozycji "2,8"
   End If

   For I = 0 To 8                                           ' TEMPERATURA BOJLERA GÓRA
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_bojlera_gora)
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tbg = T1                                              'przepisz temperaturę bojlera góra do zmiennej Tbg
   End If

   For I = 0 To 8                                           ' TEMPERATURA BOJLERA GÓRA
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_temp_salon_gora)        'czujnik temp w salonie dół
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tsd = T1                                              'przepisz temperaturę bojlera góra do zmiennej Tbg
   End If

   For I = 0 To 8                                           ' TEMPERATURA BABY ROOM (POKÓJ DZIECI)
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_baby_room)              'czujnik temp w pokoju u dzieci
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tbaby = T1                                            'przepisz temperaturę
   End If

   For I = 0 To 8                                           ' TEMPERATURA W SYPIALNI
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_sypialnia)              'czujnik temp w sypialni
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tsyp = T1                                             'przepisz temperaturę
   End If

   For I = 0 To 8                                           ' TEMPERATURA WARSZTACIK
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_warsztacik)             'czujnik temp w warsztaciku
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Twarsztacik = T1                                      'przepisz temperaturę
   End If

    For I = 0 To 8                                          ' TEMPERATURA GARAŻ
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_garaz)                  'czujnik temp w garażu
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
'      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tgaraz = T1                                           'przepisz temperaturę
   End If

    For I = 0 To 8                                          ' TEMPERATURA GARAŻ
      Adres(i) = 0
   Next I
   For I = 1 To 8
      Adres(i) = Lookup(, Czujnik_komin)                  'czujnik temp w garażu
   Next I
   Gosub Weryfikacja_adresu                                 'sprawdź, czy urządzenie jest na magistrali
   If Err = 1 Then                                          ' if there is no sensor
      Locate 3 , 9 : Gosub Kreski                           ' we put "*****" on LCD
   Else
      Gosub Procedura_odczytu
      Tkomin = T1                                           'przepisz temperaturę pieca do zmiennej Tpok
      Locate 3 , 9 : Lcd Chr(4) ; "="                       'wyświetl na poz."1,8" "Td="
      Y = 3 : X = 11                                        'określenie pozycji na wyświetlaczu LCD
      Gosub Warunki_wyswietlania
      Gosub Wyswietl_temp                                   'Temperatura wyświetlana na pozycji "2,8"
   End If

End Sub

Konwersja_temperatury:
      Reset Watchdog
      If Rozpalanie = 0 Then                                'jeśli jest rozpalanie, wtedy trzeba wyłączyć na chwilkę przerwania
         Stop Timer2
      End If
      1wreset : 1wwrite &HCC : 1wwrite &H44                 'wysłanie do wszystkich czujników rozkazu konwersji temp.
      If Rozpalanie = 0 Then                                'no i teraz włączyć z powrotem
         Start Timer2
      End If
      Reset Watchdog
      Wait 1                                                'odczekanie na konwersję
      Reset Watchdog
Return

Procedura_odczytu:
      If Rozpalanie = 0 Then                                'jeśli jest rozpalanie, wtedy trzeba wyłączyć na chwilkę przerwania
         Stop Timer2
      End If
      Reset Watchdog
      1wreset : 1wwrite &H55 : 1wwrite Adres(1) , 8 : 1wwrite &HBE
      Reset Watchdog
      Adres(1) = 1wread(2)                                  'odczytaj 2 bajty (dla oszczędności wykorzystuję zmienne adres)
      If Rozpalanie = 0 Then                                'no a teraz włączyć
         Start Timer2
      End If
      If Adres(2) >= 248 Then                               'jeśli temperatura ujemna
         Adres(1) = 255 - Adres(1) : Adres(2) = 255 - Adres(2)       'dokonaj przeliczeń
         Znak_temp = 1                                      'zaznacz, że temp ujemna
      Else
         Znak_temp = 0                                      'zaznacz, że temp dodatnia
      End If
      T1 = Adres(1) \ 16                                    'podziel przez 16
      T = Adres(2) * 16
      T1 = T1 + T                                           'i dodaj obydwie części temperatury
      Reset Watchdog
Return

Weryfikacja_adresu:
    Reset Watchdog
    If Rozpalanie = 0 Then                                  'jeśli jest rozpalanie, wtedy trzeba wyłączyć na chwilkę przerwania
       Stop Timer2
    End If
    1wverify Adres(1)
    If Rozpalanie = 0 Then                                  'no a teraz znów włączyć
       Start Timer2
    End If
    Reset Watchdog
Return

Warunki_wyswietlania:
     Reset Watchdog
     If T1 > 9 Then                                         'jeśli temperatura jest dwucyfrowa
        If Znak_temp = 1 Then                               'i jest ujemna
            Locate Y , X : Lcd "-"                          'wyświetl na poz."1,3" minus
        Else                                                'jeśli dodatnia
            Locate Y , X : Lcd " "                          'na pozycji "1,3" spacja
        End If
     Else                                                   'jeśli jednocyfrowa
        If Znak_temp = 1 Then                               'i ujemna
            If T1 = 0 Then                                  'jeśli T=0 wtedy nie wyświetlaj minusa tylko spacje
              Locate Y , X : Lcd "  "                       'na pozycji "1,3" i "1,4"  spacja
            Else
              Locate Y , X : Lcd " -"                       'na poz."1,3" spacja, na "1,4" minus
            End If
        Else                                                'jeśli dodatnia
            Locate Y , X : Lcd "  "                         'na "1,3" i "1,4" pozycji spacja
        End If
     End If
     Reset Watchdog
Return

Kreski:
   Lcd Chr(42) ; Chr(42) ; Chr(42) ; Chr(42) ; Chr(42) ; Chr(42) ; " "       ' wyświetl "***** " na LCD
Return

Wyswietl_temp:
   Lcd T1 ; Chr(0)                                          ' CRC OK, print T*10 on LCD
Return

Porownanie_temperatur:
   Roznica_z_bojlerem = Tb - Tp                             'różnica temp między bojlerem a piecem
Return

Sub Wyswietlacz
       Reset Watchdog
       Locate 1 , 1
       If _hour < 10 Then
          Lcd " " ; _hour ; ":"
       Else
          Lcd _hour ; ":"
       End If
       If _min < 10 Then
          Lcd "0" ; _min
       Else
           Lcd _min
       End If
       Locate 1 , 8
       If _day < 10 Then
          Lcd "0" ; _day ; ":"
       Else
          Lcd _day ; ":"
       End If
       If _month < 10 Then
          Lcd "0" ; _month ; ":"
       Else
          Lcd _month ; ":"
       End If
       If _year < 10 Then
          Lcd "0" ; _year
       Else
           Lcd _year
       End If
       Lcd "  " ; Dzien_tygodnia
       Locate 4 , 1
       Lcd "Tzad=" ; Tpust ; Chr(0)
       Locate 4 , 12 : Lcd "Tryb "
       Select Case Tryb_pracy
              Case 1 : Lcd "DiN"
              Case 2 : Lcd "N  "
              Case 3 : Lcd "D  "
       End Select
       Reset Watchdog
      'wyświetlanie na tv (ok 18 wierszy jest dostępnych a kolumn dokładnie 38 - od 32 do 70)
       Print "A " ; "Tp= " ; Tp ; Chr(94) ; "C " : Waitms 60       'wyświetlenie Temperatury Pieca
       Print "B " ; "Tb= " ; Tb ; Chr(94) ; "C " : Waitms 60       'Wyświetlenie Temperatury Bojlera środek
       Print "C " ; "Tbg= " ; Tbg ; Chr(94) ; "C " : Waitms 60       'wyświetlenie Temperatury Bojlera na wypływie
       If Znak_temp_zewn = 1 Then                           'wyświetlenie temp. zewn. na TV w zależności od znaku
          If Tz = 0 Then                                    'eliminacja minusa sprzed "0 stopnia C"
             Print "D " ; "Tz= " ; " " ; Tz ; Chr(94) ; "C "       'czy ujemna
          Else
             Print "E " ; "Tz= " ; "-" ; Tz ; Chr(94) ; "C "       'czy ujemna
          End If
       Else
          Print "F " ; "Tz= " ; " " ; Tz ; Chr(94) ; "C "   'czy dodatnia
       End If
       Waitms 60

       Print "G " ; "Ts= " ; Ts ; Chr(94) ; "C " : Waitms 60

       Print "H " ; "Tsd= " ; Tsd ; Chr(94) ; "C " : Waitms 60

       Print "n " ; "Tdz= " ; Tbaby ; Chr(94) ; "C " : Waitms 60

       Print "o " ; "Twar= " ; Twarsztacik ; Chr(94) ; "C " : Waitms 60

       Print "p " ; "Tsyp= " ; Tsyp ; Chr(94) ; "C " : Waitms 60

       Print "q " ; "Tgar= " ; Tgaraz ; Chr(94) ; "C " : Waitms 60

       Print "r " ; "Tkom= " ; Tkomin ; Chr(94) ; "C " : Waitms 60       'dodano temperaturę w kominie

       If Kontrolka = 1 Then                                'jeśli zawory otwarte
          Print "I " ; "Zawory zamkniete "
       Else
          Print "J " ; " Zawory otwarte  "
       End If
       Waitms 60
       If Bojler = 1 Then                                   'jeśli bojler włączony
          Print "K " ; "Bojler wlaczony "
       Else
          Print "L " ; "Bojler wylaczony"
       End If
       Waitms 60
       Reset Watchdog
       If Czas_wlaczenia_podlogowki < 10 Then
              Print "M " ; "Ogrzewanie podlogowe min/godz=" ; Czas_wlaczenia_podlogowki ; "  "
       Else
              Print "N " ; "Ogrzewanie podlogowe min/godz=" ; Czas_wlaczenia_podlogowki ; "  "
       End If
       Waitms 60
       Select Case Tryb_pracy
          Case 1 : Print "O " ; "Ust. tryb pracy pieca: " ; "Dzien i Noc "       '35 kolumn, czyli znaków w linii max
          Case 2 : Print "P " ; "Ust. tryb pracy pieca: " ; "Noc         "
          Case 3 : Print "Q " ; "Ust. tryb pracy pieca: " ; "Dzien       "
       End Select
      Waitms 50

      Print "R " ; "Ust. temp. pieca= " ; Tpust ; Chr(94) ; "C   " : Waitms 60

      Print "S " ; "BOJLER: Dzien=" ; Czas_pracy_bojlera_dzien ; "min      Noc=" ; Czas_pracy_bojlera_noc ; "min  " : Waitms 60

      If _hour < 10 Then
         Print "a " ; _hour ; ":"
      Else
         Print "b " ; _hour ; ":"
      End If
      Waitms 90
      If _min < 10 Then
         Print "c " ; "0" ; _min ; "     "
      Else
         Print "d " ; _min ; "     "
      End If
      Waitms 90
      If _day < 10 Then
         Print "e " ; "0" ; _day ; ":"
      Else
         Print "f " ; _day ; ":"
      End If
      Waitms 60
      If _month < 10 Then
         Print "g " ; "0" ; _month ; ":"
      Else
         Print "h " ; _month ; ":"
      End If
      Waitms 60
      If _year < 10 Then
         Print "i " ; "200" ; _year ; "    " ; Weekday
      Else
         Print "j " ; "20" ; _year ; "    " ; Weekday
      End If
      Waitms 60
      Reset Watchdog
      If Pwm1b = 0 Then                                     'jeśli pompka co wyłączona
         Print "k 0"                                        'wyślij zero
      Else                                                  'jeśli włączona
         Print "k 1"                                        'wyślij 1
      End If
      Waitms 50
      If Pwm1a = 0 Then                                     'jeśli wentylator wyłączony
         Print "l 0"                                        'wyślij zero
      Else
         Print "l 1"
      End If
      Waitms 50
      If Podlogowka = 0 Then                                'jeśli podłogówka jest wyłączona
         Print "m 0"                                        'wyślij 0
      Else
         Print "m 1"
      End If
      Waitms 50 : Reset Watchdog
End Sub


'*******************************************************************************************************************************************
'//////////////////////////////////////////////////////////////////
'///////////////    STEROWANIE ELEKTROZAWORAMI     ////////////////   Roznica_z_bojlerem=Tb-Tp
'//////////////////////////////////////////////////////////////////
Sub Sterowanie_zaworami
    Select Case Sterowanie_zaworow
           Case 1 :                                         'AUTOMATYCZNE STEROWANIE ZAWORAMI
                   If Roznica_z_bojlerem < -And Tp > 40 Then Gosub Otworz_zawory       'jeśli różnica jest ujemna i temp na piecu większa niż 40 stopni
                   If Roznica_z_bojlerem >= 0 Then Gosub Zamknij_zawory       'jeśli temperatura bojlera większa lub równa temp. pieca
           Case 2 :                                         'RĘCZNE OTWARCIE ZAWORÓW
                   Sterowanie_zaworow = 0                   'to żeby drugi raz nie wchodził do otwierania zaworów
                   Kontrolka = 1                            'to, żeby wykonał otwieranie zaworów, bez względu, co było wcześniej
                   Gosub Otworz_zawory                      'no i sam skok do otwierania
           Case 3 :                                         'RĘCZNE ZAMKNIĘCIE ZAWORÓW
                   Sterowanie_zaworow = 0
                   Kontrolka = 0
                   Gosub Zamknij_zawory
    End Select
End Sub

Otworz_zawory:
      Reset Watchdog
      Poprzednia_min = _min : Poprzednia_min = Poprzednia_min + 1       'dodane też tutaj, bo jeśli godzina >22 a zawory otwarte to nie zacznie zliczać
      If Poprzednia_min = 60 Then Poprzednia_min = 0        'gdyby teraz zamknął te zawory
'      If Pinc.5 = 0 Then       'i zawór jest zamknięty
      If Kontrolka = 1 Then                                 'i wcześniej nie włączał otwierania zaworów
            Pwm1a = 0                                       'wyłącz wentylator
            Kontrolka = 0 : Bojler = 0                      'i wyłącz bojler
            Przelacz_obroty = 1                             ': otworz_zawory = 0       'włącz otwieranie zaworu
    '            Locate 4 , 19 : Lcd Chr(6)                      'bojler
            Start Timer0
            Do
               Reset Watchdog : Waitms 30
               If Sekundy = 500 Then                        'jeśli upłynęło 30 sekund
                  Load Timer0 , 0                           'odmierza czas równy 0,06553600s dla Q=4MHz i prescale=1024
                  Stop Timer0
                  Sekundy = 0
                  Exit Do
               End If
            Loop
    '            otworz_zawory = 1       'przekaźnik podający napięcie wyłączony
    '      Else
    '         otworz_zawory = 1       'przekaźnik podający napięcie wyłączony
    '         Kontrolka = 1
      End If
      Reset Watchdog                                        ': Set Gifr.intf0                       'wyzerowanie flagi zgłoszenia przerwania
Return

Zamknij_zawory:
         Reset Watchdog
'      If Pinc.4 = 0 Then       'i zawór jest otwarty
         If Kontrolka = 0 Then                              'i wcześniej nie włączał zamykania zaworów
            Pwm1a = 0                                       'wyłącz wentylator
            Kontrolka = 1                                   'zmiana stanu kontrolki
            Przelacz_obroty = 0                             ': otworz_zawory = 0       'włącz zamykanie zaworu
'            Locate 2 , 1 : Lcd " ZAMYKAM ZAWORY "
            Start Timer0                                    'włącz odmierzanie czasu
            Do                                              'zabezpieczenie w razie uszkodzonej krańcówki-trzeba dołożyć przekaźnik wyłączający
               Reset Watchdog : Waitms 30
               If Sekundy = 500 Then                        'i po 30 sekundach (500 przepełnień timera)
                  Load Timer0 , 0                           'odmierza czas równy 0,06553600s dla Q=4MHz i prescale=1024
                  Stop Timer0
                  Sekundy = 0
                  Exit Do                                   'wyjdź z pętli
               End If
            Loop
'            otworz_zawory = 1       'przekaźnik podający napięcie wyłączony
'      Else
'         otworz_zawory = 1       'przekaźnik podający napięcie wyłączony
'         Kontrolka = 1
         End If
         Reset Watchdog                                     ': Set Gifr.intf0                    'wyzerowanie flagi zgłoszenia przerwania
Return

Sub Obsluga_bojlera                                         'jest tu problem odnośnie zliczania czasu. Jeśli zawory są otwarte to program tu nie skacze. Wtedy nie wejdzie
    Reset Watchdog                                          'w Case Else i nie zacznie zliczania (poprzednia_min). No i w ten sposób min_kontrolna nigdy nie zrówna się z poprzednia_min
    If Kontrolka = 1 Then                                   'jeśli zawory są zamknięte
       Select Case _hour
           Case 13 To 14 :                                  ' Jeśli godzina zawiera się między 13 a 15 wtedy włącz bojler
                           If Tb < 70 Then                  'jeśli temp. na bojlerze mniejsza niż 70 stopni
                              If Min_kontrolna = Poprzednia_min Then       'jeśli minęła minuta
                                 Czas_pracy_bojlera_noc = 0 'wyzeruj zmienną z nocy
                                 Incr Czas_pracy_bojlera_dzien       'zwiększ zmienną
                                 Incr Poprzednia_min : If Poprzednia_min = 60 Then Poprzednia_min = 0
                              End If
                              Bojler = 1                    'włącz bojler
                           End If
                           If Tb > 72 Then Bojler = 0       'jeśli większa od 72 stopni wyłącz bojlera                                     '
           Case Is > 21 :                                   'jeśli godzina większa niż 21 wtedy włącz bojler
                           If Tb < 70 Then                  'jeśli temp. na bojlerze mniejsza niż 70 stopni
                              If Min_kontrolna = Poprzednia_min Then       'jeśli minęła minuta
                                 Czas_pracy_bojlera_dzien = 0       'wyzeruj zmienną z dnia
                                 Incr Czas_pracy_bojlera_noc       'zwiększ zmienną
                                 Incr Poprzednia_min : If Poprzednia_min = 60 Then Poprzednia_min = 0
                              End If
                              Bojler = 1                    'włącz bojler
                           End If
                           If Tb > 72 Then Bojler = 0       'jeśli większa od 72 stopni  'wyłącz bojler
           Case Is < 6 :                                    'jeśli godzina mniejsza niż 6 wtedy włącz bojler
                           If Tb < 70 Then                  'jeśli temp. na bojlerze mniejsza niż 70 stopni
                              If Min_kontrolna = Poprzednia_min Then       'jeśli minęła minuta
                                 Czas_pracy_bojlera_dzien = 0       'wyzeruj zmienną z dnia
                                 Incr Czas_pracy_bojlera_noc       'zwiększ zmienną
                                 Incr Poprzednia_min : If Poprzednia_min = 60 Then Poprzednia_min = 0
                              End If
                              Bojler = 1                    'włącz bojler
                           End If
                           If Tb > 72 Then Bojler = 0       'jeśli większa od 72 stopni 'wyłącz bojler
       Case Else :
                           Bojler = 0                       'a jeśli jest inna godzina to wyłącz bojler
                           Poprzednia_min = _min : Poprzednia_min = Poprzednia_min + 1       'przepisz do zmiennej pomocniczej przy pomiarze czasu
                           If Poprzednia_min = 60 Then Poprzednia_min = 0       '+1 żeby rozpocząć pomiar czasu po minucie (będzie mały błąd ale ok)
       End Select
    Else
       Bojler = 0                                           'wyłącz grzanie elektryczne przy włączonych zaworach
    End If
    Min_kontrolna = _min                                    'potrzebne do przeliczenia czasu włączenia bojlera
    Reset Watchdog
End Sub

Sub Obsluga_podlogowki
   If Tp > 35 Then                                          'jeśli temp. na piecu większa niż 35 stopni
      Select Case _min
          Case 1 To Czas_wlaczenia_podlogowki:              ' Jeśli minuty są między 1 a ustawionym czasem wtedy włącz podłogówkę u Remusa
                                                If Tsd < 22 Then Podlogowka = 1       'dodatkowo, jeśli temp w salonie u Remusa jest mniejsza od 22 stopni to włącz podłogówkę
       Case Else
           Podlogowka = 0                                   'a jeśli jest inna minuta
      End Select
      If Tryb_pracy = 1 Then                                'jeśli tryb pracy 1 czyli "DZIEŃ I NOC"
         If _hour < 7 And _hour > 22 Then                   'jeśli czas w przedziale 23-6, czyli godziny na podtrzymanie
            If Tp < 42 Then                                 'i jeśli Tp < 42 stopni
               Pwm1b = 0                                    'wtedy wyłącz pompkę
            Else                                            ' a jeśli wyższa niż 41 stopnia
               Pwm1b = 1023                                 'wtedy włącz pompkę
            End If
         Else                                               'a jeśli czas jest w przedziale 7-22
            Pwm1b = 1023                                    'wtedy włącz pompkę CO
         End If
      End If
      If Tryb_pracy = 2 Then                                'jeśli tryb pracy "NOC"
         If Tp < 42 Then                                    'i Tp<42 stopnie
            Pwm1b = 0                                       'wyłącz pompkę
         Else                                               'jeśli wyższe niż 42 stopnie
            Pwm1b = 1023                                    'wtedy włącz pompkę
         End If
      End If
      If Tryb_pracy = 3 Then Pwm1b = 1023                   'jeśli tryb pracy "DZIEŃ" wtedy włącz POMPKĘ CO powyżej 35 stopni
   Else
      If Tp < 34 Then                                       'żeby była histereza
         Pwm1b = 0                                          'wyłącz pompkę CO
         Podlogowka = 0                                     'wyłącz podłogówkę
      End If
   End If
   If Tp > 48 Then Pwm1b = 1023                             'dodatkowe zabezpieczenie w przypadku błędu w programie
   If Tp > 85 Then                                          'jeśli temp na piecu wzrosła powyżej 85 stopni
      Set Buzzer                                            'włącz alarm
   Else                                                     'jeśli jest mniejsza niż 85 stopni
      Reset Buzzer                                          'wyłącz alarm
   End If
   Reset Watchdog
End Sub

'*******************************************************************************************************************************************
'//////////////////////////////////////////////////////////////
'///////////////    STEROWANIE WENTYLATOREM     ///////////////
'//////////////////////////////////////////////////////////////

Sub Sterowanie_wentylatorem
    Reset Watchdog
    If Rozpalanie = 0 Then                                  'jeśli wcisnąłeś knefel rozpalania
       Pwm1a = 1023                                         'włącz wentylator
       Tpust = Tpust - 6                                    'różnica, przy której zakończy się rozpalanie
       If Tp > Tpust Then                                   'jeśli temp. pieca zbliża się do temp. ustalonej
          Stop Timer2 : Licz_rozpalanie = 20001 : Rozpalanie = 1       'zatrzymaj odliczanie czasu
       End If
       Tpust = Tpust + 6                                    'i powrót, żeby błędów nie było

       If Tp > 35 Then                                      'trzeci z warunków kończący rozpalanie
          Stop Timer2 : Licz_rozpalanie = 20001 : Rozpalanie = 1       'zakońćzenie rozpalania
       End If

       If Licz_rozpalanie > 20000 Then                      'jeśli zliczyłeś już 20 minut lub tp>tpust lub tp>35
          Stop Timer2 : Licz_rozpalanie = 0                 'zatrzymaj odliczanie
          If Tp > 35 Then                                   'jeśli temp pieca większa niż 35 stopni
             Rozpalanie = 1 : Bylo_rozpalone = 1 : Pwm1a = 0       'zmienne określające rozpalenie w piecu
          Else                                              'a jeśli mniejsza niż 35 stopni
             Rozpalanie = 1 : Bylo_rozpalone = 0 : Pwm1a = 0       'rozpalanie zakonczone, ale jest nieudane
          End If
       End If
    End If

    If Tp > 35 Then                                         'jeśli na piecu temperatura przekracza 35 stopni
       If Tryb_pracy = 1 Then                               'Tryb pracy "DZIEŃ I NOC", czyli normalna praca biorąc pod uwagę temp. spalin w kominie
           Troznicowa = Tpust - Tp
           Pwm1b = 1023
           Select Case Troznicowa                           'max różnica temperatur między ustawioną a temp. pieca to 70 stopni (wystarczająco)
              Case 5 To 70 :
                             If Tkomin > 67 Then            'jeśli temp w kominie większa niż 85 stopni
                                 Pwm1a = 0                  'wentylator wyłączony, żeby nie nachajcować za bardzo
                             Else                           'jeśli jest mniejsza niż 85 stopni
                                 Pwm1a = 1023               'wentylator włączony z pełną mocą (cały czas poziom wysoki na Pd5)
                             End If
              Case 3 To 4 :
                             If Tkomin < 64 Then
                                 Pwm1a = 550                'wentylator włączony z połową mocy
                             Else
                                 Pwm1a = 0
                             End If

              Case 1 To 2 :
                             If Tkomin < 64 Then
                                 Pwm1a = 140                'wentylator włączony z 1/4 mocy
                             Else
                                 Pwm1a = 0
                             End If
           Case Else
              Pwm1a = 0 : Bylo_rozpalone = 0                'wyłącz wentyl. i przygotuj do kolejnego rozpalnia
           End Select
       End If

       If Tryb_pracy = 3 Then                               'Tryb pracy "DZIEŃ", czyli praca w trybie dziennym - grzeje cały czas
           Troznicowa = Tpust - Tp
           Pwm1b = 1023
           Select Case Troznicowa                           'max różnica temperatur między ustawioną a temp. pieca to 70 stopni (wystarczająco)
              Case 5 To 70 : Pwm1a = 1023                   'wentylator włączony z pełną mocą (cały czas poziom wysoki na Pd5)
              Case 3 To 4 : Pwm1a = 550                     'wentylator włączony z połową mocy
              Case 1 To 2 : Pwm1a = 140                     'wentylator włączony z 1/4 mocy
           Case Else
              Pwm1a = 0 : Bylo_rozpalone = 0                'wyłącz wentyl. i przygotuj do kolejnego rozpalnia
           End Select
       End If
    End If

    If Tp < 34 Then                                         'jeśli Tp<33 (dla zachowania histerezy
      If Rozpalanie = 1 Then
          If Tryb_pracy = 1 Or Tryb_pracy = 3 Then          'jeśli tryb pracy "DZIEŃ I NOC" wtedy
             Pwm1a = 0                                      'wyłącz wentylator
             Bylo_rozpalone = 0
          End If
      End If
    End If

    If Tryb_pracy = 2 Then                                  'Tryb pracy "NOC", czyli podtrzymanie 50 stopni w kominie, bez znaczenia temp na piecu
       If Tp < 52 Then                                      'jeśli temp na piecu mniejsza niż
          Troznicowa = 50 - Tkomin                          'utrzymuj 50 stopni w kominie
          Select Case Troznicowa
             Case 5 To 20 :
                            Pwm1a = 1023                    'wentylator włączony z pełną mocą (cały czas poziom wysoki na Pd5) i wyłączona pompka
             Case 3 To 4 :
                            Pwm1a = 550                     'wentylator włączony z połową mocy
             Case 1 To 2 :
                            Pwm1a = 140                     'wentylator włączony z 1/4 mocy
          Case Else
             Pwm1a = 0 : Bylo_rozpalone = 0                 'wyłącz wentyl. i przygotuj do kolejnego rozpalania
          End Select
       End If
    End If                                                  '
    Reset Watchdog
End Sub

Sub Odczyt_nr_ident
'    Stop Watchdog
'    Cls
'    Liczba_ukl = 1wirecount()                               'odczytanie liczby układów'dołączonych do magistrali'1-Wire
'    Adres(1) = 1wsearchfirst()                              'wyszukaj adres pierwszego układu
'    Locate 1 , 1
'    For I = 1 To 8                                          'pętla wykonywana 8 razy
'       Writeeeprom Adres(i) , I                             'zapisanie odczytanego ID do 'pamięci EEPROM w słowach 1...8
'       Lcd Adres(i) ; " "                                   'wyświetl na lcd adres pierwszego czujnika w hex, bo dziesiętnie może się nie zmieścić
'       If I = 4 Then Locate 2 , 1
'    Next I
'Do

'Loop
'(
    Y = 8                                                   'zmienna pomocnicza do adresowania eeeprom
    If Liczba_ukl > 1 Then                                  'jeśli więcej niż 1 czujnik
       Adres(1) = 1wsearchnext()                            'wyszukuje drugi czujnik którym będzie Tb
       Locate 3 , 1
       For I = 1 To 8
           Incr Y                                           'zwiększa o 1 adres w eeprom (zaczyna od 9 dla drugiego adresu)
           Writeeeprom Adres(i) , Y
           Lcd Adres(i) ; " "                               'wyświetl na lcd adres drugiego czujnika
           If I = 4 Then Locate 4 , 1
       Next I
       Y = 16
       Adres(1) = 1wsearchnext()                            'wyszukuje trzeci czujnik którym będzie Tb
       Locate 3 , 1
       For I = 1 To 8
           Incr Y                                           'zwiększa o 1 adres w eeprom (zaczyna od 17 dla trzeciego adresu)
           Writeeeprom Adres(i) , Y
           Lcd "Adr_3=" ; Hex(adres(i)) ; " "               'wyświetl na lcd adres trzeciego czujnika
       Next I
       Y = 24
       Adres(1) = 1wsearchnext()                            'wyszukuje czwarty czujnik którym będzie Tb
       Locate 4 , 1
       For I = 1 To 8
           Incr Y                                           'zwiększa o 1 adres w eeprom (zaczyna od 25 dla czwartego adresu)
           Writeeeprom Adres(i) , Y
           Lcd "Adr_4=" ; Hex(adres(i)) ; " "               'wyświetl na lcd adres czwartego czujnika
       Next I
       Y = 32
       Adres(1) = 1wsearchnext()                            'wyszukuje piąty którym będzie Tbojlera u góry (wyswietlanie na tv)
'       Locate 4 , 1
       For I = 1 To 8
           Incr Y                                           'zwiększa o 1 adres w eeprom (zaczyna od 33 dla piątego adresu)
           Writeeeprom Adres(i) , Y
'           Lcd "Adr_5=" ; Hex(adres(i)) ; " "               'wyświetl na lcd adres czwartego czujnika
       Next I

    End If

'    Do
'    Loop
'    Wait 10

    If Liczba_ukl > 1 Then
        Decr Liczba_ukl                                     'pomniejszone o już odczytany
        Y = 8
        For I = 1 To 8
            Adres(1) = 1wsearchnext()                       'znajdź drugi adres
            Incr Y                                          'w celu zapisania adresu w eeprom od komórki 9 do 16
            Writeeeprom Adres(i) , Y                        'zapisz adres
        Next I
    End If
')
End Sub

'***************************************************************************************
'****************   PRZERWANIA    *******************************************
'***************************************************************************************
Aktywacja_impulsatora:                                      'przerwanie od przycisku impulsatora
   Disable Int0
'   waitms 1                                                 'eliminacja pików mniejszych od 1ms
   If Int_0 = 0 Then Aktywuj_menu = 0
   Set Gifr.intf0 : Enable Int0                             'zerowanie flagi zgłoszenia przerwania i włączenie przerwania
Return


Odliczanie_czasu:                                           'podprogramu obsługi przerwania od przepełnienia Timer0
  Stop Timer0
  Incr Sekundy
  Load Timer0 , 0                                           'odmierza czas równy 0,06553600s dla Q=4MHz i prescale=1024
  Start Timer0
Return

Odliczanie_rozpalania:
  Stop Timer2
  Incr Licz_rozpalanie
  Load Timer2 , 0
  Start Timer2
Return

Serial0charmatch:                                           'odebrany znak z rs232
'  Config Watchdog = 16                                      'konfiguruj krótki czas dla zresetowania procka i update programu
'  Cls : Locate 2 , 1 : Lcd "  Update program  "             'wyświetl na lcd
'  Start Watchdog                                            'start watchdog
'  Wait 1                                                    'ponieważ czas oczekiwania = 1 sekunda procek się zresetuje
Return


'ADRESY CZUJNIKÓW TEMPERATURY
Czujnik_pieca:
Data 0 , 40 , 116 , 69 , 120 , 1 , 0 , 0 , 126              '  0 , 40 , 253 , 145 , 71 , 1 , 0 , 0 , 145

Czujnik_bojlera:
Data 0 , 40 , 253 , 145 , 71 , 1 , 0 , 0 , 145              '0 , 40 , 116 , 69 , 120 , 1 , 0 , 0 , 126

Czujnik_temp_zewn:
Data 0 , 40 , 26 , 191 , 199 , 1 , 0 , 0 , 190

Czujnik_temp_salon:
Data 0 , 40 , 11 , 215 , 181 , 1 , 0 , 0 , 82               'z wtykiem

Czujnik_bojlera_gora:
Data 0 , 40 , 203 , 137 , 199 , 1 , 0 , 0 , 85              'z kabelkiem telef

Czujnik_temp_salon_gora:
Data 0 , 40 , 163 , 177 , 25 , 1 , 0 , 0 , 153              'z kabelkami

Czujnik_sypialnia:
Data 0 , 40 , 107 , 203 , 220 , 3 , 0 , 0 , 128

Czujnik_baby_room:
Data 0 , 40 , 100 , 253 , 220 , 3 , 0 , 0 , 188

Czujnik_warsztacik:
Data 0 , 40 , 113 , 173 , 169 , 3 , 0 , 0 , 176

Czujnik_garaz:
Data 0 , 40 , 16 , 213 , 220 , 3 , 0 , 0 , 62

Czujnik_komin:
Data 0 , 40 , 151 , 250 , 254 , 0 , 0 , 0 , 85

'Czujnik_rezerwa:
'Data 0 , 16 , 57 , 58 , 40 , 0 , 8 , 0 , 163     'ds1820