Einstiegshilfe bei Relaissteuerung gesucht

Liebe Gemeinde, ich bin neu hier und wünsche allen erstmal schöne Weihnachten.

Ich möchte folgendes Projekt realisieren und finde nicht den passenden Einstieg:
Es sollen 8 LED-Leuchten(Deckenlampen) nacheinander in einem zeitlichen Versatz von einer halben Sekunde eingeschalten werden durch einen Schalter oder Taster.
Gleiches soll bei erneutem Tasten/Schalten in umgekehrter Reihenfolge wieder ausschalten.
Also Licht ein: - Lampe 1, 2, 3 usw. ein - Licht aus: Lampe 8, 7, 6 usw. aus.
Zur Verfügung habe ich als Einstieg einen Arduino UNO und ein 8- Kanal-SSR-Relais-Baugruppe mit Low-Level-Input.
Leider konnte ich noch keinen auch nur ansatzweise passenden Sketch finden und ich bin noch extremer Programmieranfänger, der elektrische/elektronische Teil ist kein Problem.
Hat hier jemand eine Idee zur Umsetzung des Programmes oder kennt ein passendes Beispielprojekt?
Würde mich riesig über Antworten freuen.
Wünsche weiterhin frohe Festtage.

Also Lampen für 230 Volt AC ?

Genau, daher auch die Solid-State-Relais.

Ok, das konnte ich nicht daraus entnehmen.
Was der Sketch betrifft, vermute ich, da musst du selbst etwas programmieren.
Mir ist da nichts passendes bekannt.

OK, dann muss ich mich mehr mit der Programmierung beschäftigen, als Anfänger nicht so leicht. Danke dennoch für´s darüber nachdenken.

Mein Tipp:
Übe mit den in der IDE vorhandenen Beispielen und zeige uns dein Ergebnis mit Infos was geht und was geht nicht. Dann können wir mit weiteren Infos und Tipps helfen.

So werde ich es machen.

Die meisten SSR funktionieren nur mit Wechselspannung.

Ich bevorzuge Baulösungen mit Kleinspannung (12V oder 24V) wenn dies eine Alternative zu 230VAC gibt.

Die wenigsten Platinen mit SSR sind wirklich für 230VAC geeignet. Es sind weder Sicherabstände noch Leiterbahnenquerschnitten geeignet um fur 230V AC sicher zu sein.

Welche Relaiskarte hast Du? Einfach link auf Angebot.
Bei 12 oder 24VDC kann man auch MOSFET als Schalter verwenden. Dadurch kann man die LED-Streifen über PWM auch dimmen oder faden.
Platine zB

Da mußt Du aber auf die Polarität achten.
Grüße Uwe

Die technische Umsetzung der 230V AC-Seite ist kein Hit. Als Relais-BG habe ich diese ausgesucht: 8 Kanal Solid State Relais 5V DC kompatibel mit Arduino und Raspberry

Das ist aber auch erstmal egal. Im Prinzip benötige ich nur folgende Steuerung am Arduino:
ich betätige einen Taster (oder Schalter) , um an einem Eingang des UNO einen Programmstart (Low/High) zu initiieren.
Diese soll nun an den Ausgängen (z.Bsp. 2 bis 9) den Ausgang von High auf Low schalten, der Reihe nach im Abstand von 0,5 Sekunden. Dann bleibt der Zustand erhalten bis am Eingang (Taster) der nächste Befehl Low/High kommt und die Ausgänge 9 bis 2 schalten der Reihe nach wieder von Low auf High. Fertig. Die Relais-BG spielt da erstmal keine Rolle, es könnten ja auch LEDs sein, welche an und wieder ausschalten.
Ich dachte die Umsetzung wäre leichter und gab es vielleicht schon. Ist aber nicht.

Leichter, als was?

Natürlich ist das leicht!
Schalter auswerten (die erste Zustandsmaschine)
Alle Relais(ihre Ansteuerungspins) in ein Array stopfen, und bei Bedarf darüber iterieren (die zweite Zustandsmaschine).

nicht dass der Sketch besonders schön ist aber das gabs vor wenigen Stunden:

aber geht mit einem Array mit 8 pins natürlich besser.

Fang mit was einfachen an, damit mal zwei, drei Leds das machen was du willst.

Danke, ich werde es mir ansehen und Versuche unternehmen.


const uint8_t inpputPin {2};            // a switch connected to GND  - LOW active
const uint8_t output[] {5, 6, 7, 8};    // output pins
const uint8_t noOfOutput = sizeof(output) / sizeof(output[0]);  // let the compiler calculate the size of the array
const uint16_t wait = 500;              // wait time between each output activation

void on() {
  Serial.println("change to on");
  for (size_t i = 0; i < noOfOutput; i++) {
    digitalWrite(output[i], HIGH);
    Serial.println(output[i]);
    delay(wait);
  }
}

