Timer über Schalter aktivieren/deaktivieren

Hallo,

kurz folgende Schilderung zum Vorhaben.

Ich möchte mit einem Tastschalter einen Timer für z.B. 8 Std aktivieren, wenn der Timer aktiv ist, soll eine LED leuchten, wenn der Timer abgelaufen ist, soll die LED erlöschen. Die Zeit des Timers ist immer die selbe, also bspw. 8Std.

Solange der Timer aktiv ist, muss ein Signal auf zwei anderen PINS unterbrochen werden, also eine Art Zeitschaltuhr.

Das Signal das unterbrochen werden soll hat eine Spannung von ca. 9V.

Wie kann ich das am Besten umsetzen?

Gruß, Dominik

tom1tom11: Hallo,

kurz folgende Schilderung zum Vorhaben.

Ich möchte mit einem Tastschalter einen Timer für z.B. 8 Std aktivieren, wenn der Timer aktiv ist, soll eine LED leuchten, wenn der Timer abgelaufen ist, soll die LED erlöschen. Die Zeit des Timers ist immer die selbe, also bspw. 8Std.

Solange der Timer aktiv ist, muss ein Signal auf zwei anderen PINS unterbrochen werden, also eine Art Zeitschaltuhr.

Das Signal das unterbrochen werden soll hat eine Spannung von ca. 9V.

Wie kann ich das am Besten umsetzen?

Gruß, Dominik

Das meiste kannst du per Software (Sketch) lösen. Die Spannung von 9 Volt schaltest du mit einem Relais oder Transistor, evtl. mit einem Optokoppler zur Potentialtrennung davor.

Hallo Dominik!

Da hätte ich vielleicht was für Dich:

  • Ein Taster schaltet die LED-Beleuchtung (9V!) ein
  • Nach Ablauf einer im Programm hinterlegten Zeit schaltet sich die Beleuchtung von selbst wieder aus.
  • Alternativ kann die Beleuchtung durch nochmaliges drücken des Tasters jederzeit ausgeschaltet werden.

Zusätzlich

  • Die Helligkeit der Beleuchtung kann über einen Potentiometer eingestellt werden.
  • Bei Nullstellung des Potentiometers ist die Beleuchtung nicht dunkel sondern leuchtet mit sehr geringer Intensität.

Wenn Interesse besteht - melden - dann sende ich Dir die Projekt Mappe mit Schaltplan, Programm Listing, Berechnungen etc. zu.

Gruß Martin

tom1tom11: ... kurz folgende Schilderung zum Vorhaben. ...

Nur kurz ein Hinweis: Wenn es bei der Zeitmessung um absolute Genauigkeit geht, ist ein Ardino allein nicht so gut. Die Ganggenauigkeit ist so „schlecht“, dass sogar Arduinos der selben Charge nach wenigen Minuten deutlich unterschiedlich „ticken“.

Wenn es Dir nur um das wiederholte Messen einer immer gleichen Zeitspanne geht, ist ein Arduino in Ordnung.

Gruß

Gregor

gregorss: Nur kurz ein Hinweis: Wenn es bei der Zeitmessung um absolute Genauigkeit geht, ist ein Ardino allein nicht so gut. Die Ganggenauigkeit ist so „schlecht“, dass sogar Arduinos der selben Charge nach wenigen Minuten deutlich unterschiedlich „ticken“.

Wenn es Dir nur um das wiederholte Messen einer immer gleichen Zeitspanne geht, ist ein Arduino in Ordnung.

Abhilfe bringen Arduino Clone mit Quarz wie dieser. Man erkennt sie an den zwei großen ovalen silbernden Quarzen.

Alternativ kann man auch eine Echtzeituhr wie die DS3231 nutzen.

Wie es Theseus schon schrieb: eine DS3231 verwenden

vielleicht mit dieser Lib https://github.com/PaulStoffregen/TimeAlarms

Grüße Stefan

Ich habe mir zwischenzeitlich natürlich auch Gedanken gemacht und dabei folgendes zusammengeschrieben:

const int RELAISPin = 4;
const int TASTER = 7;
const int LEDPin =  10;

