Aquariumsteuerung Kategorie: Verschiedenes (von Siegfried Opolka - 11.02.2009 12:31) | ||
| ||
Hallo! Bin Neuling hier, also Gnade bitte ;-) Vor einigen Jahre habe ich eine Aquariumsteuerung mit der C-Control I gebaut, die sehr gut funktioniert. Nun möchte ich mich ein wenig mit der Mega128 befassen und habe einfach mal mein altes Programm mit einigen der Beispielprogrammen verwurstet. Scheint alles zu funktionieren (DCF-Teile konnten aber noch nicht getestet werden). Nun möchte ich Euch bitten mir Neuling noch ein paar Verbesserungen am Programm mit an die Hand zu geben, bevor das ganze dann auf eine eigene Platine gesetzt wird. Danke Siggi ' A_02: Aquariumsteuerung ' ' DCF an PortF0 (40) ' AD-Wandler an ADC2 (42) und ADC4 (44) ' 4 Ausgänge an PortC (23, 21, 19, 17) ' Library: IntFunc_Lib.cc, LCD_Lib.cc, DCF_Lib.cc Dim ADC_Wert1 As Word Dim ADC_Wert2 As Word Dim l As Byte Dim n As Byte Dim s As Integer Dim s_alt As Integer Dim Text(9) As Char Dim z As Integer Dim t_soll, ph_soll, abweich As Word Dim t1, t2, t3, t4, t5 As Word Dim p1, p2, p3, p4, p5 As Word Dim s1_a(1), s1_b(1), s1_c(1), s2_a(1), s2_b(1) As Char '--------------------------------------------------------------- ' Zeichenausgabe Uhr ' Sub Write2Dig(pos As Byte,val As Byte) Dim num(3) As Char Dim c As Char LCD_CursorPos(pos) ' LCD Cursor positionieren If val<10 Then c=&H30 If pos=1 Then c=&H20 End If LCD_WriteChar(c) End If Str_WriteInt(val,num,0) ' Zahl in String schreiben LCD_WriteText(num) ' String ausgeben End Sub '--------------------------------------------------------------- ' Uhr ' Sub Display_Time() Write2Dig(1,Stunde) ' Stunde If Sekunde Mod 2 <> 0 And l= 0 Then LCD_WriteChar(&H20) ' Blinkender Cursor Else LCD_WriteChar(&H3a) End If Write2Dig(4,Minute) ' Minute End Sub '--------------------------------------------------------------- ' Schalten ' Sub Schalten() If (Stunde > 21) Or (Stunde = 21 And Minute > 29) Or (Stunde < 8) Or (Stunde > 12 And Stunde < 15) Or (Tag = 3 And Stunde > 20) Then Port_WriteBit(23,PORT_OFF) Else Port_WriteBit(23,PORT_ON) End If If (ADC_Wert1-4*abweich) > t_soll Then Port_WriteBit(21,PORT_OFF) Else Port_WriteBit(21,PORT_ON) End If If (ADC_Wert1+abweich) < t_soll Then Port_WriteBit(19,PORT_ON) End If If (ADC_Wert1-abweich) > t_soll Then Port_WriteBit(19,PORT_OFF) End If If (ADC_Wert2+abweich) < ph_soll Then Port_WriteBit(17,PORT_OFF) End If If (ADC_Wert1-abweich) > ph_soll And ADC_Wert1 <> 999 Then Port_WriteBit(17,PORT_ON) End If End Sub '--------------------------------------------------------------- ' *Service Wasserwechsel ' Sub Swit() If Port_ReadBit(PORT_SW1)= 0 And l= 0 Then LCD_CursorPos(&H40) LCD_WriteText(Text) Port_WriteBit(23,PORT_ON) Port_WriteBit(19,PORT_OFF) Port_WriteBit(17,PORT_OFF) l= 1 AbsDelay (500) Else If Port_ReadBit(PORT_SW1)= 0 And l= 1 Then Port_WriteBit(52,PORT_OFF) l= 0 LCD_ClearLCD() AbsDelay (500) z=20 End If End If End Sub ' '--------------------------------------------------------------- ' Takt Sekunden ' Sub RTC_1() s= Sekunde z=z+1 ADC_Set(ADC_VREF_VCC,2) ADC_Wert1= ADC_Read() ADC_Set(ADC_VREF_VCC,4) ADC_Wert2= ADC_Read() If z Mod 5= 0 Then t1= ADC_Wert1 p1= ADC_Wert2 End If If z Mod 5= 1 Then t2= ADC_Wert1 p2= ADC_Wert2 End If If z Mod 5= 2 Then t3= ADC_Wert1 p3= ADC_Wert2 End If If z Mod 5= 3 Then t4= ADC_Wert1 p4= ADC_Wert2 End If If z Mod 5= 4 Then t5= ADC_Wert1 p5= ADC_Wert2 End If ADC_Wert1= ((t1 + t2 + t3 + t4 + t5)/5)* 0.977 If ADC_Wert1 > 888 Or ADC_Wert1 < 111 Then ADC_Wert1= 999 End If ADC_Wert2= ((p1 + p2 + p3 + p4 + p5)/5)* 0.0977 If ADC_Wert2 > 88 Or ADC_Wert2 < 11 Then ADC_Wert2= 99 End If Str_WriteWord((ADC_Wert1/100),10,s1_a,0,1) LCD_CursorPos(&H40) LCD_WriteText(s1_a) Str_WriteWord(((ADC_Wert1 Mod 100)/10),10,s1_b,0,1) LCD_WriteText(s1_b) LCD_WriteChar(&H2e) Str_WriteWord((ADC_Wert1 Mod 10),10,s1_c,0,1) LCD_WriteText(s1_c) Str_WriteWord((ADC_Wert2/10),10,s2_a,0,1) LCD_CursorPos(&H45) LCD_WriteText(s2_a) LCD_WriteChar(&H2e) Str_WriteWord((ADC_Wert2 Mod 10),10,s2_b,0,1) LCD_WriteText(s2_b) If z= 30 Then z= 0 Schalten() End If End Sub '--------------------------------------------------------------- ' Takt 10ms ' Sub RTC_10m() cnt1=cnt1+1 ' 10ms Zähler erhöhen If cnt1=50 And l= 1 Then Port_WriteBit(51,PORT_OFF) ' LED1 ausschalten End If If cnt1=100 Then Port_WriteBit(51,PORT_ON) ' LED1 einschalten Display_Time() ' Funktionsaufruf: Display_Time Sekunde= Sekunde+1 If Sekunde=60 Then Sekunde=0 If Minute= &H15 And Stunde= &H01 Then DCF_START() End If Minute= Minute+1 If Minute=60 Then Minute=0 Stunde= Stunde+1 If Stunde=24 Then Stunde=0 End If End If End If cnt1=0 End If End Sub '--------------------------------------------------------------- ' Interrupt alle 10ms ' Sub INT_10ms() Dim irqcnt As Integer Swit() RTC_10m () If s <> Sekunde And l=0 Then RTC_1() End If DCF_PULS() DCF_SYNC() DCF_FRAME() irqcnt=Irq_GetCount(INT_TIM2COMP) End Sub '--------------------------------------------------------------- ' Hauptprogramm ' Sub main() DCF_INIT() DCF_START() LCD_Init() ' Display initialisieren LCD_ClearLCD() ' Display löschen LCD_CursorOff() ' Display Cursor ausschalten cnt1= 0 Port_DataDirBit(36,PORT_IN) ' Taster 1 Port_DataDirBit(51,PORT_OUT) ' LED1 auf Ausgabe vorbereiten Port_WriteBit(51,PORT_OFF) ' LED1 ausschalten Port_DataDirBit(23,PORT_OUT) ' Port Licht auf Ausgabe vorbereiten Port_WriteBit(23,PORT_OFF) ' Port Licht ausschalten Port_DataDirBit(21,PORT_OUT) ' Port Heiz.1 auf Ausgabe vorbereiten Port_WriteBit(21,PORT_OFF) ' Port Heiz.1 ausschalten Port_DataDirBit(19,PORT_OUT) ' Port Heiz.2 auf Ausgabe vorbereiten Port_WriteBit(19,PORT_OFF) ' Port Heiz.2 ausschalten Port_DataDirBit(17,PORT_OUT) ' Port Ventil auf Ausgabe vorbereiten Port_WriteBit(17,PORT_OFF) ' Port Ventil ausschalten l= 0 z= 20 t_soll= 250 ph_soll= 70 abweich= 3 Sekunde=0 ' Startzeit festlegen z.B. 12:55 Minute=55 Stunde=12 Text= "Service!" Irq_SetVect(INT_TIM2COMP,INT_10ms) ' Interrupt Service Routine definieren Do While 1 : End While End Sub | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum