Forum: Mikrocontroller und Digitale Elektronik Timer/Zeitschaltuhr einfach


von Hans A. (hansanne)


Lesenswert?

Grüße an alle im Forum.
Ich möchte mit einem Mikrocontroller eine einfache Schaltuhr im 
Batteriebetrieb bauen. So wie eine Camway(Amazon)Zeitschaltuhr nur ohne 
Display.
Alle 24 Stunden sollte ein Ausgang auf High gehen(Dauer fest im Sketch 
hinterlegt).
An einem Eingang sollte ein Poti angeschlossen sein um die 
Zeitverzögerung(0-12h) einzustellen. Sprich ich stelle den Poti auf 1h 
Stunde ein, drücke den Reset Button. Der Ausgang wird in einer Stunde 
auf High gehen und dann alle 24h wieder. Ich möchte nicht die aktuelle 
Zeit/Wochentag und die "Tagesweckzeiten" einstellen(wie bei dem CAMWAY), 
sondern nur die Verzögerung bis zum ersten Wecken.
Wäre das auch im DeepSleepMode möglich?
Kennt jemand da eine Anleitung bzw. einen Link zu einer Lösung.
Ich hoffe, ich habe das verständlich erklärt.

Alle einen schönen Tag

von Sebastian R. (sebastian_r569)


Lesenswert?

Hans A. schrieb:
> Kennt jemand da eine Anleitung bzw. einen Link zu einer Lösung.
> Ich hoffe, ich habe das verständlich erklärt.

Die Wahrscheinlichkeit, dass jemand genau so etwas schon einmal gemacht 
hat, geht gegen 0. Ein bisschen Eigeninitiative wirst du schon 
aufbringen müssen.

Schnapp' dir nen stromsparenden Controller (MSP430 vielleicht?) und lies 
dich durch die App-Notes, in denen beschrieben steht, wie man die 
Stromsparmodi nutzt. Die Funktion ansich sollte schnell umgesetzt sein.

von Peter D. (peda)


Lesenswert?

Hans A. schrieb:
> Wäre das auch im DeepSleepMode möglich?

Den haben nur die 32Bit-Boliden.
Bei den AVRs ist Power-save ausreichend (<1µA mit 32kHz Quarz), z.B. 
ATmega48P/A.

Für 0..12 Stellungen eignet sich besser ein Hex-Switch.

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

Hans A. schrieb:
> Alle 24 Stunden sollte ein Ausgang auf High gehen(Dauer fest im Sketch
> hinterlegt).
Gut, fest einprogrammiert; kann man so machen, muss man nicht.

> An einem Eingang sollte ein Poti angeschlossen sein um die
> Zeitverzögerung(0-12h) einzustellen. Sprich ich stelle den Poti auf 1h
> Stunde ein, drücke den Reset Button. Der Ausgang wird in einer Stunde
> auf High gehen und dann alle 24h wieder.
Und wann geht er wieder auf LOW?

> Ich hoffe, ich habe das verständlich erklärt.
Nicht ganz, siehe oben.
Und dann fehlt noch die Angabe, wie exakt diese Zeiten sein müssen. Für 
sehr genaue Anforderungen würde ich ein RTC-Modul nehmen, sonst einen µC 
mit Quarz und wenn es gröber sein darf, den internen Oszillator unter 
Verwendung der Timer oder sogar nur den Watchdogoszillator.

Eigentlich ist das eine simple Aufgabe, fast ideal um das Programmieren 
mit einem µC zu üben.

Ich habe mal was ähnliches mal programmiert, allerdings nur für einen 
einmaligen Vorgang und zwei mit Poti einstellbaren Zeiten. Nach Drücken 
einer Taste wird Zeit t1 gewartet und dann für Zeit t2 ein Ausgang 
aktiviert; ohne Wiederholung alle x Stunden und nicht in 
Arduino-Sketch-Format. Da mir die Zeiten nur grob wichtig waren, habe 
ich das mit einem Tiny und dem Watchdogtimer gelöst.

von Stefan F. (Gast)


Lesenswert?

Ich würde das mit einem STM32L0 (mit Uhrenquarz) machen, weil ich damit 
schon ein bisschen experimentiert habe und von daher ein Code-Beispiel 
habe auf das ich aufbauen könnte.

Deren integrierte RTC kann den Mikrocontroller alle 1s bis 36h (mit 
WUCKSEL einstellbar) per Interrupt aufwecken.

Siehe dazu http://stefanfrings.de/stm32/stm32l0.html#rtc_wakeup

