zuerst einmal: Ich bin Anfänger in der Arduino Welt. Habe allerdings Programmier- und Elektrotechnische Grundlagen
Folgende Problemstellung habe ich durch meine bessere Hälfte bekommen:
Bauen einer Steuerung zum zeitgesteuertem / verzögertem schalten von Schlössern. (Zur Erklärung es handelt sich um einen Futterschrank für Pferde welcher 4 Klappen hat die zeitverzögert über den Tag/Nacht fallen sollen, damit das Futter unten rausfällt.)
Natürlich könnte man dieses mit Zeitschaltuhren lösen, empfand ich aber als langweilig und nicht weiterbildend
Daher der Ansatz eines Arduino Nano zur Steuerung.
Folgender gedachter Aufbau.
Zwei BCD-Code DIP Schalter -> Einer gibt die Zeit in h bis zum Auslösen der ersten Klappe an, der zweite die Dauer in h der 2., 3., und 4. Klappe;
Einlesen und damit Starten des Programms über einen einfachen Klingelknopf. (Ab dann soll die Zeit des ersten DIP Schalters laufen)
Bisher habe ich getestet: Ansteuern eines Relais für die Schlösser mit den Digital-Ausgängen.
Als nächstes werde ich versuchen die BCD Schalter auszulesen, denke aber auch das dies machbar sein sollte
Gedanklich bin ich allerdings schon weiter und da stelle ich mir folgende Fragen (evtl. auch dem geschuldet, dass ich vor Projektbeginn noch nie mit einem Arduino gearbeitet habe):
Starten des Programms: Hier sehe ich aktuell zwei Möglichkeiten. Entweder ich lasse den Klingelknopf den Nano resetten und lasse das komplette Programm in der setup() funktion laufen, da ja nicht wirklich wiederholende Tätigkeiten da drin sind. Ausser vllt. das auslösen der 2. und folgenden Klappen.
Oder ich prüfe permanent in der loop() funktion den Zustand des Knopfes und starte das Programm nach drücken des Knopfes.
Nun endlich die Fragen:
Kann ich über einen Klingelknopf den Reset des Nano machen?
Bei Variante 2 mit der Schleife. Meinem Verständnis nach kann ich solange das Programm läuft ( und nach jetziger Planung rede ich da über mehrere Stunden; 1.Klappe nach 4h, 2. nach weiteren 3h etc....) keine Änderungen einbringen, oder? D.h. selbst wenn ich dann nochmal den Knopf drücke würde er ja immer noch im Programm hängen und die Eingabe gar nicht abprüfen, oder? Mein jetziger Plan wäre es das Zeitverzögerte auslösen über delay() zu realisieren.
Gibt es noch weitere Vor- / Nachteile die ich aktuell nicht sehe? Gibt es generelle Anmerkungen/Vorschläge?
Ja mir ist durchaus bewusst, dass dies mit Kanonen auf Spatzen schießen ist, aber wie gesagt der Weiterbildungsgedanke
Solange nichts zusätzliches dazukommt, eine einfache Lösung.
Wenn du irgendwann wissen willst, wann der Auslöser das (vor-)letzte Mal betätigt wurde, oder ähnliches, sollte loop natürlich besser "ewig" laufen.
Wenn es nötig ist, bzw. wenn du es von Anfang an richtig machen willst, geht das auch. (Auch in Variante 1)
Die Zeiten dürfen natürlich nicht per delay() realisiert werden.
Schau dir BlinkWithoutDelay an und verstehe, was das mit deiner Aufgabe zu tun hat.
[Nachtrag und Korrektur]
Da das Ding ja stundenlang nichts macht, ist es sinnvoll, zumindest anfangs zum Testen sehen zu können was der Arduino grade macht. Da hilft Serial, wenn du kein Display für deine Zeitschaltuhr bauen möchtest ( Was den Aufwand erheblich vergrößern würde).
Allein um jede Minute einen Text ("Noch xx Minuten bis yy") ausgeben zu können, kannst du kein delay() für 4 Stunden brauchen. Da könnte man auch regelmäßig deine BCD-Schalter auswerten und Änderungen erkennen. Vier Zwei BCD-Schalter brauchen im einfachsten Fall 16 8 Pins, können nur wenige Werte annehmen, und lassen sich nur mühsam einstellen/ablesen. Wie wäre es, auch dafür Serial zu verwenden?
wie sieht es denn aus, für die Uhr ein RTC Modul zu verwenden
und die Zeiten mittels Display und Buttons einstellbar zu machen und im EEPROM zu speichern
BlinkWithoutDelay habe ich mir angeschaut. Ja macht Sinn um nicht "dauerhaft" im delay() zu hängen. Werde ich mal mit rumprobieren.
Ich benötige tatsächlich nur zwei BCD Schalter da ich nur die Stunden bis zur 1. Klappe und mit dem zweiten BCD die Abstände zwischen den Klappen einstellen will. Es soll ja nicht höchstmöglich flexibel sondern möglichst einfach und (hoffentlich) Anwenderfreundlich sein....
@noiasca : Über Zeitmodul habe ich auch nachgedacht, aber aufgrund der eigentlich recht simplen Anwendungsgebietes mich dagegen entschieden.
Ziel meinerseits ist es aufgrund der Umgebung wo das Ding nachher stehen wird (kalt, staubig) einen möglichst verschlossenen Kasten mit nur dem Knopf und den beiden BCD Schaltern hinzustellen. Der Rest gut geschützt im Kasten.
Hallo
Auf der Basis von BlinkWithoutDelay einfach für jeden Futtertrog eine Eieruhr bauen und dann diese zeitlich für n-Futtertroge verketten.
Wie wird die Klappe am Futtertrog ausgelöst?
Ich wünsche einen schönen Tag und viel Spaß beim Programmieren in C++.
Habe hierfür mir 12V Schlösser besorgt. Die Ansteuerung über ein 4-fach Relais habe ich auch schon hinbekommen.
Werde mich sobald Abends wieder Zeit ist hinsetzen und das ganze mit BlinkWithoutDelay mal probieren.
Ein Mittelding wäre ein delay(60000); in loop() und jede Minute die Zeit runterzählen.
Aber eine loop die gar keine Zeit braucht, ist natürlich prinzipiell besser.
Viel Spaß beim Schreiben von ewig laufender Software. Vermutlich eine Ergänzung zu deiner Programmiererfahrung.
Habe nun endlich mal Zeit gefunden mich mal wieder mit meinem Projekt zu beschäftigen und nun stehe ich grad voll auf dem Schlauch....
Versuche einen BCD Schalter (Einstellmöglichkeit 0-9) einzulesen und hänge grad massiv.
Habe den BCD an A0 -A3 gehangen, weil wenn ich das richtig verstanden habe, ich mit
byte StartZeit = PINC & 0x0F;
den BCD einfach einlesen kann ? Stimmt das ?
Falls dem so ist, steht ja nun der Wert (ich nehme mal 2 an) als byte in der Variablen StartZeit quasi: 0010
Das soll ja jetzt für mich 2 Stunden bedeuten. Wie kriege ich jetzt aus dem byte ein int um das über multiplikation die 2Stunden in Millisekunden umzurechnen, oder kann ich da auch mit den byte weiterrechnen?
Das funktioniert so nicht. Das musst Du innerhalb einer Funktion machen. Und wie sind die Schalter angeschlossen? Du wirst vermutlich den internen Pullup Widerstand einschalten müssen ( oder hast Du externe Pullup/Pulldown Widerstände dran? ).