diff --git a/CHANGELOG.md b/CHANGELOG.md index cdd518602..4faf91562 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ## [12.1.1.3] ### Added +- ESP32-S2 and ESP32-S3 touch input support ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 14c3e38ef..0adcc81fd 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -125,6 +125,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support of optional file calib.dat on ADE7953 based energy monitors like Shelly EM [#16486](https://github.com/arendst/Tasmota/issues/16486) - Support for Ethernet in ESP32 safeboot firmware [#16388](https://github.com/arendst/Tasmota/issues/16388) - ESP32-S3 support for internal temperature sensor +- ESP32-S2 and ESP32-S3 touch input support - Berry has persistent MQTT subscriptions: auto-subscribe at (re)connection - Berry automated solidification of code diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 1d258ae23..0f3561b1a 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -836,9 +836,10 @@ typedef struct { uint8_t modbus_sbaudrate; // F61 uint8_t modbus_sconfig; // F62 - uint8_t free_f63[17]; // F63 - Decrement if adding new Setting variables just above and below + uint8_t free_f63[13]; // F63 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below + uint32_t touch_threshold; // F70 SOBitfield6 flag6; // F74 uint16_t flowratemeter_calibration[2];// F78 int32_t energy_kWhexport_ph[3]; // F7C diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index fea059869..9a2c46cd9 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1015,6 +1015,13 @@ #define SET_ESP32_STACK_SIZE (8 * 1024) // Set the stack size for Tasmota. The default value is 8192 for Arduino, some builds might need to increase it +#ifdef SOC_TOUCH_VERSION_1 + #define ESP32_TOUCH_THRESHOLD 40 +#endif +#ifdef SOC_TOUCH_VERSION_2 + #define ESP32_TOUCH_THRESHOLD 40000 +#endif + #define USE_ESP32_SENSORS // Add support for ESP32 temperature and optional hall effect sensor //#define USE_SONOFF_SPM // Add support for ESP32 based Sonoff Smart Stackable Power Meter (+11k code) diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 649c3d301..dfcac5db7 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -976,6 +976,7 @@ void SettingsDefaultSet2(void) { flag.button_swap |= KEY_SWAP_DOUBLE_PRESS; flag.button_single |= KEY_ONLY_SINGLE_PRESS; Settings->param[P_HOLD_TIME] = KEY_HOLD_TIME; // Default 4 seconds hold time + Settings->touch_threshold = ESP32_TOUCH_THRESHOLD; // Switch for (uint32_t i = 0; i < MAX_SWITCHES_SET; i++) { Settings->switchmode[i] = SWITCH_MODE; } @@ -1573,6 +1574,9 @@ void SettingsDelta(void) { if (Settings->version < 0x0C000204) { // 12.0.2.4 Settings->param[P_BISTABLE_PULSE] = APP_BISTABLE_PULSE; } + if (Settings->version < 0x0C010103) { // 12.1.1.3 + Settings->touch_threshold = ESP32_TOUCH_THRESHOLD; + } Settings->version = VERSION; SettingsSave(1); diff --git a/tasmota/tasmota_support/support_button_v3.ino b/tasmota/tasmota_support/support_button_v3.ino index f7cc71b56..56994fa43 100644 --- a/tasmota/tasmota_support/support_button_v3.ino +++ b/tasmota/tasmota_support/support_button_v3.ino @@ -25,10 +25,7 @@ * Inspired by (https://github.com/OLIMEX/olimex-iot-firmware-esp8266/blob/master/olimex/user/user_switch2.c) \*********************************************************************************************/ -#define MAX_RELAY_BUTTON1 5 // Max number of relay controlled by BUTTON1 - -#define TOUCH_PIN_THRESHOLD 12 // Smaller value will treated as button press -#define TOUCH_HIT_THRESHOLD 3 // successful hits to filter out noise +#define MAX_RELAY_BUTTON1 5 // Max number of relay controlled by BUTTON1 const uint8_t BUTTON_PROBE_INTERVAL = 10; // Time in milliseconds between button input probe const uint8_t BUTTON_FAST_PROBE_INTERVAL = 2; // Time in milliseconds between button input probe for AC detection @@ -63,7 +60,6 @@ struct BUTTON { struct TOUCH_BUTTON { uint32_t touch_mask = 0; // Touch flag (1 = enabled) uint32_t calibration = 0; // Bitfield - uint32_t pin_threshold = TOUCH_PIN_THRESHOLD; uint8_t hits[MAX_KEYS] = { 0 }; // Hits in a row to filter out noise } TOUCH_BUTTON; #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 @@ -121,7 +117,11 @@ void ButtonProbe(void) { if (bitRead(TOUCH_BUTTON.touch_mask, i)) { if (ac_detect || bitRead(TOUCH_BUTTON.calibration, i +1)) { continue; } // Touch is slow. Takes 21mS to read uint32_t value = touchRead(Pin(GPIO_KEY1, i)); - button_not_activated = ((value == 0) || (value > TOUCH_BUTTON.pin_threshold)); +#ifdef SOC_TOUCH_VERSION_2 + button_not_activated = (value < Settings->touch_threshold); // ESPS3 No touch = 24200, Touch > 40000 +#else + button_not_activated = ((value == 0) || (value > Settings->touch_threshold)); // ESP32 No touch = 74, Touch < 40 +#endif } else #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 button_not_activated = (digitalRead(Pin(GPIO_KEY1, i)) != bitRead(Button.inverted_mask, i)); @@ -306,7 +306,11 @@ void ButtonHandler(void) { #if defined(SOC_TOUCH_VERSION_1) || defined(SOC_TOUCH_VERSION_2) if (bitRead(TOUCH_BUTTON.touch_mask, button_index) && bitRead(TOUCH_BUTTON.calibration, button_index +1)) { // Touch uint32_t _value = touchRead(Pin(GPIO_KEY1, button_index)); - if ((_value > 0) && (_value < TOUCH_BUTTON.pin_threshold)) { // Probably read-error (0) +#ifdef SOC_TOUCH_VERSION_2 + if (_value > Settings->touch_threshold) { // ESPS3 No touch = 24200, Touch = 100000 +#else + if ((_value > 0) && (_value < Settings->touch_threshold)) { // ESP32 No touch = 74, Touch = 20 (Probably read-error (0)) +#endif TOUCH_BUTTON.hits[button_index]++; } else { TOUCH_BUTTON.hits[button_index] = 0; diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 119cf39fe..9b1ff51cd 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -46,7 +46,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix #endif // USE_DEVICE_GROUPS D_CMND_SETSENSOR "|" D_CMND_SENSOR "|" D_CMND_DRIVER "|" D_CMND_JSON #ifdef ESP32 - "|Info|" + "|Info|" #if defined(SOC_TOUCH_VERSION_1) || defined(SOC_TOUCH_VERSION_2) D_CMND_TOUCH_CAL "|" D_CMND_TOUCH_THRES "|" #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 @@ -85,9 +85,9 @@ void (* const TasmotaCommand[])(void) PROGMEM = { #endif // USE_DEVICE_GROUPS &CmndSetSensor, &CmndSensor, &CmndDriver, &CmndJson #ifdef ESP32 - , &CmndInfo, + , &CmndInfo, #if defined(SOC_TOUCH_VERSION_1) || defined(SOC_TOUCH_VERSION_2) - &CmndTouchCal, &CmndTouchThres, + &CmndTouchCal, &CmndTouchThres, #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 &CmndCpuFrequency #endif // ESP32 @@ -2634,10 +2634,10 @@ void CmndTouchCal(void) { } void CmndTouchThres(void) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32000)) { - TOUCH_BUTTON.pin_threshold = XdrvMailbox.payload; + if (XdrvMailbox.data_len > 0) { + Settings->touch_threshold = XdrvMailbox.payload; } - ResponseCmndNumber(TOUCH_BUTTON.pin_threshold); + ResponseCmndNumber(Settings->touch_threshold); } #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2