Relais ansteuern über verschiedene Pins und ohne delay

Hallo ich brauch Hilfe beim programmieren von einem sketch.

Ich möchte über einen DigiSpark ein Relais mit mehreren pins ansteuern(auf jedem Pin soll eine andere Zeitspanne sein z.B.auf Pin2 15sec an 15min aus;auf Pin3 1min an 15min aus usw.), darf aber kein delay benutzen sonst bleibt es stecken.
Könnt ihr mir vielleicht helfen? :slight_smile:

Mit freundlichen Grüßen :stuck_out_tongue:
J.007

Johnny00702:
Ich möchte über einen DigiSpark ein Relais mit mehreren pins ansteuern(auf jedem Pin soll eine andere Zeitspanne sein z.B.auf Pin2 15sec an 15min aus;auf Pin3 1min an 15min aus usw.), darf aber kein delay benutzen sonst bleibt es stecken.
Könnt ihr mir vielleicht helfen? :slight_smile:

Dann schau dir BlinkWithoutDelay in der IDE an, damit kannst du das lösen.

Das mit den mehreren Pins verstehe ich nicht. Willst Du ein Relais mit mehreren Pins ansteuern (warum?) oder über mehrere Pins als Eingang verschiedene Zeiten für das Relais ansteuern?

Gruß Tommy

Hallo Tommy

Ich meine das auf jedem Pin ein bestimmter Wert ist sodas man nur das Kabel auf den Pin setzt den man gerade braucht.

Freundliche Grüße J.007

Du kannst doch auch das Relais fest an einen Pin schalten (über Transistor) und im Programm die verschiedenen Zeiten einstellen. z.B. über einzelne Taster oder vom PC über die Serielle (USB) Schnittstelle.

Umstecken ist immer die fehlerträchtigste Lösung(Kontaktprobleme).

Gruß Tommy

Und dafür gibt es die Controller.
Hardwareschaltungen flexibel per Software aufbauen.

Danke für die Tips,aber ich wollt es eher so machen das auf jeden pin ein Relais liegt und jedes Relais mit unterschiedlichen festgelegten Intervallen schaltet.

Mit freundlichen Grüßen J.007

Vorhin hast Du aber geschrieben, dass Du umstecken willst. Da sind wir natürlich von einem Relay ausgegangen.
Musst Du ein Relaislager entsorgen? :wink:

Gruß Tommy

Johnny00702:
Danke für die Tips,aber ich wollt es eher so machen das auf jeden pin ein Relais liegt und jedes Relais mit unterschiedlichen festgelegten Intervallen schaltet.

Mit freundlichen Grüßen J.007

Ok, wenn wir helfen sollen, müssen wir den bisherigen Sketch sehen.
Poste den bitte in Code-Tags.

Sry ich hab mich falsch ausgedrückt...
Ich hab den sketch von dem Programm "Blink without delay".Leider ist die Ausschaltzeit = Einschaltzeit.
Was muss ich ändern wenn ich eine unterschiedliche Intervallzeit festlegen möchte.

Gruß J.007

Nimm getrennte Variablen und eine Zustandsvariable, ob es an oder aus ist.
Pseudocode:

uint32_t anMillis, ausMillis, anLaenge = 1000, ausLaenge = 3000;
boolean isAn = false;
...
loop() {
  uint32_t  aktmillis = millis();
  if (!isAn && aktmillis - ausMillis >= ausLaenge) {
    anschalten
    isAn = true;
    anMillis = aktMillis;
  }
  if (isAn && aktMillis - anMillis >= anLaenge) {
    ausschalten
    isAn = false;
    ausMillis = aktMillis;
  }
}

Ungetestet, ioch hoffem ich habe auf die Schnelle keinen Murks geschrieben.

Gruß Tommy

vielen dank ich werd den code morgen ausprobieren.

Grüße J.007

Johnny00702:
Hallo ich brauch Hilfe beim programmieren von einem sketch.

Ich möchte über einen DigiSpark ein Relais mit mehreren pins ansteuern(auf jedem Pin soll eine andere Zeitspanne sein z.B.auf Pin2 15sec an 15min aus;auf Pin3 1min an 15min aus usw.), darf aber kein delay benutzen sonst bleibt es stecken.
Könnt ihr mir vielleicht helfen? :slight_smile:

Mit freundlichen Grüßen :stuck_out_tongue:
J.007

In diesem Thread hatte ich mal Code für einen asymmetrisch blinkenden Blinker gepostet, mit unterschiedlichen Dauern für AN und AUS:
https://forum.arduino.cc/index.php?topic=339467.0

Für Deinen Relais-Sketch würde dabei eigentlich nur fehlen, die Datenstruktur so zu erweitern, dass die Einschaltdauer und die Periodendauer in long statt uint16_t angegeben werden, und dass es ein Array an Daten gibt, das in einer for-Schleife abgearbeitet wird.

Und es fehlt die Angabe, ob Deine Relais "active LOW " schalten, also ob das Relais bei LOW ein- und bei HIGH ausgeschaltet ist, oder ob die Relais "active HIGH" schaltet, also genau umgekehrt (HIGH schaltet ein und LOW schaltet aus). Vielleicht kannst Du das ja nochmal mitteilen.

Vielen dank jurs,das Programm hat sehr geholfen aber ich komm immer noch nicht ganz damit zurecht.
Ich arbeite mit Arduino erst seit ein paar Wochen...
Deswegen verstehe ich das noch nicht sehr gut.
Kannst du mir erklären was ich verändern muss?

Gruß J.007

Wenn dir Jurs' Lösung zu kompliziert ist, verstehst du denn Tommys Lösung?
Falls ja, kannst du die auf zwei Pins erweitern?

Ich hätte übrigens den BlinkWithoutDelay-Ansatz so abgeändert, dass jeder Zyklus die Ein- und Aus-Phase zusammen enthält. Finde ich einfacher. ( "Aus" ist dann der Rest des Zyklus nach "Ein" )

const unsigned long PERIODE1 = 5000;
const unsigned long EIN1 = 2000;  // 2 sec an, 3 sec aus

void setup() {
  pinmode(1, OUTPUT);
}

void loop() {
  zyklus1();
}

void zyklus1() {
   static unsigned long start;  // static: jeder zyklus hat seine eigene Variable, auch wenn alle gleich heissen 
   if (millis() - start >= PERIODE1) start = millis();
   if (millis() - start < EIN1) digitalWrite(1, HIGH);
   else digitalWrite(1, LOW); 
}

Kleiner Tip: Alles mit 1 verdoppeln, und aus der 1 eine 2 machen, fertig :wink:
Kann man dann noch optimieren, aber das wäre dann ja jurs' Lösung