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
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.
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
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.
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.
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
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. :-)
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
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.
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.
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.
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.
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.
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
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 😀.
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. |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.