Timer/Zeitschaltuhr einfach

OP #6955784
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
#6955836
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.
Gast #6955921
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.
Gast #6955949
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.
Persönliche Seite #6956099
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.
OP #6956415
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
#6956462
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.
Gast #6956475
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.
OP #6956521
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.
Gast #6956524
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.
#6956550
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?
Gast #6956684
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 😀.
Gast #6957495
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.
Gast #6957653
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.
Beitrag #6959200 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren