Zeitschaltung Relais

Hallo!

Ich würde ein wenig Hilfe benötigen.
Meine Idee wäre ein aussenlicht über ein Relais zu schalten. Natürlich über einen arduino der mittels Drucktaster bei Betätigung 5 Minuten Countdown addiert, und dann runter zählt und die restzeit auf einem Display anzeigt.

Ich komme aber auf keinen grünen Zweig wie ich das am besten anstelle...

Danke für eure Tipps!

was hast du bisher?

Ungefähr so?

const int Taste_Pin = 12;  // Taster nach Masse schaltend
const int Relais_Pin = 13; // Anschlusspin für Relaistreiber


const unsigned long T_Leucht = 10 * 1000L;  // Leuchtdauer der Lampe in ms
unsigned long T_Taste;
unsigned long Restzeit;

void setup() {
  Serial.begin(115200);
  pinMode(Taste_Pin,INPUT_PULLUP);
  pinMode(Relais_Pin,OUTPUT);
}

void loop() {
  if (digitalRead(Taste_Pin) == LOW){    // wenn Taste gedrückt
    T_Taste = millis();                  // Zeitpunkt merken.
    Serial.print("Taste gedrückt, Zeit gemerkt. T_Taste = ");Serial.println(T_Taste);
  }
  
  
  if ( millis() - T_Taste < T_Leucht){
    digitalWrite(Relais_Pin, HIGH);    
    Restzeit = (T_Leucht - (millis() - T_Taste))/1000;
  } else {    
    digitalWrite(Relais_Pin, LOW);
    Restzeit = 0;
  }
  
// dieser Codeteil dient nur zur Anzeige der wichtigsten Variablen auf dem Seriellen Monitor
  Serial.print(millis());Serial.print(" - ");Serial.print(T_Taste);Serial.print(" = ");Serial.print(millis() - T_Taste);
  Serial.print(" < ");Serial.print(T_Leucht);Serial.print("    \tRestzeit:");Serial.print(Restzeit);Serial.println("sek");
  delay(500); // delay, damit der SerMon nicht zu schnell läuft
  
}

aber das Display mußt du schon selbst einbinden.

Und wozu ein Arduino dafür? Wie funktioniert Treppenlicht? Zeitrelais? Vielleicht doch dass nehmen?

