diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino
index c9cd7fef3..b2145b6bf 100644
--- a/sonoff/_releasenotes.ino
+++ b/sonoff/_releasenotes.ino
@@ -3,7 +3,8 @@
* Add random window to timers (#2447)
* Add optional KNX IP Protocol Support (#2402)
* Add Greek language file (#2491)
- * Fix compile error when using ESP/Arduino library v2.3.0 by reverting KNX async UDP library to default UDP library (#2488,#2492,#2493)
+ * Add support for sensor HC-SR04 ultrasonic (#113, #1964, #2444)
+ * Fix compile error when using ESP/Arduino library v2.3.0 by reverting KNX async UDP library to default UDP library (#2488, #2492, #2493)
* Fix configuration filename truncation when it contains spaces (#2484, #2490)
*
* 5.12.0l
diff --git a/sonoff/i18n.h b/sonoff/i18n.h
index 2820ae0de..fc6a43db4 100644
--- a/sonoff/i18n.h
+++ b/sonoff/i18n.h
@@ -46,6 +46,7 @@
#define D_JSON_COUNTER "Counter"
#define D_JSON_CURRENT "Current" // As in Voltage and Current
#define D_JSON_DATA "Data"
+#define D_JSON_DISTANCE "Distance"
#define D_JSON_DNSSERVER "DNSServer"
#define D_JSON_DONE "Done"
#define D_JSON_ECO2 "eCO2"
diff --git a/sonoff/language/cs-CZ.h b/sonoff/language/cs-CZ.h
index c7c975297..fa641216d 100644
--- a/sonoff/language/cs-CZ.h
+++ b/sonoff/language/cs-CZ.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Tmavý"
#define D_DEBUG "Debug"
#define D_DISABLED "Zablokováno"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Server DNS"
#define D_DONE "Provedeno"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "hod"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/de-DE.h b/sonoff/language/de-DE.h
index 2617e8e1b..b2ade5e2b 100644
--- a/sonoff/language/de-DE.h
+++ b/sonoff/language/de-DE.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "dunkel"
#define D_DEBUG "debug"
#define D_DISABLED "deaktiviert"
+#define D_DISTANCE "Abstand"
#define D_DNS_SERVER "DNS-Server"
#define D_DONE "erledigt"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "h"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/el-GR.h b/sonoff/language/el-GR.h
index 12e5542ce..7eff7094a 100644
--- a/sonoff/language/el-GR.h
+++ b/sonoff/language/el-GR.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Σκούρο"
#define D_DEBUG "Debug"
#define D_DISABLED "Απενεργοποιημένο"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Διακομιστής DNS"
#define D_DONE "Εγινε"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/en-GB.h b/sonoff/language/en-GB.h
index 7c7c9568f..a57d18fd9 100644
--- a/sonoff/language/en-GB.h
+++ b/sonoff/language/en-GB.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Dark"
#define D_DEBUG "Debug"
#define D_DISABLED "Disabled"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Done"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/es-AR.h b/sonoff/language/es-AR.h
index 736e7849d..899a6057a 100644
--- a/sonoff/language/es-AR.h
+++ b/sonoff/language/es-AR.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Oscura"
#define D_DEBUG "Debug"
#define D_DISABLED "Deshabilitado"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Listo"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/fr-FR.h b/sonoff/language/fr-FR.h
index db3506ef1..a9211dab1 100644
--- a/sonoff/language/fr-FR.h
+++ b/sonoff/language/fr-FR.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Sombre"
#define D_DEBUG "Debug"
#define D_DISABLED "Désactivé"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Serveur DNS"
#define D_DONE "Fait"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "h"
#define D_UNIT_KILOOHM "kΩ"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/hu-HU.h b/sonoff/language/hu-HU.h
index 80c568688..51d9e146f 100644
--- a/sonoff/language/hu-HU.h
+++ b/sonoff/language/hu-HU.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Min. fényerő"
#define D_DEBUG "Debug"
#define D_DISABLED "Letiltva"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Szerver"
#define D_DONE "Kész"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "ó"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/it-IT.h b/sonoff/language/it-IT.h
index b273222e6..7bd6b65b5 100644
--- a/sonoff/language/it-IT.h
+++ b/sonoff/language/it-IT.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Scuro"
#define D_DEBUG "Debug"
#define D_DISABLED "Disabilitato"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Fatto"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/nl-NL.h b/sonoff/language/nl-NL.h
index 776bca8e9..5d3bcb959 100644
--- a/sonoff/language/nl-NL.h
+++ b/sonoff/language/nl-NL.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Donker"
#define D_DEBUG "Debug"
#define D_DISABLED "Uitgeschakeld"
+#define D_DISTANCE "Afstand"
#define D_DNS_SERVER "DNS Server"
#define D_DONE "Klaar"
#define D_DST_TIME "ZT"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "h"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/pl-PL.h b/sonoff/language/pl-PL.h
index 09715f1e0..19a27ebeb 100644
--- a/sonoff/language/pl-PL.h
+++ b/sonoff/language/pl-PL.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Ciemny"
#define D_DEBUG "Debug"
#define D_DISABLED "Zablokowany"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Server DNS"
#define D_DONE "Wykonane"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Godz"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/pt-PT.h b/sonoff/language/pt-PT.h
index 01293ed18..55ccf37a6 100644
--- a/sonoff/language/pt-PT.h
+++ b/sonoff/language/pt-PT.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Luz Escura"
#define D_DEBUG "Depurar"
#define D_DISABLED "Disabilitado"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "Servidor DNS"
#define D_DONE "Concluído"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "A"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Hr"
#define D_UNIT_KILOOHM "kOhm"
#define D_UNIT_KILOWATTHOUR "kWh"
diff --git a/sonoff/language/ru-RU.h b/sonoff/language/ru-RU.h
index c5ecf5e69..96ad631ab 100644
--- a/sonoff/language/ru-RU.h
+++ b/sonoff/language/ru-RU.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Темный"
#define D_DEBUG "Отладка"
#define D_DISABLED "Блокирован"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS Сервер"
#define D_DONE "Выполнено"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "А"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "Ч"
#define D_UNIT_KILOOHM "кОм"
#define D_UNIT_KILOWATTHOUR "кВт"
diff --git a/sonoff/language/zh-CN.h b/sonoff/language/zh-CN.h
index ad52fef54..b90ab7b1d 100644
--- a/sonoff/language/zh-CN.h
+++ b/sonoff/language/zh-CN.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Dark"
#define D_DEBUG "调试"
#define D_DISABLED "禁用"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS服务器"
#define D_DONE "完成"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "安"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "时"
#define D_UNIT_KILOOHM "千欧"
#define D_UNIT_KILOWATTHOUR "千瓦时"
diff --git a/sonoff/language/zh-TW.h b/sonoff/language/zh-TW.h
index 927032310..b13f0ba04 100644
--- a/sonoff/language/zh-TW.h
+++ b/sonoff/language/zh-TW.h
@@ -75,6 +75,7 @@
#define D_DARKLIGHT "Dark"
#define D_DEBUG "除錯"
#define D_DISABLED "停用"
+#define D_DISTANCE "Distance"
#define D_DNS_SERVER "DNS伺服器"
#define D_DONE "完成"
#define D_DST_TIME "DST"
@@ -450,9 +451,12 @@
#define D_SENSOR_SDS0X1 "SDS0X1"
#define D_SENSOR_SBR_RX "SerBr Rx"
#define D_SENSOR_SBR_TX "SerBr Tx"
+#define D_SENSOR_SR04_TRIG "SR04 Tri"
+#define D_SENSOR_SR04_ECHO "SR04 Ech"
// Units
#define D_UNIT_AMPERE "安"
+#define D_UNIT_CENTIMETER "cm"
#define D_UNIT_HOUR "時"
#define D_UNIT_KILOOHM "千歐"
#define D_UNIT_KILOWATTHOUR "千瓦時"
diff --git a/sonoff/sonoff_template.h b/sonoff/sonoff_template.h
index b7ceb6c24..1efb95e7f 100644
--- a/sonoff/sonoff_template.h
+++ b/sonoff/sonoff_template.h
@@ -91,6 +91,8 @@ enum UserSelectablePins {
GPIO_SDS0X1, // Nova Fitness SDS011 Serial interface
GPIO_SBR_TX, // Serial Bridge Serial interface
GPIO_SBR_RX, // Serial Bridge Serial interface
+ GPIO_SR04_TRIG, // SR04 Trigger pin
+ GPIO_SR04_ECHO, // SR04 Echo pin
GPIO_SENSOR_END };
// Programmer selectable GPIO functionality offset by user selectable GPIOs
@@ -133,7 +135,8 @@ const char kSensorNames[] PROGMEM =
D_SENSOR_SAIR_TX "|" D_SENSOR_SAIR_RX "|"
D_SENSOR_SPI_CS "|" D_SENSOR_SPI_DC "|" D_SENSOR_BACKLIGHT "|"
D_SENSOR_PMS5003 "|" D_SENSOR_SDS0X1 "|"
- D_SENSOR_SBR_TX "|" D_SENSOR_SBR_RX;
+ D_SENSOR_SBR_TX "|" D_SENSOR_SBR_RX "|"
+ D_SENSOR_SR04_TRIG "|" D_SENSOR_SR04_ECHO;
/********************************************************************************************/
diff --git a/sonoff/user_config.h b/sonoff/user_config.h
index 402454462..eefdd2ffe 100644
--- a/sonoff/user_config.h
+++ b/sonoff/user_config.h
@@ -285,6 +285,8 @@
#define USE_ARILUX_RF // Add support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0))
+#define USE_SR04 // Add support for HC-SR04 ultrasonic devices (+1k code)
+
/*********************************************************************************************\
* Select all sensors - overrides above undefines!!
\*********************************************************************************************/
diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino
index 29067e14b..33cadbd16 100644
--- a/sonoff/webserver.ino
+++ b/sonoff/webserver.ino
@@ -396,9 +396,7 @@ void StartWebserver(int type, IPAddress ipweb)
my_hostname, (mdns_begun) ? ".local" : "", ipweb.toString().c_str());
AddLog(LOG_LEVEL_INFO);
}
- if (type) {
- webserver_state = type;
- }
+ if (type) { webserver_state = type; }
}
void StopWebserver()
@@ -435,12 +433,8 @@ void WifiManagerBegin()
void PollDnsWebserver()
{
- if (DnsServer) {
- DnsServer->processNextRequest();
- }
- if (WebServer) {
- WebServer->handleClient();
- }
+ if (DnsServer) { DnsServer->processNextRequest(); }
+ if (WebServer) { WebServer->handleClient(); }
}
/*********************************************************************************************/
@@ -495,9 +489,7 @@ void HandleRoot()
{
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_MAIN_MENU);
- if (CaptivePortal()) { // If captive portal redirect instead of displaying the page.
- return;
- }
+ if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the page.
if (HTTP_MANAGER == webserver_state) {
if ((Settings.web_password[0] != 0) && !(WebServer->hasArg("USER1")) && !(WebServer->hasArg("PASS1"))) {
@@ -549,9 +541,7 @@ void HandleRoot()
page += F("
");
byte idx = 0;
for (byte i = 0; i < 4; i++) {
- if (idx > 0) {
- page += F("
");
- }
+ if (idx > 0) { page += F("
"); }
for (byte j = 0; j < 4; j++) {
idx++;
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR(" | "), idx, idx);
@@ -620,17 +610,13 @@ void HandleAjaxStatusRefresh()
boolean HttpUser()
{
boolean status = (HTTP_USER == webserver_state);
- if (status) {
- HandleRoot();
- }
+ if (status) { HandleRoot(); }
return status;
}
void HandleConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURATION);
String page = FPSTR(HTTP_HEAD);
@@ -638,10 +624,10 @@ void HandleConfiguration()
page += FPSTR(HTTP_HEAD_STYLE);
page += FPSTR(HTTP_BTN_MENU_MODULE);
#if defined(USE_TIMERS) && defined(USE_TIMERS_WEB)
- if (devices_present) page += FPSTR(HTTP_BTN_MENU_TIMER);
+ if (devices_present) { page += FPSTR(HTTP_BTN_MENU_TIMER); }
#endif // USE_TIMERS and USE_TIMERS_WEB
page += FPSTR(HTTP_BTN_MENU_WIFI);
- if (Settings.flag.mqtt_enabled) page += FPSTR(HTTP_BTN_MENU_MQTT);
+ if (Settings.flag.mqtt_enabled) { page += FPSTR(HTTP_BTN_MENU_MQTT); }
page += FPSTR(HTTP_BTN_MENU4);
page += FPSTR(HTTP_BTN_MAIN);
ShowPage(page);
@@ -651,26 +637,20 @@ boolean GetUsedInModule(byte val, uint8_t *arr)
{
int offset = 0;
- if (!val) {
- return false; // None
- }
+ if (!val) { return false; } // None
#ifndef USE_I2C
- if (GPIO_I2C_SCL == val) {
- return true;
- }
- if (GPIO_I2C_SDA == val) {
- return true;
- }
+ if (GPIO_I2C_SCL == val) { return true; }
+ if (GPIO_I2C_SDA == val) { return true; }
+#endif
+#ifndef USE_SR04
+ if (GPIO_SR04_TRIG == val) { return true; }
+ if (GPIO_SR04_ECHO == val) { return true; }
#endif
#ifndef USE_WS2812
- if (GPIO_WS2812 == val) {
- return true;
- }
+ if (GPIO_WS2812 == val) { return true; }
#endif
#ifndef USE_IR_REMOTE
- if (GPIO_IRSEND == val) {
- return true;
- }
+ if (GPIO_IRSEND == val) { return true; }
#endif
if ((val >= GPIO_REL1) && (val < GPIO_REL1 + MAX_RELAYS)) {
offset = (GPIO_REL1_INV - GPIO_REL1);
@@ -693,21 +673,15 @@ boolean GetUsedInModule(byte val, uint8_t *arr)
offset = -(GPIO_PWM1_INV - GPIO_PWM1);
}
for (byte i = 0; i < MAX_GPIO_PIN; i++) {
- if (arr[i] == val) {
- return true;
- }
- if (arr[i] == val + offset) {
- return true;
- }
+ if (arr[i] == val) { return true; }
+ if (arr[i] == val + offset) { return true; }
}
return false;
}
void HandleModuleConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
char stemp[20];
uint8_t midx;
@@ -777,9 +751,7 @@ void HandleWifiConfiguration()
void HandleWifi(boolean scan)
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_WIFI);
@@ -818,15 +790,13 @@ void HandleWifi(boolean scan)
if (remove_duplicate_access_points) {
String cssid;
for (int i = 0; i < n; i++) {
- if (-1 == indices[i]) {
- continue;
- }
+ if (-1 == indices[i]) { continue; }
cssid = WiFi.SSID(indices[i]);
for (int j = i + 1; j < n; j++) {
if (cssid == WiFi.SSID(indices[j])) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_DUPLICATE_ACCESSPOINT " %s"), WiFi.SSID(indices[j]).c_str());
AddLog(LOG_LEVEL_DEBUG);
- indices[j] = -1; // set dup aps to index -1
+ indices[j] = -1; // set dup aps to index -1
}
}
}
@@ -834,9 +804,7 @@ void HandleWifi(boolean scan)
//display networks in page
for (int i = 0; i < n; i++) {
- if (-1 == indices[i]) {
- continue; // skip dups
- }
+ if (-1 == indices[i]) { continue; } // skip dups
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_WIFI D_SSID " %s, " D_RSSI " %d"), WiFi.SSID(indices[i]).c_str(), WiFi.RSSI(indices[i]));
AddLog(LOG_LEVEL_DEBUG);
int quality = WifiGetRssiAsQuality(WiFi.RSSI(indices[i]));
@@ -878,9 +846,7 @@ void HandleWifi(boolean scan)
void HandleMqttConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_MQTT);
String page = FPSTR(HTTP_HEAD);
@@ -903,9 +869,7 @@ void HandleMqttConfiguration()
void HandleLoggingConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_LOGGING);
String page = FPSTR(HTTP_HEAD);
@@ -952,9 +916,7 @@ void HandleLoggingConfiguration()
void HandleOtherConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_OTHER);
char stemp[40];
@@ -990,9 +952,7 @@ void HandleOtherConfiguration()
void HandleBackupConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_BACKUP_CONFIGURATION));
uint8_t buffer[sizeof(Settings)];
@@ -1018,9 +978,7 @@ void HandleBackupConfiguration()
void HandleSaveSettings()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
char stemp[TOPSZ];
char stemp2[TOPSZ];
@@ -1186,9 +1144,7 @@ void HandleSaveSettings()
void HandleResetConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
char svalue[33];
@@ -1208,9 +1164,7 @@ void HandleResetConfiguration()
void HandleRestoreConfiguration()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_RESTORE_CONFIGURATION);
String page = FPSTR(HTTP_HEAD);
@@ -1228,9 +1182,7 @@ void HandleRestoreConfiguration()
void HandleUpgradeFirmware()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_FIRMWARE_UPGRADE);
String page = FPSTR(HTTP_HEAD);
@@ -1249,9 +1201,7 @@ void HandleUpgradeFirmware()
void HandleUpgradeFirmwareStart()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
char svalue[100];
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPGRADE_STARTED));
@@ -1278,9 +1228,7 @@ void HandleUpgradeFirmwareStart()
void HandleUploadDone()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_UPLOAD_DONE));
char error[100];
@@ -1327,13 +1275,9 @@ void HandleUploadLoop()
// Based on ESP8266HTTPUpdateServer.cpp uses ESP8266WebServer Parsing.cpp and Cores Updater.cpp (Update)
boolean _serialoutput = (LOG_LEVEL_DEBUG <= seriallog_level);
- if (HTTP_USER == webserver_state) {
- return;
- }
+ if (HTTP_USER == webserver_state) { return; }
if (upload_error) {
- if (!upload_file_type) {
- Update.end();
- }
+ if (!upload_file_type) { Update.end(); }
return;
}
@@ -1408,9 +1352,7 @@ void HandleUploadLoop()
if (_serialoutput) {
Serial.printf(".");
upload_progress_dot_count++;
- if (!(upload_progress_dot_count % 80)) {
- Serial.println();
- }
+ if (!(upload_progress_dot_count % 80)) { Serial.println(); }
}
}
} else if(!upload_error && (UPLOAD_FILE_END == upload.status)) {
@@ -1419,9 +1361,7 @@ void HandleUploadLoop()
}
if (!upload_file_type) {
if (!Update.end(true)) { // true to set the size to the current progress
- if (_serialoutput) {
- Update.printError(Serial);
- }
+ if (_serialoutput) { Update.printError(Serial); }
upload_error = 6;
return;
}
@@ -1434,9 +1374,7 @@ void HandleUploadLoop()
restart_flag = 0;
MqttRetryCounter(0);
upload_error = 7;
- if (!upload_file_type) {
- Update.end();
- }
+ if (!upload_file_type) { Update.end(); }
}
delay(0);
}
@@ -1451,9 +1389,7 @@ void HandlePreflightRequest()
void HandleHttpCommand()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
char svalue[INPUT_BUFFER_SIZE]; // big to serve Backlog
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_COMMAND));
@@ -1473,12 +1409,7 @@ void HandleHttpCommand()
if (valid) {
byte curridx = web_log_index;
WebGetArg("cmnd", svalue, sizeof(svalue));
- if (strlen(svalue)) {
-// byte syslog_now = syslog_level;
-// syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT - Seems to work fine since 5.7.1d (global logging)
- ExecuteCommand(svalue);
-// syslog_level = syslog_now;
- }
+ if (strlen(svalue)) { ExecuteCommand(svalue); }
if (web_log_index != curridx) {
byte counter = curridx;
@@ -1491,9 +1422,7 @@ void HandleHttpCommand()
// [14:49:36 MQTT: stat/wemos5/RESULT = {"POWER":"OFF"}] > [{"POWER":"OFF"}]
char* JSON = (char*)memchr(tmp, '{', len);
if (JSON) { // Is it a JSON message (and not only [15:26:08 MQT: stat/wemos5/POWER = O])
- if (message.length() > 1) {
- message += F(",");
- }
+ if (message.length() > 1) { message += F(","); }
size_t JSONlen = len - (JSON - tmp);
strlcpy(mqtt_data, JSON +1, JSONlen -2);
message += mqtt_data;
@@ -1515,10 +1444,7 @@ void HandleHttpCommand()
void HandleConsole()
{
- if (HttpUser()) {
- return;
- }
-
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONSOLE);
String page = FPSTR(HTTP_HEAD);
@@ -1533,9 +1459,7 @@ void HandleConsole()
void HandleAjaxConsoleRefresh()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
char svalue[INPUT_BUFFER_SIZE]; // big to serve Backlog
byte cflg = 1;
byte counter = 0; // Initial start, should never be 0 again
@@ -1544,16 +1468,11 @@ void HandleAjaxConsoleRefresh()
if (strlen(svalue)) {
snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_COMMAND "%s"), svalue);
AddLog(LOG_LEVEL_INFO);
-// byte syslog_now = syslog_level;
-// syslog_level = 0; // Disable UDP syslog to not trigger hardware WDT - Seems to work fine since 5.7.1d (global logging)
ExecuteCommand(svalue);
-// syslog_level = syslog_now;
}
WebGetArg("c2", svalue, sizeof(svalue));
- if (strlen(svalue)) {
- counter = atoi(svalue);
- }
+ if (strlen(svalue)) { counter = atoi(svalue); }
byte last_reset_web_log_flag = reset_web_log_flag;
String message = F("}9"); // Cannot load mqtt_data here as <> will be encoded by replacements below
@@ -1580,7 +1499,7 @@ void HandleAjaxConsoleRefresh()
message += mqtt_data;
}
counter++;
- if (!counter) counter++; // Skip 0 as it is not allowed
+ if (!counter) { counter++; } // Skip 0 as it is not allowed
} while (counter != web_log_index);
// XML encoding to fix blank console log in concert with javascript decodeURIComponent
message.replace(F("%"), F("%25")); // Needs to be done first as otherwise the % in %26 will also be converted
@@ -1596,9 +1515,7 @@ void HandleAjaxConsoleRefresh()
void HandleInformation()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_INFORMATION);
char stopic[TOPSZ];
@@ -1712,9 +1629,7 @@ void HandleInformation()
void HandleRestart()
{
- if (HttpUser()) {
- return;
- }
+ if (HttpUser()) { return; }
AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_RESTART);
String page = FPSTR(HTTP_HEAD);
@@ -1738,9 +1653,7 @@ void HandleNotFound()
// snprintf_P(log_data, sizeof(log_data), PSTR(D_LOG_HTTP "Not fount (%s)"), WebServer->uri().c_str());
// AddLog(LOG_LEVEL_DEBUG);
- if (CaptivePortal()) { // If captive portal redirect instead of displaying the error page.
- return;
- }
+ if (CaptivePortal()) { return; } // If captive portal redirect instead of displaying the error page.
#ifdef USE_EMULATION
String path = WebServer->uri();
@@ -1778,9 +1691,7 @@ boolean ValidIpAddress(String str)
{
for (uint16_t i = 0; i < str.length(); i++) {
int c = str.charAt(i);
- if (c != '.' && (c < '0' || c > '9')) {
- return false;
- }
+ if (c != '.' && (c < '0' || c > '9')) { return false; }
}
return true;
}
diff --git a/sonoff/xsns_22_sr04.ino b/sonoff/xsns_22_sr04.ino
new file mode 100644
index 000000000..5a3a7dc87
--- /dev/null
+++ b/sonoff/xsns_22_sr04.ino
@@ -0,0 +1,173 @@
+/*
+ xsns_22_sr04.ino - SR04 ultrasonic sensor support for Sonoff-Tasmota
+
+ Copyright (C) 2018 Nuno Ferreira and Theo Arends
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifdef USE_SR04
+/*********************************************************************************************\
+ * HC-SR04, HC-SR04+, JSN-SR04T - Ultrasonic distance sensor
+ *
+ * Code for SR04 family of ultrasonic distance sensors
+ * References:
+ * - https://www.dfrobot.com/wiki/index.php/Weather-proof_Ultrasonic_Sensor_SKU_:_SEN0207
+\*********************************************************************************************/
+#define max(a,b) ((a)>(b)?(a):(b))
+
+uint8_t sr04_echo_pin = 0;
+uint8_t sr04_trig_pin = 0;
+
+/*********************************************************************************************\
+ * Embedded stripped and tuned NewPing library from Tim Eckel - teckel@leethost.com
+ * https://bitbucket.org/teckel12/arduino-new-ping
+\*********************************************************************************************/
+#define US_ROUNDTRIP_CM 58 // Microseconds (uS) it takes sound to travel round-trip 1cm (2cm total), uses integer to save compiled code space. Default: 58
+#define US_ROUNDTRIP_IN 148 // Microseconds (uS) it takes sound to travel round-trip 1 inch (2 inches total), uses integer to save compiled code space. Default: 148
+#define PING_MEDIAN_DELAY 29000
+#define MAX_SENSOR_DISTANCE 500
+#define PING_OVERHEAD 5
+
+// Conversion from uS to distance (round result to nearest cm or inch).
+#define EchoConvert(echoTime, conversionFactor) (max(((unsigned int)echoTime + conversionFactor / 2) / conversionFactor, (echoTime ? 1 : 0)))
+
+/********************************************************************************************/
+
+void Sr04Init()
+{
+ sr04_echo_pin = pin[GPIO_SR04_ECHO];
+ sr04_trig_pin = pin[GPIO_SR04_TRIG];
+ pinMode(sr04_trig_pin, OUTPUT);
+ pinMode(sr04_echo_pin, INPUT_PULLUP);
+}
+
+boolean Sr04Read(uint16_t *distance)
+{
+ uint16_t duration = 0;
+
+ *distance = 0;
+
+ /* Send ping and get delay */
+ duration = Sr04GetSamples(9, 250);
+
+ /* Calculate the distance (in cm) based on the speed of sound. */
+ *distance = EchoConvert(duration, US_ROUNDTRIP_CM);
+
+ return 1;
+}
+
+uint16_t Sr04Ping(uint16_t max_cm_distance)
+{
+ uint16_t duration = 0;
+ uint16_t maxEchoTime, maxTime;
+
+ maxEchoTime = min(max_cm_distance + 1, (uint16_t) MAX_SENSOR_DISTANCE + 1) * US_ROUNDTRIP_CM;
+
+ /* The following trigPin/echoPin cycle is used to determine the
+ distance of the nearest object by bouncing soundwaves off of it. */
+ digitalWrite(sr04_trig_pin, LOW);
+ delayMicroseconds(2);
+ digitalWrite(sr04_trig_pin, HIGH);
+ delayMicroseconds(10);
+ digitalWrite(sr04_trig_pin, LOW);
+
+ /* Wait for the echo */
+ duration = pulseIn(sr04_echo_pin, HIGH, 26000) - PING_OVERHEAD;
+
+ return (duration > maxEchoTime) ? 0 : duration;
+}
+
+uint16_t Sr04GetSamples(uint8_t it, uint16_t max_cm_distance) {
+ uint16_t uS[it];
+ uint16_t last;
+ uint8_t j;
+ uint8_t i = 0;
+ uint16_t t;
+ uS[0] = 0;
+
+ while (i < it) {
+ t = micros();
+ last = Sr04Ping(max_cm_distance);
+
+ if (last != 0) {
+ if (i > 0) {
+ for (j = i; j > 0 && uS[j - 1] < last; j--) {
+ uS[j] = uS[j - 1];
+ }
+ } else {
+ j = 0;
+ }
+ uS[j] = last;
+ i++;
+ } else {
+ it--;
+ }
+ if (i < it && micros() - t < PING_MEDIAN_DELAY) {
+ delay((PING_MEDIAN_DELAY + t - micros()) / 1000);
+ }
+ }
+
+ return (uS[1]); // Return the ping distance from the 2nd highest reading
+}
+
+#ifdef USE_WEBSERVER
+const char HTTP_SNS_DISTANCE[] PROGMEM =
+ "%s{s}SR04 " D_DISTANCE "{m}%d" D_UNIT_CENTIMETER "{e}"; // {s} =
, {m} = | , {e} = |
+#endif // USE_WEBSERVER
+
+void Sr04Show(boolean json)
+{
+ uint16_t distance;
+
+ if (Sr04Read(&distance)) { // Check if read failed
+ if(json) {
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"SR04\":{\"" D_JSON_DISTANCE "\":%d}"), mqtt_data, distance);
+#ifdef USE_WEBSERVER
+ } else {
+ snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_DISTANCE, mqtt_data, distance);
+#endif // USE_WEBSERVER
+ }
+ }
+}
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+#define XSNS_22
+
+boolean Xsns22(byte function)
+{
+ boolean result = false;
+
+ if ((pin[GPIO_SR04_ECHO] < 99) && (pin[GPIO_SR04_TRIG] < 99)) {
+ switch (function) {
+ case FUNC_INIT:
+ Sr04Init();
+ break;
+ case FUNC_JSON_APPEND:
+ Sr04Show(1);
+ break;
+#ifdef USE_WEBSERVER
+ case FUNC_WEB_APPEND:
+ Sr04Show(0);
+ break;
+#endif // USE_WEBSERVER
+ }
+ }
+ return result;
+}
+
+#endif // USE_SR04