Hi, noch mal....
Hier mal meine erste Variante für eine Aquariumsteuerung mit einem Mega8.
Du kannst es dir ja mal ansehen.
Die Pin- und Portbelegung findest du ganz oben am Anfang!
Das Programm ist allerdings schon aus Januar 2008.....
Inzwischen würde ich einige Dinge wohl anders aufbauen und programmieren!
Es hat auch nur ein 16x2 Display und
keine DCF77 Uhr.
Dies allein würde ich heute schon nicht mehr so erstellen!
Nimm es also nur als "Ideengeber" !
CodeBox Bascom
' LCD an PB5-2, PD7, PB0
' PC0 ist 1Wire-DS1820
' PC1 ist Menueknopf
' PC2 ist Weiter-Knopf
' PC3 ist + -Knopf
' PC4 ist - -Knopf
' PD2 ist Wasserstand-Alarm "Sensor"
' PD3 ist Filterwechsel Knopf
' PD0 ist Ausgang-Heizung
' PD1 ist Ausgang Co2
' PD4 ist Ausgang Licht
' PD5 ist akustischer Signalgeber
' PD6 ist Displaybeleuchtung
$regfile = "m8def.dat"
$crystal = 1000000
' Configuriere das LCD
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portd.7 , Rs = Portb.0
Config Lcdbus = 4
Cursor Off
Ddrb = &B11_1111 '1 ist Ausgang 0 ist Eingang
Portb = &B00_0000 'auf Hi oder Low setzen
' Bestimme die Ein und Ausgänge
Ddrd = &B1111_0011 '1 ist Ausgang 0 ist Eingang
Portd = &B0000_1100 'auf Hi oder Low setzen
Ddrc = &B0_0000 '1 ist Ausgang 0 ist Eingang
Portc = &B1_1111 'auf Hi oder Low setzen
' Konfiguriere den Timer und die Ausgänge
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 8
Config Debounce = 30
Config 1wire = Portc.0
Deflcdchar 0 , 24 , 24 , 6 , 9 , 8 , 9 , 6 , 32 ' Grad Celsius
Deflcdchar 1 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ' Trennstrich
' Bestimme die Variablen
Config Single = Scientific , Digits = 1
Dim Ist_temp As Single ' Ist-Temperatur
Dim Temp As Word '
Dim Temp1 As Integer '
Dim Scratch(9) As Byte '
Dim I As Byte '
Dim Soll_temp As Single ' Sollwert D
Dim Schalten_ein As Byte ' Einschaltzeit Beleuchtung
Dim Schalten_aus As Byte ' Ausschaltzeit Beleuchtung
Dim Co2_ein As Byte ' Einschaltzeit Ausgang 2
Dim Co2_aus As Byte ' Ausschaltzeit Ausgang 2
Dim Schalten_ein2 As Byte ' Einschaltzeit Beleuchtung
Dim Schalten_aus2 As Byte ' Ausschaltzeit Beleuchtung
Dim Co2_ein2 As Byte ' Einschaltzeit Ausgang 2
Dim Co2_aus2 As Byte
Dim Bel As Word ' Dimmervariable für Beleuchtung
Dim Wtz As Byte ' Zähler für den Wochentag
Dim Z1 As Byte ' Zähler
Dim Z2 As Byte ' Zähler für automatischen Rücksprung aus dem Menü
Dim Wtag As String * 10 ' Wochentag
Dim Ztag As Byte ' Zahl des Wochentages
' Bestimme die EEprom-Variablen
Dim E_soll_temp As Eram Single
' Uhreinstellungen
Config Date = Dmy , Separator = .
Config Clock = Soft
Enable Interrupts
Time$ = "12:00:00"
Date$ = "01.01.07"
Soll_temp = E_soll_temp
'Arbeitsschleife----------------------------------
Cls
Portd.5 = 0
Portd.6 = 1
Do
Debounce Pind.2 , 1 , Alarm , Sub
Debounce Pind.3 , 0 , Filter , Sub
If Pinc.1 = 0 And Pinc.2 = 1 Then
Gosub Menu
Elseif Pinc.1 = 0 And Pinc.2 = 0 Then
Gosub Service
Else
Gosub Normal
End If
Loop
' ----------------------------
' Servicemenue
' ----------------------------
Service:
Cls
Locate 1 , 1
Lcd "Temp"
Locate 1 , 10
Lcd "Tmp1"
Locate 2 , 1
Lcd "S8"
Locate 2 , 9
Lcd "S7"
Bitwait Pinc.1 , Set
Do
Gosub Get_1wire
Locate 1 , 6
Lcd Temp
Locate 1 , 15
Lcd Temp1
Locate 2 , 4
Lcd Scratch(8)
Locate 2 , 12
Lcd Scratch(7)
Loop Until Pinc.1 = 0
Waitms 100
Cls
Bitwait Pinc.1 , Set
Return
' ----------------------------
Normal:
If _sec = 00 Or _sec = 10 Or _sec = 20 Or _sec = 30 Or _sec = 40 Or _sec = 50 Then
Gosub Get_1wire
Else
End If
If Ist_temp < Soll_temp Then
Portd.0 = 1
Else
Portd.0 = 0
End If
Ztag = Dayofweek()
Wtag = Lookupstr(ztag , Wochentage)
' Donnerstag|Temp.
' 16:24:13 |23.5C
Locate 1 , 1
Lcd Wtag ; Chr(1) ; "Temp."
Locate 2 , 2
Lcd Time$
Locate 2 , 11
Lcd Chr(1) ; Ist_temp ; Chr(0)
If Ztag >= 0 And Ztag <= 4 Then
Gosub Schalten04
Else
Gosub Schalten56
End If
Compare1a = Bel
Return
' -----------------------------
' ---Einstellungsmenü----------
' -----------------------------
Menu:
Portd.0 = 0
Portd.1 = 0
Z2 = 0
Cls
Locate 1 , 1
Lcd " Hauptmenue "
Locate 2 , 1
Lcd " weiter/zurueck "
Bitwait Pinc.1 , Set
For Z2 = 1 To 100
Waitms 50
If Pinc.1 = 0 Then
Bitwait Pinc.1 , Set
Cls
Return
Else
End If
If Pinc.2 = 0 Then
Bitwait Pinc.2 , Set
Z2 = 0
Cls
Locate 1 , 1
Lcd "Wassertemperatur"
Locate 2 , 1
Lcd "einstellen:"
Locate 2 , 16
Lcd "C"
Goto Wasser
Else
Next
End If
Cls
Return
' ------------------------------------------
Wasser:
Locate 2 , 12
Lcd " "
For Z2 = 1 To 255
Locate 2 , 12
Lcd Soll_temp
Waitms 20
If Soll_temp > 32 Or Soll_temp < 18 Then
Soll_temp = 18
End If
Debounce Pinc.3 , 0 , Wasser_auf
Debounce Pinc.4 , 0 , Wasser_ab
Debounce Pinc.2 , 0 , Wasser_weiter
Debounce Pinc.1 , 0 , Wasser_menu
Next
E_soll_temp = Soll_temp
Cls
Goto Menu
Wasser_auf:
Soll_temp = Soll_temp + 0.5
Goto Wasser
Wasser_ab:
Soll_temp = Soll_temp - 0.5
Goto Wasser
Wasser_weiter:
E_soll_temp = Soll_temp
Z2 = 0
Cls
Locate 1 , 1
Lcd "Bel. einschalten"
Locate 2 , 1
Lcd "Mo-Fr ab "
Locate 2 , 13
Lcd "Uhr"
Goto Schaltzeit
Wasser_menu:
E_soll_temp = Soll_temp
Cls
Goto Menu
' ------------------------------------------
Schaltzeit:
Locate 2 , 10
Lcd " "
If Schalten_ein > 12 Or Schalten_ein < 6 Then
Schalten_ein = 6
End If
Schalten_aus = Schalten_ein + 13
Co2_ein = Schalten_ein + 1
Co2_aus = Schalten_ein + 12
For Z2 = 1 To 50
Locate 2 , 10
Lcd Schalten_ein
Waitms 130
If Pinc.3 = 0 And Pinc.4 = 1 Then
Incr Schalten_ein
Goto Schaltzeit
Elseif Pinc.3 = 1 And Pinc.4 = 0 Then
Decr Schalten_ein
Goto Schaltzeit
Elseif Pinc.2 = 0 Then
Bitwait Pinc.2 , Set
Z2 = 0
Cls
Locate 1 , 1
Lcd "Bel. einschalten"
Locate 2 , 1
Lcd "Sa+So ab "
Locate 2 , 13
Lcd "Uhr"
Goto Schaltzeit2
Elseif Pinc.1 = 0 Then
Cls
Goto Menu
Else
Next
End If
Cls
Goto Menu
' ------------------------------------------
Schaltzeit2:
Locate 2 , 10
Lcd " "
If Schalten_ein2 > 12 Or Schalten_ein2 < 6 Then
Schalten_ein2 = 6
End If
Schalten_aus2 = Schalten_ein2 + 13
Co2_ein2 = Schalten_ein2 + 1
Co2_aus2 = Schalten_ein2 + 12
For Z2 = 1 To 50
Locate 2 , 10
Lcd Schalten_ein2
Waitms 130
If Pinc.3 = 0 And Pinc.4 = 1 Then
Incr Schalten_ein2
Goto Schaltzeit2
Elseif Pinc.3 = 1 And Pinc.4 = 0 Then
Decr Schalten_ein2
Goto Schaltzeit2
Elseif Pinc.2 = 0 Then
Bitwait Pinc.2 , Set
Z2 = 0
Cls
Locate 1 , 1
Lcd "Uhr einstellen"
Locate 2 , 1
Lcd "Stunden:"
Goto Stunden
Elseif Pinc.1 = 0 Then
Cls
Goto Menu
Else
Next
End If
Cls
Goto Menu
' ------------------------------------------
Stunden:
Locate 2 , 10
Lcd " "
For Z2 = 1 To 100
Locate 2 , 10
Lcd _hour
Waitms 130
If _hour > 23 Or _hour <= 0 Then
_hour = 0
End If
If Pinc.3 = 0 And Pinc.4 = 1 Then
Incr _hour
Goto Stunden
Elseif Pinc.3 = 1 And Pinc.4 = 0 Then
Decr _hour
Goto Stunden
Elseif Pinc.2 = 0 Then
Bitwait Pinc.2 , Set
Z2 = 0
Cls
Locate 1 , 1
Lcd "Uhr einstellen"
Locate 2 , 1
Lcd "Minuten:"
Goto Minuten
Elseif Pinc.1 = 0 Then
Cls
Goto Menu
Else
Next
End If
Cls
Goto Menu
' -------------------------------------
Minuten:
Locate 2 , 10
Lcd " "
_sec = 00
For Z2 = 1 To 100
Locate 2 , 10
Lcd _min
Waitms 130
If _min > 59 Or _min <= 0 Then
_min = 0
End If
If Pinc.3 = 0 And Pinc.4 = 1 Then
Incr _min
Goto Minuten
Elseif Pinc.3 = 1 And Pinc.4 = 0 Then
Decr _min
Goto Minuten
Elseif Pinc.2 = 0 Then
Bitwait Pinc.2 , Set
Z2 = 0
Cls
Locate 1 , 1
Lcd "Wochentag einst."
Locate 2 , 1
Lcd "Tag:"
Goto Tag
Elseif Pinc.1 = 0 Then
Cls
Goto Menu
Else
Next
End If
Cls
Goto Menu
' --------------------------------------------
Tag:
Ztag = Dayofweek()
Wtag = Lookupstr(ztag , Wochentage)
For Z2 = 1 To 255
Locate 2 , 6
Lcd Wtag
Waitms 20
Debounce Pinc.3 , 0 , Tag_auf
Debounce Pinc.4 , 0 , Tag_ab
Debounce Pinc.1 , 0 , Tag_menu
Next
Cls
Goto Menu
Tag_auf:
Incr _day
Goto Tag
Tag_ab:
Decr _day
Goto Tag
Tag_menu:
Cls
Goto Menu
Return
' ---------------------------------------------
Get_1wire:
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 100
1wreset
1wwrite &HCC
1wwrite &HBE
For I = 1 To 9
Scratch(i) = 1wread()
Next
Temp = Scratch(2)
Shift Temp , Left , 8
Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25
Return
' ---------------------------------------------
Schalten04:
If Schalten_ein <= _hour And Schalten_aus > _hour Then ' Beleuchtungssteuerung
Portd.4 = 1
Else
Portd.4 = 0
End If
If Co2_ein <= _hour And Co2_aus > _hour Then ' Ausgang2-Steuerung
Portd.1 = 1
Else
Portd.1 = 0
End If
If Co2_aus = _hour Then ' Dimmersteuerung Beleuchtung
Bel = 17 * _min
Elseif Co2_aus <> _hour Then
Bel = 0
Else
End If
Return
' ---------------------------------------------
Schalten56:
If Schalten_ein2 <= _hour And Schalten_aus2 > _hour Then ' Beleuchtungssteuerung
Portd.4 = 1
Else
Portd.4 = 0
End If
If Co2_ein2 <= _hour And Co2_aus2 > _hour Then ' Ausgang2-Steuerung
Portd.1 = 1
Else
Portd.1 = 0
End If
If Co2_aus2 = _hour Then ' Dimmersteuerung Beleuchtung
Bel = 17 * _min
Elseif Co2_aus2 <> _hour Then
Bel = 0
Else
End If
Return
' ---------------------------------------------
Filter:
Cls
Locate 1 , 1
Lcd " Wasserwechsel! "
Portd.0 = 0
Portd.1 = 0
Portd.4 = 1
Compare1a = 0
Waitms 100
Do
Locate 2 , 5
Lcd Time$
Waitms 75
Toggle Portd.6
Debounce Pind.3 , 0 , Filter_back
Loop
Filter_back:
Cls
Portd.6 = 1
Return
' ---------------------------------------------
Alarm:
Cls
Locate 1 , 1
Lcd " !!! ALARM !!! "
Locate 2 , 1
Lcd "--Wasserstand-- "
Portd.0 = 0
Portd.1 = 0
Portd.4 = 1
Compare1a = 0
Waitms 100
Do
Waitms 100
Toggle Portd.5
Toggle Portd.6
Debounce Pind.3 , 0 , Alarm_back
Loop
Alarm_back:
Cls
Portd.5 = 0
Portd.6 = 1
Return
End
Wochentage:
Data " Montag " , " Dienstag " , " Mittwoch " , "Donnerstag" , " Freitag " , " Samstag " , " Sonntag "
Wenn du Fragen zum Programm hast, dann frag mich ruhig!
Gruß,
Cassio