Danke für den Input guntherb!
Das war mir nicht klar wie ich das programieren soll.
Aber drücke ich die Taste wieder, merkt er sich dann +5min oder laufen immer nur 5min ab?
(Sorry, ich steh am anfang meiner Programiererei. :wink:

skorpi08, klar könnte man solche sachen fertig kaufen, aber genau dass will ich ja nicht, Ich will tüfteln :smiley:

Chrisblueeyes:
Aber drücke ich die Taste wieder, merkt er sich dann +5min oder laufen immer nur 5min ab?

Das, meine lieber Freund, versuche doch mal selbst rauszufinden!
Du kannst es einfach probieren, oder versuchen den Code zu verstehen.
Momentan steht im Code sowieso nur 10Sek Leuchtzeit, damit man es leichter testen kann.

Wenn du aufmerksam auf das Board schaust, dann wirst du festellen, dass die fest verbaute LED an Pin13 ebenfalls 10 sek leuchtet, nachdem du Pin 12 kurz auf Masse gezogen hast.

Meinen Code sollst du bitte nicht als Lösung verstehen, sondern als Einstieg ins selber machen.
Bei gezielten Fragen wird dir sicher weitergeholfen werden.
Aber jetzt lade doch einfach den Code auf deinen Arduino und fange an zu probieren.

Ja, Programmiererfahrung mußt Du Dir selbst aneignen.

Andere Sache:
Du willlst mit 230V arbeiten? Hast Du die Ausbildung und Erfahrung das zu machen?? Ansonsten raten wir Dir das entweder zu lassen oder jemanden der das kann machen zu lassen.

Grüße Uwe

Uwe, du meinst sicher "Ausbildung oder Erfahrung".

Jemand der schreibt "genau dass will ich ja nicht, Ich will tüfteln", wird vermutlich keinen Elektriker beauftragen, eine Lampe zu montieren.

Erinnert mich übrigens an den "Junge fahr vorsichtig" im Postillon :wink:

Dass Chris hier keinen komplett fertigen Sketch kriegt, find ich übrigens gut :wink:
Wenn es ihn stört, dass man die Taste evtl. mal eine halbe Sekunde lang drücken muss bis was passiert, soll er auch erstmal selber forschen und tüfteln, warum.

( Kann man übrigens verbessern, Chris)

Uwe, du meinst sicher "Ausbildung oder Erfahrung".

Nein ich meine beides. Ich kenne das aus Erfahrung, daß nicht jeder der etwas gelernt haben müßte (wegen Ausbildung) das auch wirklich kann.

Grüße Uwe

michael_x:
Erinnert mich übrigens an den "Junge fahr vorsichtig" im Postillon :wink:

wie er sein Fahrzeug führen sollte. "Ich habe noch überlegt. Soll ich langsam fahren oder schnell? Offensiv oder defensiv?"
Der verwirrte Mann entschied sich letztlich, Vollgas zu geben und mit geschlossenen Augen Schlangenlinien zu fahren.

Gerda W., die ihre Unachtsamkeit damit begründet, dass sie abgelenkt war, weil sie "dem Jungen doch noch ein Stück Kuchen mitgeben wollte", muss nun für den verursachten Schaden und die Krankenhauskosten aufkommen. Außerdem erhält sie vier Punkte in der Verkehrssünderkartei in Flensburg sowie drei Monate Fahrverbot.

Also ich hab zwar schon Pferde gesehen die vor der Apotheke kotzen, aber sowas....

Wenn dann der Chris ein Elektriker fragt obs so O.K. wäre und der meint ja, wenn dies und dass erfüllt ist etc pp
Nachher passiert was und Chris sagt, der Elektriker hat gesagt ist gut so. Dann ist muss wohl der Elektriker auch ins Knast.

uwefed:
Nein ich meine beides. Ich kenne das aus Erfahrung, daß nicht jeder der etwas gelernt haben müßte (wegen Ausbildung) das auch wirklich kann.

Grüße Uwe

sehe ich genauso.

Wenn dann der Chris ein Elektriker fragt obs so O.K. wäre und der meint ja, wenn dies und dass erfüllt ist etc pp
Nachher passiert was und Chris sagt, der Elektriker hat gesagt ist gut so. Dann ist muss wohl der Elektriker auch ins Knast.

Wieso auch ins Knast. Entweder der Elektriker, oder Chris, oder keiner.
Deswegen sagt der Elektriker kaum "ist gut so".
Deswegen fragt Chris erst gar nicht.

Dass einer zwar eine Ausbildung hat, aber man ihn besser nichts machen lassen sollte, damit nix passiert, daran habe ich nicht gedacht. ;D

Das sollte doch wohl das erste sein, was man in der Ausbildung lernt.

Also, dass ich eine Lampe anschließen kann auf 230V steht außer Frage, hab bei mir im Haus einen Großteil der Elektro Installation selbst gemacht (mit Abnahme vom Funkenschuster) :wink:

Und das ging auch ohne Programmierkenntnisse. Nun will ich eben beides verbinden, meinen Horizont erweitern 8)

guntherb:
Das, meine lieber Freund, versuche doch mal selbst rauszufinden!
Du kannst es einfach probieren, oder versuchen den Code zu verstehen.
Momentan steht im Code sowieso nur 10Sek Leuchtzeit, damit man es leichter testen kann.

Getestet und daran verzweifelt, die schaltzeit durch erneutes drücken zu erhöhen.
brauch ich da ein array worin die anzahl der tastenanschläge gespeichert werden oder irre ich da?

Chrisblueeyes:
Getestet und daran verzweifelt, die schaltzeit durch erneutes drücken zu erhöhen.
brauch ich da ein array worin die anzahl der tastenanschläge gespeichert werden oder irre ich da?

Richtig.
Das funktioniert gerade wie ein Treppenhausautomat: Drücken läßt das Licht 5min brennen. 2* drücken ändert auch nix.

