Aircoookie / WLED

Control WS2812B and many more types of digital RGB LEDs with an ESP8266 or ESP32 over WiFi!
https://kno.wled.ge
MIT License
14.93k stars 3.22k forks source link

[14.0-b2] WLED stop working almost immediately on ESP32 when RX pin (GPIO03) is not pulled down (and USB IC is not attached) #3128

Closed wled-install closed 1 year ago

wled-install commented 1 year ago

What happened?

On a ESP32 based board without USB IC WLED software stops working almost immediately when RX pin (GPIO03) is not pulled down (and USB IC is not attached). After power-on WLED starts corerctly, it can be seen tat LEDs are controlled for a short time period, then it stops (no LED control signal, no GUI can be reached). The issue is with current 0.14-b2 build. No issue with 13.3 Release.

To Reproduce Bug

1) Take ESP32 based board without USB IC an nothing connected to RX (GPIO3) Pin. 2) Take and connect USB adapter 3) Erse flash and flash 14.0-b2 build 4) Disconnect USB adapter 3) Attach some leds to default GPIO to see if they are controlled 4) Disconnect from the power board and connect again 5) You will see tat LEDs are controlled for a short time, but no WLED-AP etc. since ESP32 stop working 6) Tie GPIO3 (RX Pin) to Ground or attach USB adapter and repeat power off7on again. Now is everything fine.

Expected Behavior

Full functionality independent on what is attached or not to RX Pin

Install Method

Self-Compiled

What version of WLED?

0.14-b2 (dev branch taken on 14. of march 2023)

Which microcontroller/board are you seeing the problem on?

ESP32

Relevant log/trace output

No response

Anything else?

No response

Code of Conduct

wled-install commented 1 year ago

could be HW +SW combination, closed till clarified in details

blazoncek commented 1 year ago

This may not be WLED SW related as there were no change in Serial processing in 0.14. It may have to do with libraries used but that is beyond the scope of WLED. My recommendation would be, if you design PCB with ESP and no USB-to-serial chip, pull-down GPIO3 (also pull-up GPIO0, GPIO1 and, in some instances, GPIO2).

softhack007 commented 1 year ago
softhack007 commented 1 year ago

A few ideas - but not sure if that would break other functionality

To be discussed...

Update for a): according to arduino docs "On the boards with native USB, if (Serial) indicates whether or not the USB CDC serial connection is open. For all other boards, and the non-USB CDC ports, this will always return true."

softhack007 commented 1 year ago

Possibly not a SW bug, but let's discuss if we can avoid a lockup somehow

wled-install commented 1 year ago

pinMode(hardwareRX, INPUT_PULLDOWN); delay(1) or external pull-down or pull-up helps at low noise energy. It must be sufficient for household’s environments. For more noisy environments either dedicated EMC measures in HW needed or the possibility to switch off serial functions if not used.

So my proposal would be at least to implement pinMode(hardwareRX, INPUT_PULLDOWN); delay(1) in SW. Should not have any negative impact, easy to implement and must be enough for mainstream. Maybe additinal setting in GUI to switch serial off.

blazoncek commented 1 year ago

Please add DEBUG_PRINT statements around the code @softhack007 mentioned and use net debug functionality to capture debug output.

wled-install commented 1 year ago

Not the net debug (not possible with the issue) but normal serial debug on TX pin: 1) without fix: something like this

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1256
load:0x40078000,len:12040
load:0x40080400,len:5984
entry 0x40080688
Ada
Baud is now 500000
<0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>

or this:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1256
load:0x40078000,len:12040
load:0x40080400,len:5984
entry 0x40080688
Ada
Baud is now 1500000
<0>
  1. With fix from softhack007
    rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
    configsip: 0, SPIWP:0xee
    clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    mode:DIO, clock div:1
    load:0x3fff0018,len:4
    load:0x3fff001c,len:1256
    load:0x40078000,len:12040
    load:0x40080400,len:5984
    entry 0x40080688
    Ada
blazoncek commented 1 year ago

It appears that random (or EMI) data triggers Serial input.

softhack007 commented 1 year ago

Maybe additional setting in GUI to switch serial off.

Its not by GUI yet, but you could un-define WLED_ENABLE_ADALIGHT in wled.h This disables reading from hardwareRX in handleSerial().

https://github.com/Aircoookie/WLED/blob/cac51737cb5f45091446cc9c101b0770a77520df/wled00/wled.h#L33

https://github.com/Aircoookie/WLED/blob/fd8920923346a5131d3ebd212090a48731d856a2/wled00/wled_serial.cpp#L70-L75


With commit fd8920923346a5131d3ebd212090a48731d856a2, I've added the flag WLED_DISABLE_ADALIGHT so that you can disable use of RX pin in your custom platformio_override.ini build env.

wled-install commented 1 year ago

With commit fd89209, I've added the flag WLED_DISABLE_ADALIGHT so that you can disable use of RX pin in your custom platformio_override.ini build env.

Yeah, I've seen this #define in the code, thank you!

wled-install commented 1 year ago

It appears that random (or EMI) data triggers Serial input.

Yes it is definately. For low noise energy the solution from softhack is sufficient. For more noisy enviroment we can turn serial off by define (or maybe in future someone make a switch in the GUI). I think the issue can be closed.

softhack007 commented 1 year ago

Thanks for the feedback :-) There is only one downside of -D WLED_DISABLE_ADALIGHT - it also disables IMPROV, which works over serial. So web installers cannot configure Wifi settings after install any more when using this option.