ESP32 mit 8 Relais (nur Bericht, keine Frage)

Von dieser Sorte Relais wird immer wieder fälschlicherweise angenommen, daß sie für Netzspannung geeignet sind.
Tatsache ist, daß die Kontakte dafür ausgelegt sind, das ist aber auch schon alles. Das Gehäuse ist nicht für Netzspannung ausgelegt. Selbst mit Isolationsfräsen rund um den Com-Kontakt herum sind sie das nicht, denn es kann niemand garantieren, daß die Abstände zwischen Spulenanschlüssen und dem Mittelkontakt innen (also im Gehäuse) auch die erforderlichen Abstände einhalten.

Ich wollte das früher (TM) auch nicht glauben und habe es einfach mal getestet. Nach nicht mal 10 Minuten bei 500VDC (mit dem Isolationstester) zwischen Spule und Mittelkontakt sind die Dinger durchgeschlagen. 500VDC ist nicht mal die doppelte Spannung, die bei 230VAC gegen Erde auftritt. Da möchte ich meine Gesundheit oder die Anderer, nicht dran hängen, ganz zu schweigen von den rechtlichen Folgen, wenn was passiert.
(ordentliche Finder Relais 40.52 halten eine Stunde bei 1000VDC locker durch)

Das verhält sich genauso, wie bei MOSFETs: nur, weil der Chip mit 250A angegeben ist, heißt das noch lange nicht, daß das Package das auch mit macht. Nur, daß es bei MOSFETs im Datenblatt steht, bei den Billigrelais steht das nicht drinne, wenn man denn überhaupt ein Datenblatt dafür findet.

Habe mir auf der Platine mühsam die Relaispins rausgesucht und dann gesehen, dass noiasca das ja hier oben schon gezeigt hat. :pleading_face: :stuck_out_tongue_winking_eye:

Franz

ach, dann hast du sie jetzt kontrolliert - passt doch auch. Ich weis jetzt auch, dass ich den Text meiner Muster - Konfiguration anpassen muss.
:wink:

Ich habe heute den USB-Port bekommen. Und natürlich gleich probiert ob ich Müll gekauft habe. Aber alles gut.

Ich habe auch noch das Programm hier gemacht, um nach Benutzung des Boards auch schnelle wieder eine Testsoftware aufspielen zu können, so wie sie serielnmässig auch drauf ist. Die Arbeitet wieder so wie die Orginale Software im Lieferzustand. Ist vielleicht nicht schlecht, wenn man schnell mal die wichtigen Funktionen, der 8 Relais und der Board-LED testen will.

/*
 * Zum Laden des Programmes, bei Connecting... EN-Taste drücken und halten, GIO Taste drücken und halten,
 * dann EN-Taste loslassen, dann die GIO-Taste loslassen. Dann, wenn der Ladenvorgang abgeschlossen ist, 
 * die EN-Taste nochmal zum Programm Starten drücken.
 */