Im Code:
Wenn die Taste gedrückt wird, merkt er sich den Zeitpunkt.

    if (digitalRead(Taste_Pin) == LOW){    // wenn Taste gedrückt
      T_Taste = millis();                  // Zeitpunkt merken.

Dann prüft er ständig, ob seit dem Zeitpunkt des Drückens mehr Zeit als T_Leucht vergangen ist,
if ( millis() - T_Taste < T_Leucht){und schaltet entsprechend den Pin.

Wenn du nun pro Tastendruck die Zeit erhöhen willst, dann könntest du z.B. einfach noch eine Variable einführen. Nennen wir sie T_Zaehler.

Jedes mal, wenn die Taste gedrückt wird, wird T_Zaehler um eins erhöht.

Und bei der Abfrage, ob die Zeit schon rum ist, vergleichst du nicht mit der Zeit T_Leucht, sondern mit T_Leucht * T_Zaehler.

if ( millis() - T_Taste < T_Leucht*T_Zaehler){

Wenn die Zeit abgelaufen ist, und das Licht wieder aus, also im else-Zweig, mußt du T_Zaehler wieder auf Null setzen.

Das ist einfach, und das solltest du hinkriegen.
Wenns nicht geht, poste deinen Sketch und frage um Rat.

Gunther

P.S.:

michael_x:
Wenn es ihn stört, dass man die Taste evtl. mal eine halbe Sekunde lang drücken muss bis was passiert, soll er auch erstmal selber forschen und tüfteln, warum.

wenn das delay() im Seriellen Anzeigeteil weg ist, wird der Taster alle 3ms abgefragt. Das sollte reichen. Aber ich fürchte, dann kommt das Prellen zum tragen.

vor allem, wenn alle 3 ms der Zähler erhöht wird, brennt das Licht das ganze Jahr :slight_smile: :slight_smile: :slight_smile:

Da sollte in der finalen Version rein, dass beim Drücken 1 x hochgezählt wird, dann muss wieder losgelassen werden, damit weiter hochgezählt werden kann.

Ich habe bei einer Schaltung alle 50ms die Taster abgefragt, wenn ich dann länger draufbleibe, läuft die "Leuchtzeit" hoch. allerdings nicht mit Zähler, der ein Vielfaches macht, sondern die Zeit einfach nur um 10 cec erhöht. D.h. ich drücke 1 sec, = 20 Abfragen = Leuchtdauer um 200 sec erhöht. Mit LCD Display kann man das schön sehen. Ggf. kann man mit 2. Taster (macht beim Treppenhauslicht wenig Sinn) die Zeit wieder reduzieren, oder, was beim Treppenhauslicht Sinn macht, mit langem Druck ausschalten.

Aber dafür muss Chrisblueeyes sich erst noch etwas einlesen.

ElEspanol:
Aber dafür muss Chrisblueeyes sich erst noch etwas einlesen.

Richtig. Ein Schritt nach dem anderen.

const int Taste_Pin = 12;  // Taster nach Masse schaltend
const int Relais_Pin = 13; // Anschlusspin für Relaistreiber

int buttonState = 0;
int counter = 0;
int buttonStateHIGH = 0;

const unsigned long T_Leucht = 10 * 3000;  // Leuchtdauer der Lampe in ms
unsigned long T_Taste;
unsigned long Restzeit;

void setup() {
  Serial.begin(115200);
  pinMode(Taste_Pin,INPUT_PULLUP);
  pinMode(Relais_Pin,OUTPUT);
  digitalWrite(Relais_Pin, HIGH);
}

void loop() {
  
  if (digitalRead(Taste_Pin) == LOW){    // wenn Taste gedrückt
    T_Taste = millis();      // Zeitpunkt merken.
    buttonStateHIGH = 0;
    Serial.print("Taste gedrückt, Zeit gemerkt. T_Taste = ");Serial.println(T_Taste);
  }
  if (Taste_Pin == HIGH && buttonStateHIGH == 0)
 {
   counter++;
   buttonStateHIGH = 1;
 }
  
  
  if ( millis() - T_Taste < T_Leucht*counter){
    digitalWrite(Relais_Pin, LOW);    
    Restzeit = (T_Leucht - (millis() - T_Taste))/1000;
  } else {    
    digitalWrite(Relais_Pin, HIGH);
    Restzeit = 0;
    buttonStateHIGH = 0;
       delay(50);
  }
  
// dieser Codeteil dient nur zur Anzeige der wichtigsten Variablen auf dem Seriellen Monitor
  Serial.print(millis());Serial.print(" - ");Serial.print(T_Taste);Serial.print(" = ");Serial.print(millis() - T_Taste);
  Serial.print(" < ");Serial.print(T_Leucht);Serial.print("    \tRestzeit:");Serial.print(Restzeit);Serial.println("sek");
  
  
}

Soweit und dann steh ich an :drooling_face:

Chrisblueeyes:
Soweit und dann steh ich an :drooling_face:

Und wo genau stehst du an?

Eine ein klein wenig ausführlichere Fehlerbeschreibung wäre hilfreich.

Der Counter, sobald ich die taste drücke passiert original garnichts.

gib mir noch 20min.
Ich muß erst noch meine Kleine ins Bett bringen...