From 3b4af96990a97e4d14053fac94e417d420a05067 Mon Sep 17 00:00:00 2001 From: Die Peter Pan Date: Fri, 17 Mar 2023 00:50:14 +0200 Subject: [PATCH] [WIFI] Added macros for ESP - WifiGMode and WifiPower to reduce/eliminate Wifi interference on sensors like HC-SR501 (#1531) * Fix WiFi interference on PIR * Added to DOCS re: WiFi interference. * Add sufficx -custom to configs without prod binaries * Add ESP32 Wifi band and tx power to user_config.h --------- Co-authored-by: andre --- docs/use/boards.md | 7 +++++++ environments.ini | 28 +++++++++++++++++++++++++ main/User_config.h | 14 +++++++++++++ main/main.ino | 52 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) diff --git a/docs/use/boards.md b/docs/use/boards.md index da56091..7a8cfeb 100644 --- a/docs/use/boards.md +++ b/docs/use/boards.md @@ -13,6 +13,13 @@ On M5Stack boards you may do a long press to these buttons in low power mode 0 ( You can also do a long press when powering the board to reset it, this press must be done during the first 5 seconds after the start. +### Wifi interference on ESP32 ### +Certain sensors like HC-SR501 is prone to generate false signals / triggers when used on a ESP32 with Wifi enabled. To reduce or elimate the effect the board must be put into Wifi B/G with lower TX power. + +This can be achieved with the following macro, `WifiGMode` defined true and `WifiPower` to e.g. WIFI_POWER_11dBm. + +Since the WiFi protocol is persisted in the flash of the ESP32 you have to run at least once with `WiFiGMode` defined **false** to get Band N back. + ### Low power mode for ESP32 OpenMQTTGateway support a low power mode for ESP32, this mode is available per default on boards with batteries. The other boards needs to have the macro `DEFAULT_LOW_POWER_MODE` defined at 0, 1 or 2 to use it. More information about the modes is available into User_config.h. diff --git a/environments.ini b/environments.ini index cf40546..b3f0a32 100644 --- a/environments.ini +++ b/environments.ini @@ -679,6 +679,34 @@ board_upload.port = /dev/cu.usbserial-0001 board_monitor.speed = 921600 board_monitor.port = /dev/cu.usbserial-0001 +[env:esp32doitv1-aithinker-r01-sx1278-hcsr501-test] +extends = env:esp32doitv1-aithinker-r01-sx1278 +lib_deps = ${env:esp32doitv1-aithinker-r01-sx1278.lib_deps} + ${libraries.unifiedsensor} +build_flags = + ${env:esp32doitv1-aithinker-r01-sx1278.build_flags} + '-DHCSR501_LED_NOTIFY_GPIO=LED_BUILTIN' + '-DWifiGMode=true' + '-DWifiPower=WIFI_POWER_11dBm' + '-DZsensorHCSR501="HCSR501"' + '-DHCSR501_GPIO=13' + +[env:esp32doitv1-aithinker-r01-sx1278-hcsr501-ota-test] +extends = env:esp32doitv1-aithinker-r01-sx1278-hcsr501-test +upload_protocol = espota +upload_port = 10.0.0.108 +upload_flags = + --auth=OTAPASSWORD + --port=8266 + +[env:esp32doitv1-aithinker-r01-sx1278-ota-test] +extends = env:esp32doitv1-aithinker-r01-sx1278 +upload_protocol = espota +upload_port = 10.0.0.70 +upload_flags = + --auth=OTAPASSWORD + --port=8266 + [env:esp32dev-rtl_433] platform = ${com.esp32_platform} board = esp32dev diff --git a/main/User_config.h b/main/User_config.h index fb8987b..59c7fdc 100644 --- a/main/User_config.h +++ b/main/User_config.h @@ -617,6 +617,20 @@ CRGB leds2[FASTLED_IND_NUM_LEDS]; # define LOG_LEVEL LOG_LEVEL_NOTICE #endif +/*-------------------ESP32 Wifi band and tx power ---------------------*/ +//Certain sensors are sensitive to ESP32 Wifi which can cause interference with their normal operation +//For example it can cause false triggers on a PIR HC-SR501 +//It is reccomended to change Wifi BAND to G and reduce tx power level to 11dBm +//Since the WiFi protocol is persisted in the flash of the ESP32 you have to run at least once with `WiFiGMode` defined false to get Band N back. +#ifdef ESP32 +# ifndef WifiGMode +//# define WifiGMode true +# endif +# ifndef WifiPower +//# define WifiPower WIFI_POWER_11dBm +# endif +#endif + /*-----------PLACEHOLDERS FOR OLED/LCD DISPLAY--------------*/ // The real definitions are in config_M5.h / config_SSD1306.h #define pubOled(...) // display the published message onto the OLED display diff --git a/main/main.ino b/main/main.ino index f2a1991..bbe3501 100644 --- a/main/main.ino +++ b/main/main.ino @@ -700,6 +700,48 @@ void callback(char* topic, byte* payload, unsigned int length) { free(p); } +#if defined(ESP32) && (defined(WifiGMode) || defined(WifiPower)) +void setESP32WifiPorotocolTxPower() { + //Reduce WiFi interference when using ESP32 using custom WiFi mode and tx power + //https://github.com/espressif/arduino-esp32/search?q=WIFI_PROTOCOL_11G + //https://www.letscontrolit.com/forum/viewtopic.php?t=671&start=20 +# if WifiGMode == true + if (esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G) != ESP_OK) { + Log.error(F("Failed to change WifiMode." CR)); + } +# endif + +# if WifiGMode == false + if (esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N) != ESP_OK) { + Log.error(F("Failed to change WifiMode." CR)); + } +# endif + + uint8_t getprotocol; + esp_err_t err; + err = esp_wifi_get_protocol(WIFI_IF_STA, &getprotocol); + + if (err != ESP_OK) { + Log.notice(F("Could not get protocol!" CR)); + } + if (getprotocol & WIFI_PROTOCOL_11N) { + Log.notice(F("WiFi_Protocol_11n" CR)); + } + if (getprotocol & WIFI_PROTOCOL_11G) { + Log.notice(F("WiFi_Protocol_11g" CR)); + } + if (getprotocol & WIFI_PROTOCOL_11B) { + Log.notice(F("WiFi_Protocol_11b" CR)); + } + +# ifdef WifiPower + Log.notice(F("Requested WiFi power level: %i" CR), WifiPower); + WiFi.setTxPower(WifiPower); +# endif + Log.notice(F("Operating WiFi power level: %i" CR), WiFi.getTxPower()); +} +#endif + void setup() { //Launch serial for debugging purposes Serial.begin(SERIAL_BAUD); @@ -975,7 +1017,11 @@ bool wifi_reconnect_bypass() { while (WiFi.waitForConnectResult() != WL_CONNECTED && wifi_autoreconnect_cnt < maxConnectionRetryWifi) { # endif Log.notice(F("Attempting Wifi connection with saved AP: %d" CR), wifi_autoreconnect_cnt); + WiFi.begin(); +# if defined(ESP32) && (defined(WifiGMode) || defined(WifiPower)) + setESP32WifiPorotocolTxPower(); +# endif delay(1000); wifi_autoreconnect_cnt++; } @@ -2237,12 +2283,18 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding Log.warning(F("Attempting connection to new AP" CR)); WiFi.begin((const char*)SYSdata["wifi_ssid"], (const char*)SYSdata["wifi_pass"]); +# if defined(ESP32) && (defined(WifiGMode) || defined(WifiPower)) + setESP32WifiPorotocolTxPower(); +# endif WiFi.waitForConnectResult(); if (WiFi.status() != WL_CONNECTED) { Log.error(F("Failed to connect to new AP; falling back" CR)); WiFi.disconnect(true); WiFi.begin(prev_ssid.c_str(), prev_pass.c_str()); +# if defined(ESP32) && (defined(WifiGMode) || defined(WifiPower)) + setESP32WifiPorotocolTxPower(); +# endif if (WiFi.waitForConnectResult() != WL_CONNECTED) { # if defined(ESP8266) ESP.reset();