byte zaehler = 9;
byte i = 0;
int RelaisEin[10] = {32, 33, 25, 26, 27, 14, 12, 13, 23};
int RelaisAus[10] = {13, 12, 14, 27, 26, 25, 33, 32, 23};
void setup()
{
  pinMode(32, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(25, OUTPUT);
  pinMode(26, OUTPUT);
  pinMode(27, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(23, OUTPUT);
}

void loop() {
  //for Schleife zum Relais Steuern 1-9
  for (i = 0; i < zaehler; i++)
  {
    digitalWrite(RelaisEin[i], HIGH);
    delay(100);
  }
  //for Schleife zum Relais Steuern 9-1
  for (i = 0; i < zaehler; i++)
  {
    digitalWrite(RelaisAus[i], LOW);
    delay(100);
  }
}

nette Ide, aber pack deine Pinmodes noch in ein For

Auja, da hast du recht. :roll_eyes:

/*
 * Zum Laden des Programmes, bei Connecting... EN-Taste drücken und halten, GIO Taste drücken und halten,
 * dann EN-Taste loslassen, dann die GIO-Taste loslassen. Dann, wenn der Ladenvorgang abgeschlossen ist, 
 * die EN-Taste nochmal zum Programm Starten drücken.
 */

byte zaehler = 9;
byte i = 0;
int RelaisEin[10] = {32, 33, 25, 26, 27, 14, 12, 13, 23};
int RelaisAus[10] = {13, 12, 14, 27, 26, 25, 33, 32, 23};
void setup()
{
   for (i = 0; i < zaehler; i++)
{
   pinMode(RelaisEin[i], OUTPUT);
}
}

void loop() {
  //for Schleife zum Relais Steuern 1-9
  for (i = 0; i < zaehler; i++)
  {
    digitalWrite(RelaisEin[i], HIGH);
    delay(100);
  }
  //for Schleife zum Relais Steuern 9-1
  for (i = 0; i < zaehler; i++)
  {
    digitalWrite(RelaisAus[i], LOW);
    delay(100);
  }
}

ich würde es runterkürzen auf ein Array.

/*
 * Zum Laden des Programmes, bei Connecting... EN-Taste drücken und halten, GIO Taste drücken und halten,
 * dann EN-Taste loslassen, dann die GIO-Taste loslassen. Dann, wenn der Ladenvorgang abgeschlossen ist, 
 * die EN-Taste nochmal zum Programm Starten drücken.
 */

constexpr byte ausgang[] = {13, 12, 14, 27, 26, 25, 33, 32, 23};
constexpr size_t zaehler = sizeof(ausgang)/sizeof(ausgang[0]);

void setup()
{
   for (size_t i = 0; i < zaehler; i++)
    pinMode(ausgang[i], OUTPUT);
}

void loop() {
  //for Schleife zum Relais Steuern 1-9
  for (size_t i = 0; i < zaehler; i++)
  {
    digitalWrite(ausgang[i], HIGH);
    delay(100);
  }
  //for Schleife zum Relais Steuern 9-1
  for (int i = zaehler - 1; i >= 0; i--)
  {
    digitalWrite(ausgang[i], LOW);
    delay(100);
  }
}

Das wollte ich gestern Abend auch noch schnell machen. Aber bin gescheitert. Ich glaube es war dieses Zähler - 1. Auf die Idee bin ich nicht gekommen. Ich dachte Zähler = 0 muss reichen, dass ich beim runterzählen den untersten Wert im Array richtig auslese. Ich bekam aber immer den Wert "0". So wurde das nix :roll_eyes:

gefällt mir eh nicht besonders.
Aber auch nicht schöner, naja zumindest kann man wieder einen unsigned datentyp nehmen...

  //for Schleife zum Relais Steuern 9-1
  for (size_t i = zaehler; i > 0; i--)
  {
    digitalWrite(ausgang[i-1], LOW);
    delay(100);
  }

Aber das mit der LED auf 23 Funktioniert nicht mehr korrekt. Die geht normal an wenn die 8 Relais an sind, und geht erst wieder aus, wenn alle 8 Ralais aus sind.
Also 8 Reilais ein -> LED ein, dann alle auch Relais wieder aus, -> LED aus. Das war auf ein Grund für das zweite Array.

ah, ok ... das hab ich übersehen.
Na dann halt nicht Teil des Arrays ...

/*
 * Zum Laden des Programmes, bei Connecting... EN-Taste drücken und halten, GIO Taste drücken und halten,
 * dann EN-Taste loslassen, dann die GIO-Taste loslassen. Dann, wenn der Ladenvorgang abgeschlossen ist, 
 * die EN-Taste nochmal zum Programm Starten drücken.
 */

constexpr uint8_t ausgang[] = {13, 12, 14, 27, 26, 25, 33, 32};
constexpr uint8_t led {23};
constexpr size_t zaehler = sizeof(ausgang)/sizeof(ausgang[0]);
constexpr uint16_t interval {100};

void setup()
{
   for (size_t i = 0; i < zaehler; i++)
    pinMode(ausgang[i], OUTPUT);
  pinMode(led, OUTPUT); 
  Serial.begin(115200);
}

void loop() {
  //for Schleife zum Relais Steuern
  for (size_t i = 0; i < zaehler; i++)
  {
    digitalWrite(ausgang[i], HIGH);
    delay(interval);
  }
  digitalWrite(led, HIGH);
  delay(interval);

  //for Schleife zum Relais Steuern
  for (int i = zaehler - 1; i >= 0; i--)
  {
    Serial.println(ausgang[i]); 
    digitalWrite(ausgang[i], LOW);
    delay(interval);
  }
  //for Schleife zum Relais Steuern
  //for (size_t i = zaehler; i > 0; i--)
  //{
  //  Serial.println(ausgang[i-1]); 
  //  digitalWrite(ausgang[i-1], LOW);
  //  delay(interval);
  // }
  digitalWrite(led, LOW);
  delay(interval);
}

einverstanden?

Ohne Vorwiderstände halt:

Ja, genau. Die LED aus dem Array raus, das habe ich dann auch gemacht.

Danke :slightly_smiling_face: :+1:

Dein Programm braucht kompiliert auch eine ganze Ecke weniger Speicherplatz. Obwohl es im Quelltext länger ist. :roll_eyes:

Franz