int LEDStatus = LOW;
int TASTERStatus;
unsigned long vorher = 0;             // Speichert den letzten Zustand der LED
long AN = 0;                       // ms für AN
long AUS = 5000;                         // ms für AUS
unsigned long entprellen = 100;      // Entprellzeit in ms

void setup() 
{
  pinMode(RELAISPin, OUTPUT);
  pinMode(LEDPin, OUTPUT);   
  pinMode (TASTER, INPUT);  
}

void loop()
{
unsigned long aktuell = millis();

   TASTERStatus = digitalRead(TASTER);

  if((TASTERStatus == LOW) && (aktuell - vorher  >= AUS))
  {
    LEDStatus = HIGH; 
    vorher = aktuell;
    digitalWrite(LEDPin, LEDStatus);
      digitalWrite(RELAISPin, HIGH);
  }
  
   else if ((TASTERStatus == HIGH) && (aktuell - vorher > entprellen >= AN))
  {
    LEDStatus = LOW;
    vorher = aktuell;   
    digitalWrite(LEDPin, LEDStatus);
  digitalWrite(RELAISPin, LOW);
    delay(200);
  }
}

Ganz grundsätzlich funktioniert das auch schon fast, wobei ich denke, dass das nicht so 100%ig korrekt ist, denn teils reagiert der Tastschalter auch irgendwie induktiv - zumindest habe ich das Gefühl.

@Wuehlmaus was hast Du denn da? Klingt genau nach dem was ich suche.

Ihr werdet lachen, aber mir ist heute eine nützliche, aber auch lustige Idee gekommen. Und zwar arbeitet meine Frau ausschließlich nachts und schläft dann vormittags. Der dumme Postbote weiß das auch, aber er klingelt trotzdem sehr häufig -> meine Frau wacht natürlich jedesmal auf.

Jetzt möchte ich dieses "Projekt" in die Klingel einbauen, sodass sie vor dem Schlafen gehen kurz den Schalter drückt, mit der LED sichtbar wird, dass das Ding auch "scharf geschalten" ist die Klingel ist entsprechend dem Timer deaktiviert.

Mit meinem Code wird das aber so nicht klappen, da ich dummerweise millis verwendet habe und sich damit Stunden eher schlecht abbilden lassen.

Der Timer soll jeden Tag nachdem der Schalter kurz gedrückt wurde, für 6 Stunden ein Relais schalten, dass die Klingel unterbricht.

Nicht mehr und nicht weniger ;-)

Freue mich über weitere Anregungen!

Gruß, Dominik

Wie ja schon erwähnt wurde: Der Arduino alleine ist zur Zeitmessung nur sehr bedingt geeignet, weil im Vergleich zu einer “echten” Uhr ziemlich ungenau.
Wenn es aber auf ein mehrere Minuten plus oder minus pro Tag nicht ankommt, dann könnte folgendes funktionieren, das auf deinem Sektch aufbaut.
Es macht folgendes:

  • Wird der Taster gedrückt, wird der “Timer” aktiviert und es werden für die Dauer von “interval” LEDPin und RELAISPin HIGH.
  • Der Taster tastet übrigens nach GND.
  • Wird der Taster gedrückt während der “Timer” aktiv ist, wird dieser deaktiviert und LEDPin und RELAISPin werden LOW. Der “Timer” wird also wieder ausgeschalten.
  • Interval, also die “Timer-on-Zeit” kann bis zu etwa 49 Tage lang sein. Also mehrere Stunden sind kein Problem.
  • Das Ganze ist (bis auf ein paar Milisekunden zur Taster-Entprellung) blockierungsfrei, der Arduino könnte sich also auch noch um anderes kümmern.Vielleicht musst du den Sketch noch auf deine Bedürfnisse anpassen.
const int RELAISPin = 4;
const int TASTER = 7;   
const int LEDPin =  10;
boolean aktButton, altButton, aktiv;
unsigned long startTime;
const unsigned long interval = 5 * 1000;  // das sind 5 Sekunden zum Testen; kann max ca. 49 Tage sein
                                          // 6 Stunden wären: 6 * 60 * 60 * 1000
void setup() {
  pinMode(RELAISPin, OUTPUT);
  pinMode(LEDPin, OUTPUT);   
  pinMode(TASTER, INPUT_PULLUP);     // geändert auf INPUT_PULLUP
}

void loop() {
  altButton = aktButton;
  aktButton = digitalRead(TASTER);
  
  if (altButton && !aktButton)   // wenn der Taster gedrückt wurde...
  {
    aktiv = !aktiv;
    delay(30);  // einfaches Entprellen
    startTime = millis();    // Starten des "Timers"
  }
  
  if (!altButton && aktButton)   // wenn der Taster losgelassen wurde...
  { // was passieren soll, wenn der Taster losgelassen wird könnte hier stehen
    delay(30);  // einfaches Entprellen
  }
   
  if (aktiv == true)
  {  if (millis() - startTime < interval)  // wenn die Zeit noch nicht abgelaufen ist...
     {  digitalWrite(LEDPin, HIGH);
        digitalWrite(RELAISPin, HIGH);
     }
     else  // wenn die Zeit bereits abgelaufen ist
     {  aktiv = false;
     }
  }
  else     // wenn aktiv == false
  {  digitalWrite(LEDPin, LOW);
     digitalWrite(RELAISPin, LOW);
  }

}

Wie gesagt: das ist nur praktikabel, wenn über Ungenauigkeiten bei der Zeitmessung großzügig hinweggesehen werden kann, wenn es also kein großes Problem ist, dass die z.B. 6 Stunden nur 5:55 oder vielleicht 6:10 sind.

Natürlich lässt sich die Genauigkeit mit entsprechenden Tricks ein wenig erhöhen, aber wenn die Genauigkeit wichtig ist, dann führt kaum ein Weg an einer RTC (“Real Time Clock” z.B. DS3231) herum. Die erwähnte RTC hat auch einen “Alarm”, man kann also die gewünschte Zeit direkt auf der RTC einstellen und diese “kümmert” sich entsprechend darum.

Aber vielleicht ist die Ungenauigkeit ja kein allzu großes Problem …
Kommt ja immer auf die Anwendung an :slight_smile:

Zum Schalten eines Relais brauchst du noch einen Transistor (oder MOSFET) und eine Diode oder du verwendest ein passendes Relaismodul, da ist das meist schon verbaut.

Servus uxomm,

besten Dank für Deinen Beitrag! Ich habe den Code mal auf den Nano gezogen und muss sagen, dass er besser funktioniert als meiner ;-) Ich habe in meiner "Universalschublade" gewühlt und dabei tatsächlich ein RTC Modul ausgegraben - allerdings keines mit einem DS3231, sondern mit einem DS1302. Das sollte auch funktionieren oder?

Ich mach mich mal dran, dass in den Code zu implementieren. Brauchen tue ich es nicht, da es wirklich nicht darauf ankommt, ob der Timer 5 oder 10min länger/weniger aktiv ist, aber schaden kann es auch nicht =)

EDIT: Ich hatte zum Testaufbau statt der Klingel einen 12V Lüfter an einem (nicht lachen) 4-Ch Relais. Jetzt möchte ich das Relais gegen einen Transistor tauschen. Dazu habe ich wieder in der "Wunderschublade" gewühlt und einen BC-337-40 ausgegraben, der dafür passen könnte. Alternativ hätte ich noch einen IRF 9Z34N als MOSFET. Nun gilt es die Schaltung aufzubauen, nur wie? Vermutlich muss ich noch irgendeine Sperrdiode verwenden, damit der Arduino nicht abraucht, wenn jemand auf die Klingel drückt :-D

Den Arduino Nano tausche ich auch noch aus. Und zwar habe ich mir dazu einen Digispark herausgesucht, da dessen Bauform wesentlich kleiner ist und alles am Ende in die Gegensprechanlage reinpassen muss. Die Schaltung muss also sehr klein werden. Gruß, Dominik

Hallo, ja die DS1302 ist auch eine RTC, allerdings ziemlich ungenau im Vergleich zur DS3231 (Ungenauigkeit pro Jahr: DS3231 ein paar Sekunden, DS1302 mehrere Stunden) und sie hat leider keinen Alarm, was aber nur heißt, dass du dich mit entsprechendem Programmcode selber darum kümmern musst. Bzw. hat stevie72 in Anwort #5 ja schon auf eine hilfreiche Library hingewiesen.

