PDA

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

Kampi
08.04.2012, 11:53
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

Kampi
08.04.2012, 15:11
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