diff --git a/platformio_override.sample.ini b/platformio_override.sample.ini index d7d41f3a6..406c6f23d 100644 --- a/platformio_override.sample.ini +++ b/platformio_override.sample.ini @@ -56,6 +56,7 @@ build_flags = ${common.build_flags_esp8266} ; -D IRPIN=4 ; -D RLYPIN=12 ; -D RLYMDE=1 +; -D RLYODRAIN=0 ; -D LED_BUILTIN=2 # GPIO of built-in LED ; ; Limit max buses diff --git a/wled00/button.cpp b/wled00/button.cpp index ce47a17ac..3b73df81d 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -379,7 +379,7 @@ void handleIO() esp32RMTInvertIdle(); #endif if (rlyPin>=0) { - pinMode(rlyPin, OUTPUT); + pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT); digitalWrite(rlyPin, rlyMde); } offMode = false; @@ -400,7 +400,7 @@ void handleIO() esp32RMTInvertIdle(); #endif if (rlyPin>=0) { - pinMode(rlyPin, OUTPUT); + pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT); digitalWrite(rlyPin, !rlyMde); } } diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 530777ab5..9e6989a75 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -335,12 +335,16 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(irApplyToAllSelected, hw["ir"]["sel"]); JsonObject relay = hw[F("relay")]; + + if (relay.containsKey("odrain")) { + rlyOpenDrain = relay["odrain"]; + } int hw_relay_pin = relay["pin"] | -2; if (hw_relay_pin > -2) { pinManager.deallocatePin(rlyPin, PinOwner::Relay); if (pinManager.allocatePin(hw_relay_pin,true, PinOwner::Relay)) { rlyPin = hw_relay_pin; - pinMode(rlyPin, OUTPUT); + pinMode(rlyPin, rlyOpenDrain ? OUTPUT_OPEN_DRAIN : OUTPUT); } else { rlyPin = -1; } @@ -868,6 +872,7 @@ void serializeConfig() { JsonObject hw_relay = hw.createNestedObject(F("relay")); hw_relay["pin"] = rlyPin; hw_relay["rev"] = !rlyMde; + hw_relay["odrain"] = rlyOpenDrain; hw[F("baud")] = serialBaud; diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index 4ad4cb16e..eecdf66f0 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -619,7 +619,8 @@ Swap: Apply IR change to main segment only:
IR info
- Relay GPIO: Invert  ✕
+ Relay GPIO: Invert Open drain  ✕

Defaults

Turn LEDs on after power up/reset:
diff --git a/wled00/set.cpp b/wled00/set.cpp index a2e884c81..d3382be18 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -243,6 +243,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) rlyPin = -1; } rlyMde = (bool)request->hasArg(F("RM")); + rlyOpenDrain = (bool)request->hasArg(F("RO")); disablePullUp = (bool)request->hasArg(F("IP")); touchThreshold = request->arg(F("TT")).toInt(); diff --git a/wled00/wled.h b/wled00/wled.h index b94f7790b..d8385e79e 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -288,6 +288,12 @@ WLED_GLOBAL bool rlyMde _INIT(true); #else WLED_GLOBAL bool rlyMde _INIT(RLYMDE); #endif +//Use open drain (floating pin) when relay should be off +#ifndef RLYODRAIN +WLED_GLOBAL bool rlyOpenDrain _INIT(false); +#else +WLED_GLOBAL bool rlyOpenDrain _INIT(RLYODRAIN); +#endif #ifndef IRPIN #define IRPIN -1 #endif diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 3915d9b0e..49fd522bb 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -458,6 +458,7 @@ void getSettingsJS(byte subPage, char* dest) sappend('i',SET_F("PB"),strip.paletteBlend); sappend('v',SET_F("RL"),rlyPin); sappend('c',SET_F("RM"),rlyMde); + sappend('c',SET_F("RO"),rlyOpenDrain); for (uint8_t i=0; i