Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeitsteuerung+Temperaturmessung
Projekt 2252
08.04.2012, 03:43
Hallo, Ich möchte mir gerne eine Steuerung mit einem RN Control 1.4 für ein Terrarium bauen.
Das Board soll Die UV Lampe Zeitabhängig steuern, die Wärme Lampen (Tag und Nacht) Wärme abhängig und die Nebelanlage auch Zeitabhängig. Ich stelle mir das etwa so vor: 7
Morgens: 6 Uhr
UV Lampe ca. 12 Stunden ein.
Alle 4 Stunden soll die Nebelanlage für 30 Sekunden sprühen (ab 6:00 Uhr bis 18:00 Uhr)
Der Temperatursensor soll kontinuierlich neben der Steuerung der Lampe/Pumpe abgefragt werden und wenn nötig die Wärmelampen ein oder aus schalten.
Ich hätte es jetzt so lösen wollen das ich die UV Lampe einschalte und denn mithilfe des Wait befehls die 4 Stunden bis zum ersten Sprüchen überwinde so z.b:
UV=1
Wait xxx
Pumpe = 1
Wait xxx
Pumpe= 0
Wait xxx
………..
Und am Ende also nach 12 Stunden
UV= 0
Jetzt kann ich während er wartet um die Zeit rum zu bekommen ja keine Temperaturmessung durchführen bzw. Die Lampen ein oder ausschalten. Wie würdet ihr das lösen? Und bekommt der Atmega 32 überhaut alles auf einmal hin?
Gruß Tjark
peterfido
08.04.2012, 08:29
Da sind dann sogar noch ausreichend Reserven für andere Dinge vorhanden. Für Dein Vorhaben gibt es hier schon reichlich Code. Anfangen würde ich mit der Uhr. Wenn du diese stellen kannst (oder sie sich selbst stellt, z.B. über DCF) und die Uhrzeit anzeigen kannst, geht es im nächsten Schritt weiter. Entweder du löst es so, dass die Schaltzeiten fest verankert sind, oder dass du sie verstellen kannst (Taster, Drehencoder, RS232,...)
Wenn die Uhr dann läuft und die Sekunde 0 ist, wird geprüft, ob eine (oder mehrere) der Schaltzeiten mit der aktuellen Zeit übereinstimmt und dann dementsprechend die Ports gesetzt. Wait ist für sowas immer schlecht, da dann der uC für alles (außer Interrupts) blockiert ist. Ich selbst nutze Wait nur während die Einschaltmeldung angezeigt wird, danach nutze ich nur noch waitms oder waitus, jeweils mit recht kleinen Zahlen, z.B. bei der Kommunikation mit anderen ICs oder der Abfrage einer Tastaturmatrix.
Projekt 2252
08.04.2012, 09:22
Ok Also könnte ich erstmal so wie hier (https://www.roboternetz.de/community/threads/28016-Zeitmessung-atmega8?highlight=Zeit) beschrieben mit dem Code anfagen und über die Variable in dem Fall Zeit die Ereignisse steuern.
Würde es nach dem Konfigurieren des Timers denn etwa so aussehen ?
Do
if Zeit = 20 (sek) then
UV Lampe = 1
end if
Wäre das so korrekt und wenn ich das so ablaufen lasse kann ich denn nebenbei einfach die Temperatur steuern oder wartet er bis der befehl ausgeführt wird bzw. bis die Zeit zum auslösen des Befehls abgelaufen ist ?
Gruß Tjark
Projekt 2252
08.04.2012, 10:07
Ich blick da grad mi dem Code von der Uhr nicht durch wie muss ich das jetzt genau anstellen? ^^
Gruß Tjark
peterfido
08.04.2012, 10:38
Du bist da auf eine Stoppuhr gestossen. Du brauchst eher sowas wie einen Wecker. Für weitere Hilfe fehlt mir allerdings einiges an Code, worauf ich aufbauen kann. Eine komplette mehrkanalige Zeituhr möchte ich hier eigentlich nicht komplett posten.
Hier mal das Grundgerüst:
$regfile = "m8def.dat"
$crystal = 4000000
Config Dcf77 = Pind.7 , Timer = 1 , Gosub = Sectic 'DCF-Uhr Routine, lässt sich auch mit einem xMHZ Quarz ohne DCF-Empfänger nutzen
Dim Stundeein(3) As Byte
Dim Minuteein(3) As Byte
Dim Stundeaus(3) As Byte
Dim Minuteaus(3) As Byte
Dim B As Byte
Ddrd = &B00001110 'Ausgänge für Zeituhr auf PortD.1-Portd.3
Do 'übersichtliche Hauptschleife...
Gosub Temperaturregeln
Gosub Tastatur
Gosub Sonstiges
Loop
End
Sectic: 'wird sekündlich aufgerufen
Gosub Uhranzeigen
Gosub Temperaturanzeigen
If _sec = 0then
Gosub Schaltuhr
End If
Return
Schaltuhr:
For B = 1 To 3
If Stundeein(b) = _hour Then
If Minuteein(b) = _min Then
Set Portd.b
End If
End If
If Stundeaus(b) = _hour Then
If Minuteaus(b) = _min Then
Reset Portd.b
End If
End If
Next B
Return
Temperaturregeln:
'hier dein Code für die Temperaturregelung rein
Return
Tastatur:
'hier dein Code für die Tastatur / Drehencoder rein
Return
Sonstiges:
'hier dein Code für Anderes rein
Return
Uhranzeigen:
'hier dein Code für die Uhrzeitanzeige rein
Return
Temperaturanzeigen:
'hier dein Code für die Temperaturanzeige rein
Return
Projekt 2252
08.04.2012, 11:53
Danke erstmal :) Naja hätte ich auch nur ein bisschen Ahnung von der Sache würde ich dir gerne ein CODE zur Verfügung stellen nur hab ich mich damit noch nie beschäftigt. Darum auch meine ganzen Fragen :D
Das Problem ist nur das ich überhaupt nicht nachvollziehen kann wieso du das so gemacht hast wie du es gemacht hast :P
Gruß Tjark
Hi,
du kannst auch eine DS1307 nehmen und den SQW Pin auf 1Hz stellen und dann mittels Interrupt die Impulse zählen. Und mittels If-Abfrage kannst du dann den Zeitintervall einstellen Zur Temperaturmessung kannst du einen LM75 benutzen. Der hat (glaube ich) sogar einen Temperaturalarm der ausgelöst wird sobald die eingestellte Temperatur erreicht ist.
Projekt 2252
08.04.2012, 12:26
Ja als Temperatursensor wollte ich eigentlich diesen hier (http://www.ebay.de/itm/290453209203?ssPageName=STRK:MESINDXX:IT&_trksid=p3984.m1436.l2649#ht_1983wt_948) verwenden da ich doch eine sehr hohe Luftfeutigkeit haben werde ca. 60-70%
Gruß Tjark
Projekt 2252
08.04.2012, 14:56
Ich weiß das passt jetzt nicht mit ins Thema aber ich wollte nicht extra ein neues Eröffnen. Und was haltet ihr von diesem (http://www.lipoly.de/index.php?main_page=product_info&products_id=209904) Sensor welches Signal gibt der aus ?
Gruß Tjark
Der Sensor gibt die Daten seriel über einen Pin aus.
Hier hast du das Datenblatt zu dem:
http://www.micropik.com/PDF/dht11.pdf
Auf Seite 5-6 steht die Kommunikation erklärt. Du sendest mit deinem Controller ein Startsignal, indem du den Datenpin auf GND ziehst und anschließend sendet der Sensor seine Daten nacheinander mit MSB first über den Datenpin zum Controller und du musst die Daten dann nur empfangen und auswerten. Eine Kommunikation dauert 4ms und in 4ms werden 40Bit übertragen. 50µs Low-Pegel bedeutet dabei 1 und 26-28µs High-Pegel bedeutet dabei 0.
Projekt 2252
08.04.2012, 15:19
Danke dir :)
Gruß Tjark
peterfido
09.04.2012, 07:24
Hallo,
bitte keine Hilfeanfragen per PN..
Mein Codebeispiel setzt manuell keine Timer. Das macht die "Config dcf" automatisch. Dafür einfach mal in der Bascomhilfe schauen, was die Befehle bedeuten. Bei Config Clock und Config DCF werden die nötigen Variablen automatisch eingebracht. Diese lassen sich dann einzeln (_hour, _min, _sek) oder komplett (time$) lesen und setzen.
Config Clock erwartet entweder eine eigene Uhrroutine oder nutzt Timer2 asynchron, was einen zusätzlichen Quarz (32768 kHz) benötigt. Ich missbrauche für sowas gern Config DCF, da läuft auch eine automatische Uhr, welche sich ohne einen DCF - Empfänger wie eine "normale" Uhr verhält. Der Vorteil ist aber, dass diese mit der Quarzfrequenz synchron läuft. Für eine genaue Uhr sollte dann aber ein externen Quarz genutzt werden. Nachteile gibt es aber auch. So wird die Interrupt-Routine (DCF) mehrmals pro Sekunde aufgerufen.
Willst Du eine komplett eigene Uhr programmieren, bietet sich "config clock = user" an. Da werden dann schonmal die Variablen dimensioniert. Den "Rest" musst du dann zu Fuss erledigen.
Deinen Fragen nach bist Du noch recht neu in der Programmierung. Da du vorhast andere Geräte (Netzspannung?) zu schalten, frage ich jetzt einfach mal nach deinen Kenntnissen in der Elektrotechnik.
Projekt 2252
09.04.2012, 16:17
Ok Danke. Mit der Elektronik ist das überhaut kein Problem das hab ich alles schon soweit fertig ich muss nur noch das Programm zum laufen bringen :)).. Ich hab mich bist jetzt immer nur soweit damit beschäftigt wie es nötig war um mein Roboter fertig zu stellen den ich über ein Joystick vom Pc aus über RS232 mit einem Xbee Steuere. Mit den Timern usw. hatte ich noch nicht viel zu tun und es ist echt schwer ohne ein bisschen Hilfe so ein Programm zu schreiben wenn man sich damit noch überhaut nicht auskennt :P
Gruß Tjark
Projekt 2252
09.04.2012, 16:58
Sehe ich das richtig das in deinem Programm die Zeit auf den Ports D.1 - D.3 Ausgegeben wird oder wofür sind die da ?!
Gruß Tjark
peterfido
09.04.2012, 17:36
Hallo,
nicht ganz. Diese PINs werden geschaltet, wenn die Einschalt-oder Ausschaltzeit mit der aktuellen Zeit des Mikrocontrollers übereinstimmt.
Projekt 2252
09.04.2012, 17:58
Ok also kann ich denn hier anstatt dem _ vor dem hour die Stunde reinschreiben
Schaltuhr:
For B = 1 To 3
If Stundeein(b) = 3 hour Then ' <--- so in etwa ?
If Minuteein(b) = _min Then
Set Portd.b
End If
End If
If Stundeaus(b) = _hour Then
If Minuteaus(b) = _min Then
Reset Portd.b
End If
End If
Next B
Return
Gruß Tjark
peterfido
09.04.2012, 20:46
Nein. _hour ist eine "Systemvariable", wo die Stunde drin ist. Für mein Beispiel kommen die Schaltzeiten in die Variablen Stunde... und Minute...
Also um Portd.1 um 10:30 Uhr einzuschalten kommt in die Variablen Stundeein(1)=10 ; Minuteein(1)=30
Zum Ausschalten um 11:45 Uhr dann Stundeaus(1)=11; Minuteaus(1)=45.
Für Portd.2 und Portd.3 jeweils die Zahl in den Klammern dementsprechend.
Projekt 2252
09.04.2012, 20:56
Ok danke :)) Und wie stelle ich die Uhr bzw. läuft sie immer los wenn ich das Board einschalte? Denn als ich Dcf77 in der Bascom Hilfe gesucht habe, habe ich was von zeitzonen usw. gelesen. Außerdem steht am Anfnag "Action
Instruct the compiler to use DCF-77 radio signal to get atom clock precision time" Bekommt der Atmega die Uhrzeit per funk ? .
Gruß Tjark
Projekt 2252
09.04.2012, 22:36
So hab jetzt ein bisschen rumprobiert wenn ich in dem Programmpunkt Uhranzeigen Print Time$ ; " schreibe bekomme ich etwas raus aber es ist nur 00:00:00 und aktualisiert sich auch nicht sekündlich wie es sollte wenn ich das richtig verstanden habe da Gosub Uhranzeigen ja unter Sectic steht sondern es kommt rasend schnell hintereinander.
Gruß Tjark
Projekt 2252
09.04.2012, 22:41
Hab es mit der Zeit hinbekommen und versuch die LED so zu steuern:
$regfile = "m32def.dat"
$crystal = 16000000
Config Dcf77 = Pind.7 , Timer = 1 , Gosub = Sectic 'DCF-Uhr Routine, lässt sich auch mit einem xMHZ Quarz ohne DCF-Empfänger nutzen
Config Porta.1 = Output
Enable Interrupts
Ddrd = &B00001110 'Ausgänge für Zeituhr auf PortD.1-Portd.3
Date$ = "09/04/00"
Time$ = "23:13:55"
Do 'übersichtliche Hauptschleife...
Gosub Temperaturregeln
Gosub Tastatur
Gosub Sonstiges
Loop
End
Sectic: 'wird sekündlich aufgerufen
Gosub Uhranzeigen
Gosub Temperaturanzeigen
If _sec = 0then
Gosub Schaltuhr
End If
Return
Schaltuhr:
If Time$ = "23:14:00" Then
Set Porta.1
End If
If Time$ = "23:14:05" Then
Reset Porta.1
End If
Return
Temperaturregeln:
'hier dein Code für die Temperaturregelung rein
Return
Tastatur:
'hier dein Code für die Tastatur / Drehencoder rein
Return
Sonstiges:
'hier dein Code für Anderes rein
Return
Uhranzeigen:
'hier dein Code für die Uhrzeitanzeige rein
Print Time$ ; ""
Return
Temperaturanzeigen:
'hier dein Code für die Temperaturanzeige rein
Return
Sie geht auch um 23:14:00 an aber nicht mehr aus... Was kann das sein ?
Gruß Tjark
Projekt 2252
10.04.2012, 11:37
So jetzt Funktioniert es mit dem Schalten der Ports. Meint ihr ich hab da irgendein Denkfehler oder kann ich das so verwenden ? Hier der Code
$regfile = "m32def.dat"$crystal = 16000000
Config Dcf77 = Pind.7 , Timer = 1 , Gosub = Sectic 'DCF-Uhr Routine, lässt sich auch mit einem xMHZ Quarz ohne DCF-Empfänger nutzen
Config Porta.1 = Output
Config Porta.2 = Output
Enable Interrupts
Date$ = "09/04/00"
Time$ = "23:13:55"
Do 'übersichtliche Hauptschleife...
Gosub Temperaturregeln
Gosub Tastatur
Gosub Sonstiges
Gosub Zeitschalteruv
Gosub Zeitschalterwaerme
Loop
End
Sectic: 'wird sekündlich aufgerufen
Gosub Uhranzeigen
Gosub Temperaturanzeigen
If _sec = 0then
End If
Return
Schaltuhr:
Return
Zeitschalteruv:
If Time$ = "23:14:00" Then
Set Porta.1
End If
If Time$ = "23:14:05" Then
Reset Porta.1
End If
Return
Zeitschalterwaerme:
'Erster Schaltvorgang
If Time$ = "23:14:02" Then
Set Porta.2
End If
If Time$ = "23:14:07" Then
Reset Porta.2
End If
'Zweiter Schaltvorgang
If Time$ = "23:14:10" Then
Set Porta.2
End If
If Time$ = "23:14:15" Then
Reset Porta.2
End If
Return
Temperaturregeln:
'hier dein Code für die Temperaturregelung rein
Return
Tastatur:
'hier dein Code für die Tastatur / Drehencoder rein
Return
Sonstiges:
'hier dein Code für Anderes rein
Return
Uhranzeigen:
Print Time$ ; ""
Return
Temperaturanzeigen:
'hier dein Code für die Temperaturanzeige rein
Return
Gruß Tjark
peterfido
10.04.2012, 17:10
Da ist noch eine Menge Überflüssgies drin. Die Subs waren Beispiele. Ist da kein Code drin, brauchst Du sie auch nicht. So springt er halt hin und gleich wieder zurück. Möchtest Du das Datum in unserer gewohnten Schreibsweise nutzen, dann am Anfang des Programmes einfach
Config Date = Dmy , Separator = .
hinzufügen. Das bei deinem vorletzen Code nicht wieder abgeschaltet wurde ist klar, denn mein Beispiel war für minutengenaues Schalten in der Sekunde 0. Außerhalb der Sekunde 0 wurde gar nicht in die Schaltuhr Sub gesprungen. Jetzt fehlt natürlich noch Code, um die Uhr und die Schaltzeiten (Entweder per Taster, Drehencoder, RS232 oder gar Fernbedienung) zu stellen. Du kannst natürlich auch einen DCF-Empfänger anschließen und die ZEiten fest einprogrammieren. Dafür wäre aber eine Überprüfung auf eine gültige Zeit von Vorteil. Die Schaltzeiten lassen sich im EEPROM speichern, wenn du sie veränderbar machen möchtest. Bei deinen Programmierkenntnissen kann auch es auch nicht schaden, wenn du den Watchdog zu Hilfe nimmst. Wird dieser nicht regelmäßig zurückgesetzt, weil das Programm sich verheddert, führt den AVR einen Neustart durch.
Ich denke, da habe ich dir wieder viel Neues genannt. Viel Spaß beim ausprobieren. (Mir macht das immer am meisten Spaß, vor allem, wenn am Ende dann alles so läuft, wie ich es mir vorgestellt habe)
Nur interessehalber: Wie steuerst Du die Geräte an?
Projekt 2252
10.04.2012, 21:22
Ja ich weiß das da noch einige überflüssige Sachen drinnen waren haben ja aber nicht gestört der Code muss ja eh noch umgeändert/erweitert werden :) Danke peterfido hast mir sehr geholfen. Ich habe mich auch sehr gefreut als das alles so lief wie ich wollte (schon komisch wie mann sich so freuen kann nur weil eine LED Blinkt ;)). Ich werde mir jetzt noch 2 Temperatursensoren kaufen. Mit dem einen Messe ich die Temperatur des Sonnplatzes des Chamäleons und mit dem andrern die Allgemeine Lufttemperatur damit sollen auch die Wärmelampen angesteuert werden. Außerdem noch ein Luftfeuchtigkeitssensor mit dessem Hilfe ich die Beregnungsanlage steuere um die Luftfeuchtigkeit im Terrarium auf 60-70% zu halten. Die Lampen will ich mit diesem Relais hier (http://www.reichelt.de/Miniaturrelais/FIN-36-11-12V/index.html?;ACTION=3;LA=5;GROUP=C32;GROUPID=3292;A RTICLE=42374;START=0;SORT=user;OFFSET=16;SID=12T4M ZIX8AAAIAADDed1Aa6f704a22434d5aa77957166e2605640) steuern und die Relais selber werden über IRLZ34N angesteuert die direkt an die Ports kommen. Wobei ich es besser finden würde wenn ich die Wärmelampen digital über PWM dimmen könnte aber ich weiß nicht wie. Villeicht habt ich ja eine Idee die Lampen haben 2x75 Watt.
Gruß Tjark
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.