[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 <agreylin@gmail.com>
This commit is contained in:
1 parent
d530841b0e
commit
3b4af96990
4 files changed
+101
No files matched your search
@@ -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.
|
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
|
### 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.
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -679,6 +679,34 @@ board_upload.port = /dev/cu.usbserial-0001
|
|||||||
board_monitor.speed = 921600
|
board_monitor.speed = 921600
|
||||||
board_monitor.port = /dev/cu.usbserial-0001
|
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]
|
[env:esp32dev-rtl_433]
|
||||||
platform = ${com.esp32_platform}
|
platform = ${com.esp32_platform}
|
||||||
board = esp32dev
|
board = esp32dev
|
||||||
|
|||||||
@@ -617,6 +617,20 @@ CRGB leds2[FASTLED_IND_NUM_LEDS];
|
|||||||
# define LOG_LEVEL LOG_LEVEL_NOTICE
|
# define LOG_LEVEL LOG_LEVEL_NOTICE
|
||||||
#endif
|
#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--------------*/
|
/*-----------PLACEHOLDERS FOR OLED/LCD DISPLAY--------------*/
|
||||||
// The real definitions are in config_M5.h / config_SSD1306.h
|
// The real definitions are in config_M5.h / config_SSD1306.h
|
||||||
#define pubOled(...) // display the published message onto the OLED display
|
#define pubOled(...) // display the published message onto the OLED display
|
||||||
|
|||||||
@@ -700,6 +700,48 @@ void callback(char* topic, byte* payload, unsigned int length) {
|
|||||||
free(p);
|
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() {
|
void setup() {
|
||||||
//Launch serial for debugging purposes
|
//Launch serial for debugging purposes
|
||||||
Serial.begin(SERIAL_BAUD);
|
Serial.begin(SERIAL_BAUD);
|
||||||
@@ -975,7 +1017,11 @@ bool wifi_reconnect_bypass() {
|
|||||||
while (WiFi.waitForConnectResult() != WL_CONNECTED && wifi_autoreconnect_cnt < maxConnectionRetryWifi) {
|
while (WiFi.waitForConnectResult() != WL_CONNECTED && wifi_autoreconnect_cnt < maxConnectionRetryWifi) {
|
||||||
# endif
|
# endif
|
||||||
Log.notice(F("Attempting Wifi connection with saved AP: %d" CR), wifi_autoreconnect_cnt);
|
Log.notice(F("Attempting Wifi connection with saved AP: %d" CR), wifi_autoreconnect_cnt);
|
||||||
|
|
||||||
WiFi.begin();
|
WiFi.begin();
|
||||||
|
# if defined(ESP32) && (defined(WifiGMode) || defined(WifiPower))
|
||||||
|
setESP32WifiPorotocolTxPower();
|
||||||
|
# endif
|
||||||
delay(1000);
|
delay(1000);
|
||||||
wifi_autoreconnect_cnt++;
|
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));
|
Log.warning(F("Attempting connection to new AP" CR));
|
||||||
WiFi.begin((const char*)SYSdata["wifi_ssid"], (const char*)SYSdata["wifi_pass"]);
|
WiFi.begin((const char*)SYSdata["wifi_ssid"], (const char*)SYSdata["wifi_pass"]);
|
||||||
|
# if defined(ESP32) && (defined(WifiGMode) || defined(WifiPower))
|
||||||
|
setESP32WifiPorotocolTxPower();
|
||||||
|
# endif
|
||||||
WiFi.waitForConnectResult();
|
WiFi.waitForConnectResult();
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
Log.error(F("Failed to connect to new AP; falling back" CR));
|
Log.error(F("Failed to connect to new AP; falling back" CR));
|
||||||
WiFi.disconnect(true);
|
WiFi.disconnect(true);
|
||||||
WiFi.begin(prev_ssid.c_str(), prev_pass.c_str());
|
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 (WiFi.waitForConnectResult() != WL_CONNECTED) {
|
||||||
# if defined(ESP8266)
|
# if defined(ESP8266)
|
||||||
ESP.reset();
|
ESP.reset();
|
||||||
|
|||||||
Reference in new issue
Block a user