Möchte gerne 2 Ausgänge über einen Taster Steuern mit 2 Zeiten

Tach erst mal.

Ich bin in dem Bereich noch völlig neu.

Eigendlich bin ich mehr für die Harteware ( 240 mm² dann fühl ich mich wohl )

Jetzt zum Problem.

Teil 1

Ich hab einen Taster, der soll bei Betätigung den Ersten Ausgang für 0,5 sec ansteuern.

Nach 30 Sec soll der zweite Eingang für 0,5 sec angesteuert werden.

Teil 2

Nach 12 Stunden muss ohne betätigen des Tasters Teil 1 ablaufen, es sei den, der Taster wurde betätigt, dann muss die Zeit von vorne Starten.

Teil 2 darf nur arbeiten, wenn ein zweiter Eingang 1 ist.

Ich wollte dafür einen Joy-IT Digispark Microcontroller verwenden.

Kann mir einer helfen?

Schrotty:
.....

Kann mir einer helfen?

Ja, wieso nicht.
Wir helfen hier alle gern.

Hast du dir denn die Beispiele in der IDE schon mal angesehen ?
Da werden Tasterfunktionen sehr schön als Beispiel beschrieben.

Ja, hab da das Problem gelesen, das der Timer alles stoppt.

Jetzt gibt es noch andere Timer?

Ich muss immer wieder Teil 1 auslösen können und damit Timer 2 neustarten.

Von welchem Timer sprichst du ?
Wenn du eine Steuerung aufbaust und die richtig programmierst, wird da nichts gestoppt, ausser du willst es und baust es ein.

Hi

Dein Ablauf ist bis jetzt etwas verwirrend.

  • Du drückst einen Taster
  • Ausgang 1 wird eingeschaltet
  • nach 0,5 Sek wird Ausgang 1 abgeschaltet
  • nach 12 Stunden UND, wenn ein Eingang auf 1 ist, wird Ausgang 2 eingeschaltet
  • nach 0,5 Sek wird Ausgang 2 abgeschaltet

... wenn zwischenzeitlich der Taster erneut gedrückt wird, starten die 12 Stunden von Vorne und/oder wird der Ausgang 1 eingeschaltet - also 'springen wir vor die 12 Stunden Pause'.

Oder so ungefähr?

MfG

Morgen liefere ich mal ein Ablaufdiagramm.

Vorab:

Taster kurz betätigt ( Egal wie lang )
Ausgang 1 ein für 0,5 sec
Timer 30 Sec
Ausgang 2 ein für 0,5 sec

Timer 2 läuft los nach 12 Stunden Ablauf wie nach dem Taster betätigen

Während der Timer 2 läuft muss aber jederzeit die Tasterfunktion gegeben sein und den Timer 2 neustarten.

Tasten via Bounce2, Ablauf über eine Statemachine (compiled, ungetestet).

#include <Bounce2.h>

const byte buttonPin = 2;
const byte enablePin = 3;
const byte ledPinA = 13;
const byte ledPinB = 12;

const unsigned long period1 = 500;
const unsigned long period2 = 30 * 1000UL;
const unsigned long period3 = 500;
const unsigned long period4 = 12 * 60 * 1000UL;

enum Zustaende {
  idle,
  oneOnFirst,
  pauseFirst,
  twoOnFirst,
  longPause,
  oneOnLast,
  pauseLast,
  twoOnLast,
};

byte zustand = idle;
unsigned long startTime;

Bounce key;
Bounce enable;

void setup() {
  pinMode(ledPinA, OUTPUT);
  pinMode (ledPinB, OUTPUT);
  key.attach(buttonPin, INPUT_PULLUP);
  enable.attach(enablePin, INPUT_PULLUP);
}

void loop() {
  unsigned long topLoop = millis();
  switch (zustand) {
    case idle:
      if (key.update() && key.fell()) {
        digitalWrite(ledPinA, HIGH);
        zustand = oneOnFirst;
        startTime = topLoop;
      }
      break;
    case oneOnFirst:
      if (topLoop - startTime >= period1) {
        digitalWrite(ledPinA, LOW);
        zustand = pauseFirst;
        startTime = topLoop;
      }
      break;
    case pauseFirst:
      if (topLoop - startTime >= period2) {
        digitalWrite(ledPinB, HIGH);
        zustand = twoOnFirst;
        startTime = topLoop;
      }
      break;
    case twoOnFirst:
      if (topLoop - startTime >= period3) {
        digitalWrite(ledPinB, LOW);
        zustand = longPause;
        startTime = topLoop;
      }
      break;
    case longPause:
      if (key.update() && key.fell()) {
        digitalWrite(ledPinA, HIGH);
        zustand = oneOnFirst;
        startTime = topLoop;
      }
      if (topLoop - startTime >= period4) {
        enable.update();
        if (!enable.read()) {
          digitalWrite(ledPinA, HIGH);
          zustand = oneOnLast;
          startTime = topLoop;
        } else {
          zustand = idle;
        }
      }
      break;
    case oneOnLast:
      if (topLoop - startTime >= period1) {
        digitalWrite(ledPinA, LOW);
        zustand = pauseLast;
        startTime = topLoop;
      }
      break;
    case pauseLast:
      if (topLoop - startTime >= period2) {
        digitalWrite(ledPinB, HIGH);
        zustand = twoOnLast;
        startTime = topLoop;
      }
      break;
    case twoOnLast:
      if (topLoop - startTime >= period3) {
        digitalWrite(ledPinB, LOW);
        zustand = idle;
      }
      break;
  }
}

Danke werde es hier die Woche testen.

Schönes Wochenende

const unsigned long period4 = 12 * 60 * 1000UL;//12 Minuten

ich vermute mal das sollte

const unsigned long period4 = 12 * 60 * 60 * 1000UL;// 12Stunden

so aussehen

Genau. :wink:

Hab es mal getestet.

Die Funktion period4 müsste eine delay Funktion sein, die sich immer nach dem betätigen des Tasters neustartet.

Ich hatte es mit einer versucht, hat aber leider nicht mal geblinkt :((

Schrotty:
Hab es mal getestet.

Ich auch (mit anderen Pins und kürzeren Zeiten), funktioniert wie spezifiziert.

Schrotty:
Die Funktion period4 müsste eine delay Funktion sein, die sich immer nach dem betätigen des Tasters neustartet.

Mein Kode hat keine Funktion period4.

Schrotty:
Ich hatte es mit einer versucht, hat aber leider nicht mal geblinkt :((

Ich habe es schon mit mehreren versucht aber gehört das hier zum Thema?

Sorry hab mich falsch ausgedrückt.

die 12 Stunden Funktion muss sich immer wiederholen und nur durch das betätigen des Tasters neugestartet werden.

Mein Fehler

Offensichtlich kann ich nicht verstehen was du versuchst auszudrücken, bzw. das ist widersprücklich.

Nach der langen Pause neu starten oder Teil zwei ausführen?

Aber du hast ja eine Kode den du wirklich einfach auf deine Wünsche anpassen kannst,
wenn dir denn klar geworden bist, was du wirklich willst.

Wie kann man den zweiten Teil in einer Dauerschleife laufen lassen.

const unsigned long period4 = 12 * 60 * 60 * 1000

Da du nicht sagst was du damit meinst, keine Ahnung.

Mach doch einen Ablaufplan, was wann passieren soll, für alle Zustände und Übergänge bitte.

Ich benötige die Steuerung für Duschen.

Hier muss nach der letzten Betätigung immer alle 12 Stunden Wasser laufen. Legionellenschutz.

Es sei den, es war jemand duschen, dann startet die Zeit einfach von vorne.

Es ist einfacher wenn man die Hintergründe kennt.

Das Video eines Herstellers von Gewerbeduschen.

Die Timer müssen nicht geändert werden. Alle 12 Stunden und 30 Sec Duschen ( Spülen )

Immerhin ein Anfang, da kommst du mit viel weniger Zuständen hin.

In welchem Zustand soll das Gerät starten?

Was hält dich davon ab meinen Vorschlag zu ändern?

Das Gerät kann mit einmal drücken starten.

Im Bezug auf deine letzte Frage: die Ahnung und das Können!