Der tiefste Schlafmodus ist "Standby", aus dem kommst du nur mit einem 
"RTC Alarm" heraus. Auch das geht bei den STM32L0.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

HildeK schrieb:
> Und wann geht er wieder auf LOW?

Die Frage wollte ich zuerst auch stellen, aber....

HildeK schrieb:
> Hans A. schrieb:
>> auf High gehen(Dauer fest im Sketch hinterlegt).
> Gut, fest einprogrammiert; kann man so machen, muss man nicht.

....im Zitat steht die Antwort :)

Blöd wäre es nur wenn man per Poti bestimmt dass der Ausgang in 12h auf 
HIGH wechseln soll und die Dauer auf 12h 00m 01s festgenagelt ist.

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

Magnus M. schrieb:
> ....im Zitat steht die Antwort :)

Naja, manchmal lässt mein Textverständnis eben zu wünschen übrig, danke 
für den Hinweis. :-)

von Hans A. (hansanne)


Lesenswert?

Hallo, danke schon mal für die Antworten.
Ich erkläre das Projekt mal genauer. Wir haben ein Angelteich der sehr 
abgelegen ist(Null Handyempfang) da möchten wir einmal am Tag eine 
Handvoll Futter per Automat einbringen. Das zu einer bestimmten Zeit, 
eine Stunde vor Dämmerung.
Jeder der Mitglieder übernimmt eine Woche Dienst mit der Wartung des 
Geländes, das befüllen, sowie Batteriewechsel des Automaten.
Da die Dämmerung sich immer verändert, müßte die Futterzeit öfter 
verstellt werden,dass mir bei dem besagtem Futterautomat(3 
Tastenbedienung für alle Wochentage,Zeiten etc,)für jedes Mitglied nicht 
zumutbar ist.(und ich nicht immer angerufen werden möchte:"Du wie war 
das noch mal mit dem verstellen?"?
Ich möchte das so lösen:
Es wird alle 24 Stunden, 1sec lang gefüttert. Es wird nicht die 
Fütterungszeit eingestellt, sondern die Zeit bis zum ersten füttern. Der 
eine kommt morgens um acht, der ander Mittags....Jeder der die Zeit 
verändert, sollte nur die Zeit bis zum ersten füttern einstellen können, 
danach sollte alle 24 Stunden in einer Schleife gefüttert werden. Der um 
acht kommt(Fütterung z.B.18 Uhr) stellt dann 10 ein, der Mittags kommt 
stellt 6 ein und bestätigt wird mit Reset.
Für jeden verständlich und fehlerfrei einzustellen.
Ich hoffe das ist besser erklärt3

von Peter D. (peda)


Lesenswert?

Hans A. schrieb:
> Ich hoffe das ist besser erklärt3

Das war schon zu Anfang gut zu verstehen. Mit Kontext ist eine Frage 
natürlich immer besser.

Der Automat braucht ja ne kräftige Batterie, da ist kein Geiz um jedes 
µA nötig. 1..20µA dürfte für die Schaltung o.k. sein.
Welche Spannung hat denn die Batterie?
Die AVRs laufen an 1,8V..5,5V ohne zusätzlichen Strom für einen 
Spannungsregler.
Wie gesagt, ein rastender Schalter erleichert das Einstellen. So einen 
AVR im DIP kriegt man leicht auf einer Rasterplatine selber verdrahtet.

Mit mehr Programmiererfahrung kann man die Firmware leicht erweitern. 
Man legt eine Tabelle mit 366 Dämmerungszeiten im Flash ab. Ein 
DCF77-Empfängermodul holt sich einmal am Tag Uhrzeit, Datum und 
Sommerzeit.

Ein 32Bit Bolide bringt hier überhaupt nichts. Im Gegenteil, er macht 
die Programmierung erheblich schwieriger.
Ich habe auf Arbeit einen LPC5347 und fluche jedesmal, wenn auch nur 
eine Zeile programmiert werden muß. Auch die Kollegen tun sich schwer. 
Ich hab z.B. einen Spannungsteiler an einem Pin vorgesehen, um 
verschiedene Bestückungsvarianten zu unterscheiden. Beim AVR wäre das 
eine Sache von 10min, das ADC auslesen einzubauen.
Beim LPC wird das wohl nie was werden und immer per Define umständlich 
zwischen den Versionen umgeschaltet. Ich höre den Support schon fluchen, 
wenn die immer erst nachfragen müssen, welcher Kunde welche Version 
benötigt.

von MaWin (Gast)


Lesenswert?

Hans A. schrieb:
> Da die Dämmerung sich immer verändert, müßte die Futterzeit öfter
> verstellt werden

Eben.

WENN man das also schon per uC löst, dann sollte der mit der Dämmerung 
gehen. Die kann man für eine Geoposition vorausberechnen. Es gibt 
fertige passende Zeitschaltuhren (Sonnenaufgangs/untergangstimer) aber 
das ist auch ein schönen Selbstbauprojekt.

Nur muss man Uhrzeit und auch das Datum einstellen, ggf. sogar die GPS 
Position, braucht also ein Display.
Man kann die Hardware bauen, oder nimmt einen fertigen AVR Butterfly.

Dann muss man nur noch die Software schreiben. Auf das letzte uA kommt 
es auch nicht an, der Fütterungsautomat wird mehr brauchen.

Beitrag #6956479 wurde von einem Moderator gelöscht.
von MaWin (Gast)


Lesenswert?

Fischgemisch schrieb im Beitrag #6956479:
> Man?! Nur noch?

Die Formel für den Sonnenuntergang ist ja nun nicht so schwer

http://www.gandraxa.com/length_of_day.xml

und eine Schaltuhr ist als Beispiel beim Butterfly dabei Alarm (daily 
alarms, kitchen-timers, etc.)

Das Verheiraten beider mag dich überfordern, sollte aber gar für einen 
Schüler zu schaffen sein.

von Hans A. (hansanne)


Lesenswert?

Hallo,
es sollte einfach sein. Batterie wäre eine 6v 4,5Ah Blockw
Und die Leute sollen Teil des ganzen sein.
Es soll nicht alles vorprogrammiert sein.
Der Timer soll alle 24 Stunden was machen, nur der Startpunkt soll 
einstellbar sein. Auch bei Batteriewechsel... einstellen und Reset 
drücken... weiter geht es.
Ich werde noch mal ein wenig Zeit investieren müssen, ,mal schauen ob 
ich es hin bekomme.

von m.n. (Gast)


Lesenswert?

Hans A. schrieb:
> Für jeden verständlich und fehlerfrei einzustellen.

Du brauchst auf jeden Fall eine Uhr mit Quarz.
Reicht es vielleicht, die Zeit auf 1/2 oder 1 h aufgelöst vorzugeben?
Dann würde ich vorschlagen, einen "Reset"-Taster gedrückt zu halten und 
mit einem zweiten Taster die Anzahl der abzuwartenden Stunden 
einzutippen. Zur Kontrolle könnte man eine LED blinken lassen, wenn der 
"Reset"-Taster neu gedrückt wird. Ein Poti könnte entfallen.

Automatische Berechnungen würde ich nicht implementieren. So pingelig 
mit den Futterzeiten werden die Fische wohl kaum sein.

von Adam P. (adamap)


Lesenswert?

Hans A. schrieb:
> An einem Eingang sollte ein Poti angeschlossen sein um die
> Zeitverzögerung(0-12h) einzustellen.

Also ich würde alles nehmen, aber kein Poti.
Da du ja kein Display verwenden möchtest, wäre es nur optisches schätzen 
ob der Analogwert dem entspricht, was du einstellen möchtest.

Ansich ist das Projekt recht einfach (mit den richtigen Bauteilen).
Programmieraufwand + Testläufe <= 1-2 Tag.

Peter D. schrieb:
> Für 0..12 Stellungen eignet sich besser ein Hex-Switch.

Oder Schiebeschalter:
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQl7d0v7RvBsg7n-qX6l7etFayFuLO4-Zr05o_EQdXwPIxy3S6t5R4jwnoyxOuCBUlZFKQ&usqp=CAU

Edit:
Was für Bauteile (µC) hast du parat?
Was bevorzugst du als Entwicklugsumgebung?

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

m.n. schrieb:
> Du brauchst auf jeden Fall eine Uhr mit Quarz.
Ja, wäre nicht schlecht. Vermutlich ist schon der interne Oszillator gut 
genug; es wird ja jede Woche neu gestellt. Man muss ggf. ein wenig 
Aufwand treiben und mit OSCCAL für den IC ein Optimum einstellen.

> Automatische Berechnungen würde ich nicht implementieren. So pingelig
> mit den Futterzeiten werden die Fische wohl kaum sein.
Auch da stimme ich zu.
Da eh einmal in der Woche jemand vorbeikommt und nach der Einrichtung 
schaut, ist es imho auch überflüssig, den Sonnenuntergang zu berechnen. 
Kann man machen, als Kür; ich würde mir die Winkelfunktionsberechnungen 
auf einem kleinen µC auch nicht antun.
In einer Woche ändern sich die Sonnenuntergangszeiten nur um wenige 
Minuten. Im März oder September, wo sich die Tageslänge am deutlichsten 
ändert, sind das gerade mal höchstens 10 Minuten pro Woche.
Größere Fehler würden sich durch die Sommer-/Winterzeitumstellung 
ergeben, wenn man das nicht berücksichtigt.

Adam P. schrieb:
> Also ich würde alles nehmen, aber kein Poti.

Ich denke, das würde mit einem Poti ausreichend gut gehen; mit einem 
Codierschalter ist die Stufung viel gröber. Ratiometrische 
Spannungsmessung und mal durchtesten, wie sich die Zeiten ergeben und 
entsprechend beschriften. Auf eine viertel Stunde hin oder her kommt es 
bei dem Vorgang nicht an, so genau ist das mit einem Poti ohne Probleme 
einstellbar.

Sehr nettes Projektchen für den Einstieg in die µC-Welt 😀.

von chris (Gast)


Lesenswert?

Ja,  wenn du einfach avr verwenden willst, arduino, da haette ich eine 
einige funktionen welche fuer dich. Hier mit nap fuer p328 . Bei Fragen 
einfach melden, sollte aber
Selbsterklaerend sein. Noch was, WDT ist nicht 2048K sondern 2048*1024 
fuer 16ms,
das ist ein fehler der dokumentation, bzw k Fehler von 1000 und 1024.
1
void nap(byte n) {
2
 byte mode=n&0x80?SLEEP_MODE_PWR_SAVE:SLEEP_MODE_PWR_DOWN; n&=˜0x80;
3
 if(n>9) n=9; 
4
 if(n>7) nˆ=64+8; wdt_clear();
5
byte adcsra = ADCSRA;          //save the ADC Control and Status Register A
6
    ADCSRA = 0;                    //disable the ADC
7
 cli();
8
        MCUSR &= ~(1<<WDRF);
9
  WDTCSR |= (1<<WDCE) | (1<<WDE);
10
  WDTCSR  = n;  wdt_clear();
11
  // Enable the WD interrupt (note: no reset).
12
  WDTCSR |= _BV(WDIE);
13
    set_sleep_mode(mode);
14
    cli();                         //stop interrupts to ensure the BOD timed sequence executes as     //disable brown-out detection while sleeping (20-25µA)
15
    uint8_t mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);
16
    uint8_t mcucr2 = mcucr1 & ~_BV(BODSE);
17
    MCUCR = mcucr1;
18
    MCUCR = mcucr2;
19
    sei();                         //ensure interrupts enabled so we can wake up again
20
    sleep_mode();
21
    power_all_enable();
22
    ADCSRA = adcsra;               //restore ADCSRA
23
}
24
25
void sleepS(wod n) { dword t=n*1000; if(n>10) n=(t>>10)+1; byte t=n&7; n>>=3; while(n--) nap(9); while(b--) nap(6);  }
26
sword sleep_(byte frac) {  // returns timing difference, 75 for 20 min, 225 for hour interval
27
   TCNT2 = 0;
28
   nap(0x80);  // 250 = 16ms  at 1mhz clock with prescaler 64
29
   byte n=TCNT2; sbyte w=n; if(n<125) w+=250;  w<<=4; // convert measurement to microseconds
30
   w=16000-w;  // w now holds the timing diff in us
31
   w*=frac; if(w>=0) return w>>10; 
32
  w=-w; w = w>>10; return -w; // workaround for fast div 1000/1024
33
}
34
35
void sleep20M() { // time corrected WDT for 20 minutes
36
  sleepS(560); 
37
  sword w=640+sleep_(75);
38
  sleepS(w);
39
}
40
void sleepH(byte n) { n=n+n+n; n<<=1; while(n--) sleep20M(); } // 0-42 hours as valid args.

von m.n. (Gast)


Lesenswert?

chris schrieb:
> sollte aber
> Selbsterklaerend sein.

Ich verstehe, daß Du helfen möchtest, aber das Konstrukt wird dem TO 
sicher nichts nutzen.

> Noch was, WDT ist nicht 2048K sondern 2048*1024
> fuer 16ms,
> das ist ein fehler der dokumentation, bzw k Fehler von 1000 und 1024.

Der WDT streut so stark von Bauteil zu Bauteil und mit Temperatur und 
Versorgungsspannung, daß diese Berechnung voll ins Leere läuft.
1% Drift bedeutet ca. 15 Minuten Abweichung/Tag.

von Hans A. (hansanne)


Lesenswert?

Danke für die Infos.
Ich werde Anfang der Woche mal testen.
Schönes Wochenende

Beitrag #6959200 wurde vom Autor gelöscht.
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.