$regfile = "m88def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Portd = &B00001111 'portd 0 1 2 3 jako wyjscia portd 4 jako 1wire 5 6 7 jako wejscia
Portd.5 = 1
Portd.6 = 1
Portd.7 = 1
Portd.3 = 1
Portd.2 = 1
Portd.1 = 1
Portd.0 = 1
Config Portc = Output 'portc jako wyjscia sterowania
Portc.5 = 1
Portc.4 = 1
Portc.3 = 1
Portc.2 = 1
Portc.1 = 1
Portc.0 = 1
Config Portb.6 = Output
Config Portb.7 = Output
Config 1wire = Portd.4 'deklaracja 1wire
Config Timer1 = Timer , Prescale = 256
Declare Sub Wyswietl_czas 'procedura wyświetlająca czas w formacie gg:mm:ss
Declare Sub Menu 'procedura menu
Declare Sub Manual 'sterowanie manualne
On Timer1 Odmierz_1s 'przerwanie do przepełnienia timer1
Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
Dim Nowa As Byte 'flaga zezwolenia aktualizacji czasu na LCD
Dim Wart_bcd As Byte 'zmienna do zapisywania wartości PCD czasu
Dim Odczyt(2) As Byte
Dim A As Byte
Dim C As Byte 'licznik for
Dim T As Integer
Dim E As Byte 'zmienna manual
Dim T1 As Single
Dim B As Byte 'zmienna odczytu kodów ID
Dim W As Byte 'zmienna odczytu ilośc czujników
Dim Dsid1(1) As Byte
Dim F As String * 5 'zmienna do formatu wyświetlanej temp.
Dim I As Byte 'licznik petli for
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia celsjusza
Deflcdchar 1 , 32 , 8 , 11 , 4 , 26 , 2 , 32 , 32 ' wentylator
Deflcdchar 2 , 32 , 17 , 14 , 14 , 14 , 17 , 32 , 32 ' dzien
Deflcdchar 3 , 32 , 6 , 12 , 24 , 24 , 24 , 12 , 6 ' noc
Deflcdchar 4 , 32 , 32 , 4 , 4 , 4 , 21 , 14 , 4 ' strzałka
Deflcdchar 5 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31 ' Test
H Alias Pind.5 'przypisanie pind.5 nazwy H
M Alias Pind.6
Men Alias Pind.7
'przypisanie portom nazw
Grzalka Alias Pinc.0 'Grzałka
Wentylg Alias Pinb.7 'Wentylator grzałki
Fogger Alias Pinc.2 'Nawilżacz
Wentylf Alias Pinb.6 'Wentylator nawilżacza
Dzien Alias Pinc.1 'Światło dzienne(żarówka)
Noc Alias Pinc.3 'Światło nocne(żarówka)
Led Alias Pinc.5 'Oświetlenie dzienne LED
Ext Alias Pinc.4 'Wyjście dodatkowe
Alarm Alias Pind.2 'Dioda alarm
Le Alias Pind.3 'Dioda pracy
Li Alias Pind.1 'Dioda dodatkowa stanu
Enable Interrupts
Enable Timer1
Counter1 = 61630
Set Nowa 'zezwolenie na wyświetlanie czasu
Cursor Off
'***ekran startowy***
Cursor Off 'Wyłącza kursor
Cls
Lcd "Sterownik" 'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Lowerline
Lcd "terrarium"
Locate 1 , 12
Lcd Chr(2) ; Chr(3) ; Chr(4) ' dzien/noc i strzałka stanu
Locate 2 , 12
Lcd Chr(1) ; Chr(1) ; "GFL" 'znaki wyjsc
Wait 2
Dsid1(1) = 1wsearchfirst() 'sprawdza czujnik podpięty do portu
Cls
'procedura ustawiania czasu i wejscia do menu
Do
Cursor Off
If Men = 0 Then
Waitms 200
If Men = 0 Then
Gosub Menu
End If
End If
Call Wyswietl_czas
If M = 0 Then
Waitms 200
If M = 0 Then
Incr Minuty
Sekundy = 0
If Minuty = 60 Then
Minuty = 0
End If
Set Nowa
Call Wyswietl_czas
Waitms 200
End If
End If
If H = 0 Then
Waitms 200
If H = 0 Then
Incr Godziny
If Godziny = 24 Then
Godziny = 0
End If
Set Nowa
Call Wyswietl_czas
Waitms 200
End If
End If
'************* operacje konwersji temperatury *******************************
1wreset 'reset 1wire
1wwrite &HCC 'rozkaz skip rom
1wwrite &H44 'dokonaj konwersji temperatury
Waitms 750 'przeczekaj konwersję
1wreset 'reset 1wire
1wwrite &HCC 'rozkaz skip rom
1wwrite &HBE 'polecenie odczytu DS-a
Odczyt(1) = 1wread(2) 'odczytaj dwa pierwsze bajty do zmiennej
T = Odczyt(2) 'przepisuje starszy bajt do zmiennej Integer
Shift T , Left , 8 'przesuwa ten bajt w lewo na wyższe pozycje
T = T + Odczyt(1) 'przepisz i dodaj młodszy bajt
Waitms 100
T1 = T * 10
T1 = T / 16 'wyraź w st. celsjusza i wpisz do zmiennej single
F = Str(t1) 'wpisz odczyt do string
F = Fusing(t1 , "#.#") 'ustaw format wyświetlania
Locate 1 , 1
Lcd "Temp:" ; F ; Chr(0) 'wyswietlenie temperatury
Locate 2 , 12
Lcd Chr(1) ; Chr(1) ; "GFL" 'znaki wyjsc
' instrukcje sterujace##########
If T1 > 16 And T1 < 30 Then 'Praca normalna w temperaturze od 16 do 30*C
Reset Alarm 'Wyłącz alarm
If Godziny > 8 And Godziny < 20 Then 'Dzień miedzy 8-20
Locate 2 , 10
Lcd Chr(2) 'znak dnia
Locate 1 , 13
Lcd Chr(4) 'znak pracy oswietlenia LED
Set Led 'włącz oswietlenie LED
Reset Noc 'wyłącz oswietlenie nocne
If T1 < 27 Then 'jezeli temp < 27 włącz dodatkowo oświetlenie zarówka
Set Dzien
Else
Reset Dzien 'w przeciwnym wypadku wylącz oświetlenie żarówką
End If
If T1 < 22 Then 'jezeli temp <22
Locate 1 , 12 'znak wentylatora g
Lcd Chr(4)
Locate 1 , 14 'znak grzalki
Lcd Chr(4)
Set Wentylg 'wlacz wentylator g
Set Grzalka 'wlacz grzalke
End If
If T1 > 26 Then 'jezeli temp > 26
Locate 1 , 12 'wyczysc znak went
Lcd " "
Locate 1 , 14 'wyczysc znak grzalki
Lcd " "
Reset Wentylg 'wylacz wentylator g
Reset Grzalka 'wylacz grzalke
End If
Else 'Noc
Locate 2 , 10
Lcd Chr(3) 'znak nocy
Reset Led 'wyłącz oswietlenie LED
Reset Dzien 'wyłacz oswietlenie dzienne
Set Noc 'włącz oswietlenie nocne
If T1 < 20 Then 'jezeli temp <20
Locate 1 , 12 'znak wentylatora g
Lcd Chr(4)
Locate 1 , 14 'znak grzalki
Lcd Chr(4)
Set Wentylg 'wlacz wentylator g
Set Grzalka 'wlacz grzalke
End If
If T1 > 24 Then 'jezeli temp > 24
Locate 1 , 12 'wyczysc znak went
Lcd " "
Locate 1 , 14 'wyczysc znak grzalki
Lcd " "
Reset Wentylg 'wylacz wentylator g
Reset Grzalka 'wylacz grzalke
End If
End If
If Minuty < 30 Then 'włączanie nawilżania co godzine na czas 30 minut
Set Wentylf 'włacz wentylator foggera
Set Fogger 'włącz fogger
Locate 1 , 13 'znak wentylatora f
Lcd Chr(4)
Locate 1 , 15 'znak foggera
Lcd Chr(4)
End If
If Minuty >= 30 Then
Reset Wentylf 'wyłacz wentylator foggera
Reset Fogger 'wyłącz fogger
Locate 1 , 13 'znak wentylatora f
Lcd " "
Locate 1 , 15 'znak foggera
Lcd " "
End If
End If
' Instrukcje bezpieczeństwa######
If T1 >= 30 Then 'Jeżeli temp wieksza niż 30
Set Alarm 'włacz alarm
Set Wentylg 'wlacz wentylator grzalki
Set Wentylf 'wlacz wentylator nawilzacza
Set Fogger 'wlacz nawilzacz
Reset Grzalka 'wylacz grzalke
Reset Dzien 'wylacz oswietlenie dzienne zarowka
Reset Noc 'wylacz oswietlenie nocne zarowka
End If
If T1 <= 16 Then 'Jezeli temperatura mniejsza niz 16
Set Alarm 'wlacz alarm
Reset Wentylf 'wylacz wentylator nawilzacza
Reset Fogger 'wylacz nawilzacz
Set Dzien 'wlacz oswietlenie dzienne
Set Noc 'wlacz oswietlenie nocne
Set Grzalka 'wlacz grzalke
End If
Loop
'procedura do wyświetlania czasu
Sub Wyswietl_czas
If Nowa = 1 Then
Locate 2 , 1
Wart_bcd = Makebcd(godziny) 'zmień wartość godzin na kod BCD
Lcd Bcd(wart_bcd) ; ":" 'wyświetl wartość godzin w kodzie BCD zamienionych na tekst
Wart_bcd = Makebcd(minuty)
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(sekundy)
Lcd Bcd(wart_bcd) ;
Reset Nowa 'resetuj flagę
End If
End Sub
'podprogram obsługi przerwania
Odmierz_1s:
Counter1 = Counter1 + 61630
Incr Sekundy
Set Nowa
If Sekundy = 60 Then
Sekundy = 0
Incr Minuty
If Minuty = 60 Then
Minuty = 0
Incr Godziny
If Godziny = 24 Then
Godziny = 0
End If
End If
End If
Toggle Le
Return
'podprogram menu
Sub Menu
Cursor Off
Cls
Lcd "MENU"
For C = 1 To 12
Waitms 100
Shiftlcd Right
Next
Wait 1
Do
Cls
Locate 1 , 6
Lcd "MENU"
Lowerline
Lcd "M-Manual"
Wait 1
Cls
Locate 1 , 6
Lcd "MENU"
Lowerline
Lcd "Menu - Powrot"
Wait 1
If Men = 0 Then
Waitms 200
If Men = 0 Then
Return
End If
End If
If M = 0 Then
Waitms 200
If M = 0 Then
Gosub Manual
End If
End If
Loop
End Sub
'Podprogram manual
Sub Manual
Cls
Lcd "Manualne"
Lowerline
Lcd "sterowanie"
Wait 1
Cls
Lcd "Menu-powrot"
Wait 1
Cls
Lcd "H-Zmiana stanu"
Lowerline
Lcd "M-Nastepny"
Wait 2
Reset Wentylg
Reset Wentylf
Reset Led
Reset Ext
Reset Dzien
Reset Noc
Reset Fogger
Reset Grzalka
E = 0
Do
If Men = 0 Then
Waitms 200
If Men = 0 Then
Return
End If
End If
If M = 0 Then
Waitms 200
If M = 0 Then
Incr E
Waitms 50
If E = 8 Then
E = 0
End If
End If
End If
Cls
If E = 0 Then
Lcd "Wentylator grzal"
If Wentylg = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 1 Then
Lcd "Wentylator fogge"
If Wentylf = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 2 Then
Lcd "Led"
If Led = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 3 Then
Lcd "EXT"
If Ext = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 4 Then
Lcd "Fogger"
If Fogger = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 5 Then
Lcd "Grzalka"
If Grzalka = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 6 Then
Lcd "Dzien"
If Dzien = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If E = 7 Then
Lcd "Noc"
If Noc = 1 Then
Locate 2 , 1
Lcd "ON"
Else
Lcd "OFF"
End If
End If
If H = 0 Then
Waitms 200
If H = 0 Then
If E = 0 Then
Toggle Wentylg
End If
If E = 1 Then
Toggle Wentylf
End If
If E = 2 Then
Toggle Led
End If
If E = 3 Then
Toggle Ext
End If
If E = 4 Then
Toggle Fogger
End If
If E = 5 Then
Toggle Grzalka
End If
If E = 6 Then
Toggle Dzien
End If
If E = 7 Then
Toggle Noc
End If
Waitms 100
End If
End If
Loop
End Sub