Hi,
nach Jahren will ich nun endlich meine Steuerungen an den Arduino übergeben. Für den Anfang erst mal nur den Lüfter.
Testprozedere:
- Arduino Nano
- Elegoo 4 Kanal 5V Relais Modul
- Taster
Mit dem Taster wird bei jedem Druck das erste/nächste Relais aktiviert. Bei erneutem Tastendruck wird das evtl. bereits aktivierte Relais deaktiviert und das folgende aktiviert. Das aktive Relais bleibt dann für eine fixe Zeit (im Test 1 Minute) aktiv.
Mangels Taster habe ich hierfür die beiden grünen gekreuzten Drähte genommen. Leider tut sich nichts. Gebe ich auf die IN-Kontakte des Relais Moduls direkt GND, zieht das entsprechende Relais.
Wo liegt mein Fehler? Pulldown habe ich 10k genommen, sollte völlig ausreichen.
EDIT: Der Sketch fehlt ja noch:
Arduino
const int relayPins[] = {2, 3, 4}; // Relais Pins
const int buttonPin = 5 ; // Taster Pin
const int relayCount = 3; // Anzahl der Relais
const unsigned long onTime = 60000; // Einschaltdauer in Millisekunden (1 Minute)
int currentRelay = 0;
unsigned long lastDebounceTime = 0;
int lastButtonState = LOW;
bool relayActive = false;
unsigned long relayStartTime = 0;
void setup() {
for (int i = 0; i < relayCount; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Relais zu Beginn ausschalten
}
pinMode(buttonPin, INPUT_PULLUP); // Taster mit internem Pull-Up Widerstand
}
void loop() {
int reading = digitalRead(buttonPin);
// Entprellung des Tasters
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > 50) {
if (reading == LOW && lastButtonState == HIGH) { // Nur bei steigender Flanke
// Taster wurde gedrückt
toggleRelay();
}
}
lastButtonState = reading;
// Überprüfen, ob ein Relais aktiv ist und die Einschaltdauer abgelaufen ist
if (relayActive && (millis() - relayStartTime) >= onTime) {
deactivateRelay(currentRelay);
relayActive = false;
}
}
void toggleRelay() {
// Aktuelles Relais deaktivieren
if (relayActive) {
deactivateRelay(currentRelay);
relayActive = false;
}
// Nächstes Relais aktivieren
currentRelay = (currentRelay + 1) % relayCount;
activateRelay(currentRelay);
relayActive = true;
relayStartTime = millis();
}
void activateRelay(int relayIndex) {
digitalWrite(relayPins[relayIndex], HIGH);
// zusätzliche Aktionen ausführen, wenn ein Relais aktiviert wird
}
void deactivateRelay(int relayIndex) {
digitalWrite(relayPins[relayIndex], LOW);
// zusätzliche Aktionen ausführen, wenn ein Relais deaktiviert wird
}
Alles anzeigen