Der BC337 ist ein "Standard" NPN Transistor und kann sinnvoll bis etwa 500mA verwendet werden. Grundschaltungen findest du zum Beispiel hier: mikrocontroller.net/articles/Relais_mit_Logik_ansteuern gleich im ersten Bild ist zum Beispiel ein BC337 als Low-Side-Schalter gezeigt. Dass dabei ein Relais geschalten wird tut nichts zur Sache, du kannst das Relais auch durch andere Lasten (Klingel, Motor etc.) ersetzen.

Der IRF9Z34N ist ein P-Kanal MOSFET, der braucht gundsätzlich eine ganz andere Beschaltung, weil er "vor" der Last, also als High-Side-Switch eingesetzt wird. Beispiele siehe z.B. hier: http://www.gammon.com.au/forum/?id=12737&reply=1#reply1 Stichwort "High Side Driver".

Welche Schaltung nötig/sinnvoll ist, hängt stark von deinen Rahmenbedingungen ab. Wo also der Transistor oder MOSFET positioniert wird.

Ich persönlich würde aber eher zu einer Lösung mit Potentialtrennung raten, also den Einsatz von Relais. Und falls der vorhandene Platz recht begrenzt ist: Es gibt auch von der Bauform her kleine Relais: (nur eine Beispiel).

Ich habe meine Gegensprechanlage auch ein wenig um verschiedene Funktionen "ergänzt" :) . Allerdings habe ich da mehrere Relais verbaut, damit die Gegensprechanlage völlig getrennt von meiner Elektronik ist. In dem Haus gibt es ja noch einige andere Wohnungen und ich weiß nicht, was in der Gegensprechanlage sonst noch so verbaut ist und auch nicht welche "Experimente" andere Hausbewohner mit ihrem Anschluss machen - ich will da möglichst wenig Risiko eingehen. Anders ist das natürlich, wenn du die Gegensprechanlage alleine benutzt.

Und ja, ein Digispark schafft das alles wohl auch.

Wünsche gutes Gelingen!

Ich möchte mit dem Projekt das erste Mal versuchen eine Platine selbst zu ätzen. Dazu habe ich mir das Ganze als Circuit aufgezeichnet.

Die 4er Pin-Leiste soll das Relais 7271D darstellen, allerdings habe ich keine Ahnung wie ich das in den Schaltplan einbinden muss. Der Transistor fliegt dann natürlich raus und der 1x2er Pin sind die beiden Anschlüsse für das Klingelkabel. Auf dem Breadboard hat alles schonmal geklappt, aber ich würde mich trotzdem freuen, wenn jemand von Euch drüber schaut ;-) Hier der Schaltplan, angepasst auf den DigiSpark: https://circuits.io/circuits/4294820-klingel_timer

Das lustige Projekt “Timer” ist nun abgeschlossen und funktioniert. =)

Danke an alle Helfer!

Falls das jemand nachbauen will, einfach eine PN, dann sende ich alle Unterlagen zu!

Wuehlmaus: Hallo Dominik!

Da hätte ich vielleicht was für Dich:

  • Ein Taster schaltet die LED-Beleuchtung (9V!) ein
  • Nach Ablauf einer im Programm hinterlegten Zeit schaltet sich die Beleuchtung von selbst wieder aus.
  • Alternativ kann die Beleuchtung durch nochmaliges drücken des Tasters jederzeit ausgeschaltet werden.

Zusätzlich

  • Die Helligkeit der Beleuchtung kann über einen Potentiometer eingestellt werden.
  • Bei Nullstellung des Potentiometers ist die Beleuchtung nicht dunkel sondern leuchtet mit sehr geringer Intensität.

Wenn Interesse besteht - melden - dann sende ich Dir die Projekt Mappe mit Schaltplan, Programm Listing, Berechnungen etc. zu.

Gruß Martin

Hi Wuehlmaus,

ich suche sowas, würdest du mir hier vielleicht was schicken?

Vielen Dank!

Andreas