ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
Ich habe mir mal ein Board besorgt, mit dem man rel. schnell was zum Schalten und Steuern aufbauen kann. Das Board hat einen ESP32 als CPU und hat schon 8 Relais on Board. Man kann es mit 5 Volt versorgen, dann ist es bereit. Was ich erst bemerkt haben, als ich es hier liegen hatte, Es gibt keine USB Schmittstelle um die Programmierung draufzuladen. Das mußte ich mir daher erst mal noch bestellen. Müßte in den kommen zwei Tagen bei mir aufschlagen.
Hier ist mal ein Bild von dem Board. Mit der Port-Beschaltung der Relais und der Board-LED: .
Weiter gehts, wenn die USB Schnittstelle bei mir gelandet ist. Hier ist schon mal ein Bild von dem Ding.
.
Hier ist mal ein Bild von dem Board. Mit der Port-Beschaltung der Relais und der Board-LED: .
Weiter gehts, wenn die USB Schnittstelle bei mir gelandet ist. Hier ist schon mal ein Bild von dem Ding.
.
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
So die USB - Ports sind da, und funktionieren. Alles gut, schon mit einem Programm getestet. RX / TX wie meistens üblich überkreuz anschließen!! Ich verwende zum Programmieren wie immer ein USB Kabel, das den Plus 5V unterbrochen hat. Dadurch kann ich auch, wie hir am Bild zu sehen, wenn ein Arduino direkt 5Volt versorgt ist, mein spezielles USB Kabel anschließen. Wenn man ein normales USB Kabel verwendet, muss man vor dem Anstecken des USB Kabels, die 5 Volt Versorgung zu dem Board abklemmen!!
Ich habe jetzt auch noch versucht, die plus 5Volt-Verbindung zwischen dem USB-Adapter und ESP32 Relais-Board weg zu lassen und dann den Plus 5 Volt im USB Kabel durchzulassen, sowie auch die 5Volt am Relaisboard dran zu lassen. Aber da geht trotzdem nichts. Da fehlen trotzdem die 5Volt am USB-Port.
Also, entweder die 5 Volt vom Netzteil zum RelaisBoard weg lassen, oder ein USB Kabel mit druchtrennten Plus 5 Volt (meistens der rote Draht) verwenden. Die zweite Lösung ist die meine, bei mir gehen nur zwei USB Kabel mit durchtrennten Plus zum elektronik Platz. Dadurch ist gar kein Vertun möglich und einen speziellen USB HUB bei dem der Plus auf jeder Buchse zuschaltbar ist.
.
Ich habe jetzt auch noch versucht, die plus 5Volt-Verbindung zwischen dem USB-Adapter und ESP32 Relais-Board weg zu lassen und dann den Plus 5 Volt im USB Kabel durchzulassen, sowie auch die 5Volt am Relaisboard dran zu lassen. Aber da geht trotzdem nichts. Da fehlen trotzdem die 5Volt am USB-Port.
Also, entweder die 5 Volt vom Netzteil zum RelaisBoard weg lassen, oder ein USB Kabel mit druchtrennten Plus 5 Volt (meistens der rote Draht) verwenden. Die zweite Lösung ist die meine, bei mir gehen nur zwei USB Kabel mit durchtrennten Plus zum elektronik Platz. Dadurch ist gar kein Vertun möglich und einen speziellen USB HUB bei dem der Plus auf jeder Buchse zuschaltbar ist.
![Clown :(o):](./images/smilies/smiley-0081.gif)
![Clown :(o):](./images/smilies/smiley-0081.gif)
.
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
Dieses Programm hier ist auf dem Board wohl im Lieferzustand drauf. Oder jedenfalls die für Anfänger einfach übersichtlichere Methode. Damit kann man kurz testen, ob die 8 Relais und die Board LED funktionieren. Alle 8 Relais werden im Abstand von 100ms eingeschalten, dann die Board LED auch ein. danach werden die 8 Relais wieder im 100ms Abstand abgeschalten und zum Schluss auch die Board LED wieder aus. Das läuft im Endlos Betrieb.
Franz
Hier ist ein Programm, das genau das selbe macht, aber der Programm Aufwand deutlich kleiner ist.
.
Ich frage mich jetzt, welches der beiden Programme hier unten besser ist. Im Untersten Programm gibt es nur ein Array zur Ausgabe der Relais-Pin´s. Aber ich kann die LED-Pin nicht mit rein nehmen, weil die zu unterschiedlichen Zeiten geschalten wird. Es werden immer erst die 8 Relais im 100ms Tackt eingeschalten, dann die Board-LED ein, dann die 8 Relais wieder im 100ms Tackt aus, dann als letztes die Board-LED aus. Das ganze 2x weil es ja eine vor Schleife für alles einschalten, und eine vor Schleife für alles aus gibt. Dazu kommt noch im Setup die extra pinMode Zeile für die LED
Das konnte ich mit einem Array nicht bewerkstelligen. Da muss der LED-Pin nicht aus dem Array über die for-Schleife ausgegeben werden, sondern erst die 8 Relais über die for-Schleife und dann der LED-Pin extra. Das ist das untere Programm.
Wenn ich zwei Array´s mache, dann kann ich die Reihenfolge der Relais-Pin´s entsprechend für Rauf und Runter verändern und auch gleich die LED-Pin mit dazu nehmen. Somit spare ich mir die extra Steuerung der LED-Pin, und die pinMode Zeile für die LED. Das spart 5 Zeilen im Programm, dafür aber eine Zeile mehr in der Deklaration, für das zweite Array.
Franz
Code: Alles auswählen
#define Relais1 32
#define Relais2 33
#define Relais3 25
#define Relais4 26
#define Relais5 27
#define Relais6 14
#define Relais7 12
#define Relais8 13
#define LED1 23
void setup()
{
pinMode(Relais1, OUTPUT);
pinMode(Relais2, OUTPUT);
pinMode(Relais3, OUTPUT);
pinMode(Relais4, OUTPUT);
pinMode(Relais5, OUTPUT);
pinMode(Relais6, OUTPUT);
pinMode(Relais7, OUTPUT);
pinMode(Relais8, OUTPUT);
pinMode(LED1, OUTPUT);
}
void loop() {
digitalWrite(Relais1, HIGH);
delay(100);
digitalWrite(Relais2, HIGH);
delay(100);
digitalWrite(Relais3, HIGH);
delay(100);
digitalWrite(Relais4, HIGH);
delay(100);
digitalWrite(Relais5, HIGH);
delay(100);
digitalWrite(Relais6, HIGH);
delay(100);
digitalWrite(Relais7, HIGH);
delay(100);
digitalWrite(Relais8, HIGH);
delay(100);
digitalWrite(LED1, HIGH);
delay(100);
digitalWrite(Relais1, LOW);
delay(100);
digitalWrite(Relais2, LOW);
delay(100);
digitalWrite(Relais3, LOW);
delay(100);
digitalWrite(Relais4, LOW);
delay(100);
digitalWrite(Relais5, LOW);
delay(100);
digitalWrite(Relais6, LOW);
delay(100);
digitalWrite(Relais7, LOW);
delay(100);
digitalWrite(Relais8, LOW);
delay(100);
digitalWrite(LED1, LOW);
delay(100);
}
.
Code: Alles auswählen
/*
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-8 + LED
for (i = 0; i < zaehler; i++)
{
digitalWrite(RelaisEin[i], HIGH);
delay(100);
}
//for Schleife zum Relais Steuern 8-1 + LED
for (i = 0; i < zaehler; i++)
{
digitalWrite(RelaisAus[i], LOW);
delay(100);
}
}
Das konnte ich mit einem Array nicht bewerkstelligen. Da muss der LED-Pin nicht aus dem Array über die for-Schleife ausgegeben werden, sondern erst die 8 Relais über die for-Schleife und dann der LED-Pin extra. Das ist das untere Programm.
Wenn ich zwei Array´s mache, dann kann ich die Reihenfolge der Relais-Pin´s entsprechend für Rauf und Runter verändern und auch gleich die LED-Pin mit dazu nehmen. Somit spare ich mir die extra Steuerung der LED-Pin, und die pinMode Zeile für die LED. Das spart 5 Zeilen im Programm, dafür aber eine Zeile mehr in der Deklaration, für das zweite Array.
![Überrascht :eek:](./images/smilies/icon_e_surprised.gif)
Code: Alles auswählen
/*
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};
byte zaehler = 8;
int i = 0;
void setup()
{
Serial.begin(9600);
for (i = 0; i < zaehler; i++)
{
pinMode(ausgang[i], OUTPUT);
}
pinMode(23, OUTPUT);
}
void loop() {
//for Schleife zum Relais Steuern 1-8
for (i = 0; i < zaehler; i++)
{
digitalWrite(ausgang[i], HIGH);
delay(100);
}
digitalWrite(23, HIGH);
delay(100);
//for Schleife zum Relais Steuern 8-1
for (i = zaehler; i > 0; i--)
{
digitalWrite(ausgang[i - 1], LOW);
delay(100);
}
digitalWrite(23, LOW);
delay(100);
}
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
OK, aber jetzt habe ich noch eine Kleinigkeit entdeckt. Das Programm mit einem Array braucht zwar 5 Zeilen mehr, aber das Kompilierte Programm von Werner Rothschopf aus dem ArduinoCC, Forum hat trotzdem deutlich weniger Speicherverbrauch. Da muss ich schon noch deutlich nachschauen, warum das so ist. Wenn ich es leichter verständlich geändert habe, ist es mit der Speicherersparnis vorbei.
Hier ist übrigens seine Seite. Immer gut zum Schlüffeln
![ueberrascht :O:](./images/smilies/ueberrascht.gif)
![alles gut :(oo):](./images/smilies/smiley-0131.gif)
Code: Alles auswählen
/*
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.
https://forum.arduino.cc/t/esp32-mit-8-relais-nur-bericht-keine-frage/1018273/33
*/
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);
}
void loop() {
//for Schleife zum Relais Steuern 1-8
for (size_t i = 0; i < zaehler; i++)
{
digitalWrite(ausgang[i], HIGH);
delay(interval);
}
digitalWrite(led, HIGH);
delay(interval);
//for Schleife zum Relais Steuern 8-1
for (size_t i = zaehler; i > 0; i--)
{
digitalWrite(ausgang[i - 1], LOW);
delay(interval);
}
digitalWrite(led, LOW);
delay(interval);
}
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
Ich habe jetzt mal noch Oben und Unten jeweils 5 Sekunden Messpause eingebaut. Wenn alle Relais angezogen sind und die Board LED an ist, braucht das Board 570mA, alles Relais und die LED aus, sind es 51mA. Wenn der Stromverbrauch eine Rolle spielt.
Franz
Franz
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
Habe mich mal ein wenig gespielt. Habe an das Board ein Oled Display I2C dazu gehängt. Nur zum Testen. Diese kleinen Displays sind rsehr gut, finde ich. Schöne kleine Schrift auf kleinen Raum, aber gestochen scharf.
Hier mal ein Video mit dem Display. Dieses Flimmern sieht man nur, weil das Display eine andere Bildaufbau-Frequenz hat als die Videoaufzeichnung. Das Display ist wie gesagt gestochen scharf und absolut Flimmerfrei!!
Hier ist noch das Programm mit del Eled-Display
Hier mal ein Video mit dem Display. Dieses Flimmern sieht man nur, weil das Display eine andere Bildaufbau-Frequenz hat als die Videoaufzeichnung. Das Display ist wie gesagt gestochen scharf und absolut Flimmerfrei!!
Hier ist noch das Programm mit del Eled-Display
Code: Alles auswählen
/*
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.
https://forum.arduino.cc/t/esp32-mit-8-relais-nur-bericht-keine-frage/1018273/33
*/
// OLED Display einrichten
#include <U8g2lib.h> // als U8g2 im Bibliotheksverwalter zu finden
U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0);
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()
{
oled.begin();
oled.clearBuffer(); // Textspeicher löschen
oled.setFont(u8g2_font_6x12_tr); // Kleine Schrift 6x12
//oled.setFont(u8g2_font_9x15_mf); // Mittelgroß 9x15
//oled.setFont(u8g2_font_10x20_mf); // Groß 10x20
oled.setCursor(12, (1 * 10));
oled.print(F("ESP32_Relaisboard"));
oled.setCursor(28, (2 * 10));
oled.print(F("Mit 8_Relais"));
oled.setCursor(18, (3 * 10));
oled.print(F("PIN.32-33-25-26"));
oled.setCursor(18, (4 * 10));
oled.print(F("PIN.27-14-12-13"));
oled.setCursor(32, (5 * 10));
oled.print(F("LED_PIN. 23"));
oled.setCursor(13, (6 * 10));
oled.print(F("I2C_SCL-22_SDA-21"));
oled.sendBuffer();
for (size_t i = 0; i < zaehler; i++)
{
pinMode(ausgang[i], OUTPUT);
}
pinMode(led, OUTPUT);
}
void loop() {
//for Schleife zum Relais Steuern 1-8
for (size_t i = 0; i < zaehler; i++)
{
digitalWrite(ausgang[i], HIGH);
delay(interval);
}
digitalWrite(led, HIGH);
delay(5000);
//for Schleife zum Relais Steuern 8-1
for (size_t i = zaehler; i > 0; i--)
{
digitalWrite(ausgang[i - 1], LOW);
delay(interval);
}
digitalWrite(led, LOW);
delay(5000);
}
- Admin
- Administrator
- Beiträge: 1199
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32 - Relaisboard mit 8 Relais als Mädchen für alles.
Hier habe ich mal noch die Spannungsmessung auf zwei Kanälen mit dem ACS1115 eingerichtet und die Spannungen kontrolliert. Wenn beide Spannungen über 3,2 Volt sind, ist für jede Spannung ein Relais eingeschalten. Und die Spannungen werden natürlich am OLED - Display angezeigt. Wenn eine der Spannungen unter 3,2 Volt abfällt, dann fällt das entsprechende Relais ab und die Board LED blinkt im 200ms Rytmus. Einfach mal als spielerisches Beispiel für die Anwendung dieses Boards.
Die Testansteuerung der 8 Relais habe ich in dem Beispiel mal rausgeschmissen, weil ich da ja eine konkrete Anforderung an Relais und LED habe.
Ich habe hier mal noch einen Video von dem Gerät. Ist also nur Spielerei. Ich sehe das ja nicht soooo verbissen. Ich mache damit Tests und wenn ich eine dann mal spezielle Anforderung habe, dann wird eben ein brauchbares Gerät daraus.
Und hier habe ich mir noch die Pinbelegung mit der Ansicht auf die Stifte abgeschrieben.
.
Die Testansteuerung der 8 Relais habe ich in dem Beispiel mal rausgeschmissen, weil ich da ja eine konkrete Anforderung an Relais und LED habe.
Code: Alles auswählen
/*
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.
https://forum.arduino.cc/t/esp32-mit-8-relais-nur-bericht-keine-frage/1018273/33
*/
#include <Adafruit_ADS1X15.h> // bindet Wire.h für I2C mit ein
Adafruit_ADS1115 ads;
#define ADS_I2C_ADDR 0x48
// ------------OLED Display einrichten--------------------
#include <U8g2lib.h> // als U8g2 im Bibliotheksverwalter zu finden
U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0);
// ----------ADC_ADS1115 Daten Einrichtung----------------
const float multiplier = 0.125F; // ADS1115-Multiplikator bei einf. Verstärkung
int A_Value; // Messwert per GPIO
int adc0; // Messwert an Kanal 0 des ADS1115
int adc1; // Messwert an Kanal 1 des ADS1115
int adc2; // Messwert an Kanal 2 des ADS1115
int adc3; // Messwert an Kanal 3 des ADS1115
float A_mv, ads_mv0, ads_mv1 ; // Messwert in Millivolt umgerechnet
// ----------Daten für den Relais Testablauf--------------
constexpr uint8_t ausgang[] = {13, 12, 14, 27, 26, 25, 33, 32};
constexpr uint8_t led {23};
byte einaus = 0;
constexpr size_t zaehler = sizeof(ausgang) / sizeof(ausgang[0]);
constexpr uint16_t interval {100};
//-----------------LED Blinken----------------------------
unsigned long Sekundenablauf = 0; // Tastenabfrage von Taster02 300ms aussetzen
const unsigned long Pausezeit = 200;
unsigned long aktuelleMillis = 0;
unsigned long zeitaktuell = 0;
byte meldung0 = 0;
byte meldung1 = 0;
//--------------------------------------------------------
//===========================SETUP=========================================
void setup()
{
ads.begin(ADS_I2C_ADDR, &Wire);
// Werte 1-fach verstärken (ESP32 liefert max. 3,3V)
ads.setGain(GAIN_ONE);
oled.begin();
oled.clearBuffer(); // Textspeicher löschen
oled.setFont(u8g2_font_6x12_tr); // Kleine Schrift 6x12
//oled.setFont(u8g2_font_9x15_mf); // Mittelgroß 9x15
//oled.setFont(u8g2_font_10x20_mf); // Groß 10x20
oled.setCursor(10, (1 * 10));
oled.print(F("ESP32_Relais_Board"));
oled.setCursor(28, (2 * 10));
oled.print(F("Mit ADS1115"));
oled.sendBuffer();
for (size_t i = 0; i < zaehler; i++)
{
pinMode(ausgang[i], OUTPUT);
}
pinMode(led, OUTPUT);
}
//============================LOOP=========================================
void loop() {
aktuelleMillis = millis();
//---------- Alarm LED an ?----------------
//----wenn eine Spannung gestört ist-------
if (aktuelleMillis - zeitaktuell >= Pausezeit)
{
if ((meldung0 == 1)||(meldung1 == 1))
{
einaus = !einaus;
digitalWrite(led, einaus);
zeitaktuell = millis();
}
else
{
digitalWrite(led, LOW);
}
}
//-----------------------------------------
// -------Messung per ADS1115--------------
// - Kanal 0 messen (single-ended)
adc0 = ads.readADC_SingleEnded(0);
ads_mv0 = ads.computeVolts(adc0);
// - Kanal 1 messen (single-ended)
adc1 = ads.readADC_SingleEnded(1);
ads_mv1 = ads.computeVolts(adc1);
//-----------------------------------------
//----------Messung ausgeben---------------
//--------------Kanal 0--------------------
oled.setFont(u8g2_font_10x20_mf);
//ADS Kanal 0 anzeigen
oled.setCursor(20, (2 * 20));
oled.print(ads_mv0);
oled.print(F(" Volt"));
if ((ads_mv0 * 100) > 320)
{
digitalWrite(ausgang[0], HIGH);
meldung0 = 0;
}
else
{
digitalWrite(ausgang[0], LOW);
meldung0 = 1;
}
//---------Kanal 1------------------------
oled.setCursor(20, (3 * 20));
oled.print(ads_mv1);
oled.print(F(" Volt"));
if ((ads_mv1 * 100) > 320)
{
digitalWrite(ausgang[1], HIGH);
meldung1 = 0;
}
else
{
digitalWrite(ausgang[1], LOW);
meldung1 = 1;
}
//--------------------------------------
//-----Display aktualisieren------------
oled.sendBuffer();
delay(100);
//--------------------------------------
/*
//for Schleife zum Relais Steuern 1-8
for (size_t i = 0; i < zaehler; i++)
{
digitalWrite(ausgang[i], HIGH);
delay(interval);
}
digitalWrite(led, HIGH);
delay(100);
//for Schleife zum Relais Steuern 8-1
for (size_t i = zaehler; i > 0; i--)
{
digitalWrite(ausgang[i - 1], LOW);
delay(interval);
}
digitalWrite(led, LOW);
delay(100);
*/
}
Und hier habe ich mir noch die Pinbelegung mit der Ansicht auf die Stifte abgeschrieben.
.
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste