Forum: Compiler & IDEs Zeitbasierte Aktionen


von Daniel J. (n0i5ebreak3r)


Lesenswert?

Einen guten Sonntag morgen,

Ich habe da mal ein paar Fragen. Im zuge meines neuen Aquariums habe ich 
mir überlegt nach und nach eine Steuerung dafür zu bauen, entwickeln.

Für Tageszeitbasierte Aktionen brauche ich schonmal eine Uhr. DS1307 
z.B. gestellt werden soll sie erstmal über ein LCD 4x20 Zeichen. Wenn 
ich nun sagen wir mal eine Lampe um 9:30 Uhr angehen soll und um 20:00 
Uhr wieder aus. Wie kann ich das realisieren. Ich muss ja eine Abfrage 
laufen lassen welche andauernd überprüft ob die eingestellte Zeit 
erreicht worden ist.

ungefähr so:

WENN "eingestellte Zeit" GLEICH "system Zeit" DANN "Ausgang1 
einschalten"

für's auschalten das gleiche nur mit Ausgang1 auschalten.

Kann ich das so realisieren? Bin Anfänger in Sachen C Programmierung. 
Später sollen noch Sachen dazu kommen wie LCD Menü, Heizungsteuerung mit 
Nachtabsenkung, pH-Wert und der ganze Kram, aber erstmal soll es bei 
einfachen Sachen bleiben. Sprich SystemUhr, Heizungsteuerung mit DS18B20 
und Zeitschaltuhr.

Gruß, Daniel J.

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Daniel,

das Zauberwerkzeug heißt "Endlosigkeit der Main-Schleife".

Du richtest nach main() und nach all den Initialisierungen eine Schleife 
ein mit beispielsweise while(1).

In dieser Schleife prüfst Du die Realtime clock ab oder die interne Uhr 
(wozu ein DS1307? Den emulieren wir auf der linken Backe des Atmega16ff 
mit dem TCNT2 im asynchronen Betrieb und sparen Strom mit einem der 
Sleep-Modes.

Ist die Bedingung der Clock erfüllt, wird gehandelt nach Plan.

Ciao
Wolfgang Horn

von StinkyWinky (Gast)


Lesenswert?

Die Ereignisse kannst Du z.B. in einer sortierten Tabelle ablegen. Pro 
Eintrag speicherst Du die Ausführzeit und einen Funktionspointer auf die 
Aktion.

von Karl H. (kbuchegg)


Lesenswert?

> ungefähr so:
>
> WENN "eingestellte Zeit" GLEICH "system Zeit" DANN "Ausgang1
> einschalten"
>
> für's auschalten das gleiche nur mit Ausgang1 auschalten.

Besser ist es übrigens, wenn du das ganze nicht an Zeit-PUNKTEN 
festmachst, sondern an Zeit-INTERVALLEN.

Wann muss das Licht eingeschaltet sein?
Wenn die aktuelle Uhrzeit später als die Einschaltzeit aber früher als 
die Ausschaltzeit ist.


Ob du eine RTC nimmst oder ob du den Mega die Uhr machen lässt, ist in 
unseren Breiten meiner Meinung nach weitgehend Geschmacksache. RTC hat 
den Vorteil, dass sie auch bei einem Stromausfall die Uhrzeit nicht 
verliert und das sie aus dem Stand heraus genau geht. Die Sache mit dem 
Stromausfall ist allerdings so eine Sache. Wie oft fällt denn bei uns 
wirklich der Strom aus? Und selbst wenn: Wie schlimm ist es, wenn im 
Aquarium nach einem Stromausfall das Licht 1 Tag lang um ein paar 
Stunden versetzt ein/ausschaltet. Du stellst die Uhr händisch wieder ein 
und danach läuft sie wieder auf der Zeit. Selbiges mit der Uhrzeit. Eine 
Software Uhr kriegt man leicht so hin, dass sie von der Umstellung 
Sommer/Winterzeit im Frühling bis zum Gegenteil im Winter um nicht viel 
abweicht.


> Später sollen noch Sachen dazu kommen wie LCD Menü

Irrtum. LCD brauchst du möglichst schnell. Du brauchst es, damit du 
während der Programmentwicklung dir dort Informationen ausgeben kannst. 
Gerade für einen Neuling ist nichts schlimmer, als wie wenn er keine 
Ausgabemöglichkeit hat um festzustellen, was im Programm abgeht.

von Karl H. (kbuchegg)


Lesenswert?

StinkyWinky schrieb:
> Die Ereignisse kannst Du z.B. in einer sortierten Tabelle ablegen. Pro
> Eintrag speicherst Du die Ausführzeit und einen Funktionspointer auf die
> Aktion.

Machs nicht so komplizert.
Sowas braucht er, vor allen Dingen als Neuling, noch lange nicht.

von Daniel J. (n0i5ebreak3r)


Lesenswert?

Danke für eure Antworten.

Mit dem LCD wollte ich auch vorziehen. So ist es einfacher informationen 
zu erhalten und auch später einzugeben. Irgendwo muss ich ja sehen was 
passiert. Ich will mich da Stück für Stück ran tasten. Mit dem Licht 
wann es angehen soll ja wie soll ich das erklären. Es soll um 9:00 Uhr 
angehen und anbleiben bis 20:00 Uhr als Beispiel jetzt. Oder verstehe 
ich dich falsch?. Ich denke eine Software Uhr reicht erstmal, den RTC 
hatte ich hier noch rumfliegen mit Uhren-Quarz, zwecks Stromausfall das 
kommt eher selten vor hier.

von Karl H. (kbuchegg)


Lesenswert?

Daniel Joachims schrieb:

> Mit dem LCD wollte ich auch vorziehen. So ist es einfacher informationen
> zu erhalten und auch später einzugeben. Irgendwo muss ich ja sehen was
> passiert.

Genau

> Ich will mich da Stück für Stück ran tasten.

Gute Einstellung. Langsam - Stück für Stück.

> Mit dem Licht
> wann es angehen soll ja wie soll ich das erklären. Es soll um 9:00 Uhr
> angehen und anbleiben bis 20:00 Uhr als Beispiel jetzt. Oder verstehe
> ich dich falsch?.

Ne, passt schon.

Aber nicht:

   if( Uhrzeit ist 9 Uhr )
     Licht ein

   if( Uhrezeit ist 20 Uhr )
     Licht aus


sondern

   if( Uhrzeit >= 9 Uhr  &&
       Uhrzeit <= 20 Uhr )
     Licht ein
   else
     Licht aus


Den Unterschied merkst du, wenn du die Uhr einstellst :-)
Ist auch einfacher in der Programmierung. Denn dann hast du 
Zeitintervalle mit jeweils eine Anfangszeit und einer Ausschaltzeit. Und 
wenn die tatsächliche Uhrzeit da dazwischen ist, dann gilt ein Zustand 
(hier: Licht ein, kann aber natürlich auch sein: Temperatur 21° Grad)


Aber das hat alles noch Zeit. Erst mal gibt es Hausaufgaben zu machen 
:-)
Programmieren und Grundlagen lernen.

von Daniel J. (n0i5ebreak3r)


Lesenswert?

So sehe ich das auch. Danke Danke. Erstmal muss das LCD ankommen 4 x 20 
Zeichen sollten genug sein. Und dann wird erstmal Grundwissen angeeignet 
und angewendet bis dahin bin ich Wochen weiter. Ich habe hier ein 
Atmega32 der sollte für's erste reichen denke ich. Lange habe ich mich 
gewehrt, und mehr als sourcecode auf einen anderen AVR umzubauen oder 
einzelne Funktionen umzuschreiben waren nicht drin. Aber ganze Programme 
zu schreiben da muss ich noch viel lernen.

von Karl H. (kbuchegg)


Lesenswert?

Na dann. wenn du schon Dinge gemacht hast.

Ein Tip:
Wenn du die Uhrezeit als Minuten seit Mitternacht speicherst, fallen die 
Vergleiche einfacher aus, als wenn du sie als Stunden und Minuten 
speicherst.

Stunden / Minuten ist zwar für Anzeige und Eingabe für den Menschen 
bequemer (weil wir es so gewohnt sind), aber programmintern ist eine 
einzige ganze Zahl viel einfacher zu handhaben.

von Daniel J. (n0i5ebreak3r)


Angehängte Dateien:

Lesenswert?

Vielen Dank für denn Tip der hört sich sogar richtig gut an.

Leider Versuche ich vergeblichst mein 4x20 LCD im 4bit Modus zu 
initialisieren. Ich habe das LCD per 4bit an den ATmega32 angeschlossen 
D4-D7 am LCD an PORTA des ATmega PA0-PA3 liegen die Datenleitungen, an 
PA4 - PA6 die Steuersignale. Dies habe ich auch in der lcd-routine.h so 
angepasst. Ich habe das ganze nach dem Tutorial hier gemacht. Habe schon 
einiges gesucht hier und gefunden aber das Display wird nicht 
initialisiert. Es erscheinen lediglich die 2 in meinem Fall weißen 
Balken. Es soll HD47780 kompatible sein der Typ ist YB2004A LBWABBB 5.0V 
Die Offenen Datenleitungen sind auf GND gelegt. Der ATmega32 läuft 
zurzeit bei 16Mhz.

von Frank S. (rtc)


Lesenswert?

Der Atmega32 kann aber nur 8mhz (wenn du ihm nicht einen ext. Quarz 
gibst).
Die offnen Datenleitungen brauchst du bei dem Display nicht zu GND'en.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.