void off() {
  Serial.println("change to off");
  for (size_t i = 0; i < noOfOutput; i++) {
    digitalWrite(output[noOfOutput - i - 1], LOW);
    Serial.println(output[noOfOutput - i - 1]);
    delay(wait);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(inpputPin, INPUT_PULLUP);
  for (size_t i = 0; i < noOfOutput; i++) {
    pinMode(output[i], OUTPUT);
  }
}

void loop() {
  static int previousVal = 0;          // previous value (from last loop iteration)
  int val = digitalRead(inpputPin);    // current state of input pin
  if (val != previousVal) {            // when something has changed
    if (val == LOW)
      on();
    else
      off();
  }
  previousVal = val;
  delay(100); // dirty delay
}
//

Ok, danke, ich teste es.

Ja super, läuft. So hab ich es mir gewünscht.
Nun muss ich das nur noch auf 8 Ausgänge erweitern und auf Dauerbetrieb testen.
Vielen vielen Dank.

Hallo servicefuchs

Hier ist ein Beispiel mit einem Vorwärts- und einem Rückwärtsgang zum Umschalten der Lampen.

//https://europe1.discourse-cdn.com/arduino/original/4X/7/e/0/7e0ee1e51f1df32e30893550c85f0dd33244fb0e.jpeg
#define ProjectName "Einstiegshilfe bei Relaissteuerung gesucht"
#define NotesOnRelease "Arduino MEGA tested"
// make names
enum TimerEvent {NotExpired, Expired};
enum TimerControl {Halt, Run};
// make variables
uint32_t currentMillis = millis();
constexpr uint32_t StepTime {1000};
constexpr uint8_t LedPins[] {9, 10, 11};
constexpr int16_t CntOfLed {sizeof(LedPins) - 1};
constexpr uint8_t ButtonPin {A0};
// make structures
//-----------------------------------------
struct TIMER
{
  uint32_t interval;
  uint8_t control;
  uint32_t now;
  uint8_t expired(uint32_t currentMillis)
  {
    uint8_t timerEvent = currentMillis - now >= interval and control;
    if (timerEvent == Expired) now = currentMillis;
    return timerEvent;
  }
};
struct UPDOWN
{
  uint8_t buttonPin;
  uint16_t  stateOld;
  uint16_t  upDown;
  int16_t  upDownCounter;
  TIMER upDownTimer;
  TIMER debounce;
  void  run(uint32_t currentMillis)
  {
    if (debounce.expired(currentMillis) == Expired)
    {
      uint16_t stateNew = digitalRead(buttonPin) ? LOW : HIGH;
      if (stateOld != stateNew)
      {
        stateOld = stateNew;
        if (stateNew == HIGH)
        {
          upDown = upDown ? LOW : HIGH;
          upDownTimer.control = Run;
          upDownTimer.now = currentMillis;
          Serial.print(" start "), Serial.println(upDown ? "down" : "up");
        }
      }
    }
    if (upDownTimer.expired(currentMillis) == Expired)
    {
     
      digitalWrite(LedPins[upDownCounter], upDown);
      Serial.print("led "), Serial.print(upDownCounter), Serial.println(upDown ? " ON" : " OFF");
      upDown == HIGH ? upDownCounter++ : upDownCounter--;
      if (upDownCounter < (CntOfLed-CntOfLed))
      {
        upDownCounter = (CntOfLed-CntOfLed);
        upDownTimer.control = Halt;
        Serial.println(" up halt\n");
      }
      if (upDownCounter > CntOfLed)
      {
        upDownCounter = CntOfLed;
        upDownTimer.control = Halt;
        Serial.println(" down halt\n");
      }
    }
  }
} ledControl {ButtonPin, 0, 0, 0, StepTime, Halt, 0, 20, Run, 0};
// make support
void heartBeat(const uint8_t LedPin, uint32_t currentMillis)
{
  static bool setUp = false;
  if (setUp == false) pinMode (LedPin, OUTPUT), setUp = true;
  digitalWrite(LedPin, (currentMillis / 500) % 2);
}
// make application
void setup()
{
  Serial.begin(115200);
  for (uint8_t n = 0; n < 32; n++) Serial.println("");
  Serial.print("Source: "), Serial.println(__FILE__);
  Serial.print(ProjectName), Serial.print(" - "), Serial.println(NotesOnRelease);
  pinMode (ButtonPin, INPUT_PULLUP);
  for (auto LedPin : LedPins) pinMode(LedPin, OUTPUT);
  delay(2000);
  Serial.println(" =-> and off we go\n");
}
void loop()
{
  currentMillis = millis();
  heartBeat(LED_BUILTIN, currentMillis);
  ledControl.run(currentMillis);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.