'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.0 = Input 'linia PC5 wejście potwierdzenia otwarcia zaworu
Config Pina.1 = 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
C = 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 = -1 : 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 = -1 : 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(i , 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(i , 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(i , 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(i , 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(i , 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(i , 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(i , 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(i , 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(i , 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(i , 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(i , 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 < -3 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