diff --git a/ConfigGenerator/configGen.py b/ConfigGenerator/configGen.py
index 988cc9d..59240de 100644
--- a/ConfigGenerator/configGen.py
+++ b/ConfigGenerator/configGen.py
@@ -13,17 +13,20 @@ configItems = [
{"label":"MQTT Username", "key":"mqttUser", "type":"C", "length":32, "default":"TouchSwitch"},
{"label":"MQTT Password", "key":"mqttPass", "type":"C", "length":32, "default":"geheim123"},
{"label":"MQTT ClientId", "key":"mqttClientId", "type":"C", "length":32, "default":"TouchSwitch"},
- {"label":"MQTT Topic", "key":"mqttTopic", "type":"C", "length":64, "default":"IoT/TouchSwitch/Press"},
{"label":"MQTT Port", "key":"mqttPort", "type":"I", "default":8883},
- {"label":"DebugMode", "key":"debugMode", "type":"I", "default":0},
+ {"label":"MQTT Topic", "key":"mqttTopic", "type":"C", "length":64, "default":"IoT/TouchSwitch/Press"},
{"label":"MQTT DebugTopic", "key":"mqttDebugTopic", "type":"C", "length":64, "default":"IoT/TouchSwitch/Debug"},
+ {"label":"MQTT BaselineTopic", "key":"mqttBaselineTopic", "type":"C", "length":64, "default":"IoT/TouchSwitch/Baseline"},
+ {"label":"DebugMode", "key":"debugMode", "type":"I", "default":0},
{"label":"Period", "key":"period", "type":"I", "default":500},
{"label":"CalibrationTimeout", "key":"calibrationTimeout", "type":"I", "default":20000},
{"label":"Threshold", "key":"threshold", "type":"I", "default":10}
]
-h_file = Template(file="configuration_h.tmpl", searchList=[{"configItems":configItems}])
+magic = 0xC0DE0002
+
+h_file = Template(file="configuration_h.tmpl", searchList=[{"magic":magic, "configItems":configItems}])
open('configuration.h','w').write(str(h_file))
-c_file = Template(file="configuration_c.tmpl", searchList=[{"configItems":configItems}])
+c_file = Template(file="configuration_c.tmpl", searchList=[{"magic":magic, "configItems":configItems}])
open('configuration.cpp','w').write(str(c_file))
diff --git a/ConfigGenerator/configuration_c.tmpl b/ConfigGenerator/configuration_c.tmpl
index eb5f172..ce3547a 100644
--- a/ConfigGenerator/configuration_c.tmpl
+++ b/ConfigGenerator/configuration_c.tmpl
@@ -11,7 +11,7 @@
tConfigBlock configBlock;
-const uint32_t MAGIC = 0xC0DE0001;
+const uint32_t MAGIC = $magic;
extern ESP8266WebServer webServer;
bool configSaved = false;
diff --git a/configuration.cpp b/configuration.cpp
index 9a890fc..9ae46a3 100644
--- a/configuration.cpp
+++ b/configuration.cpp
@@ -9,7 +9,7 @@
tConfigBlock configBlock;
-const uint32_t MAGIC = 0xC0DE0001;
+const uint32_t MAGIC = 3235774466;
extern ESP8266WebServer webServer;
bool configSaved = false;
@@ -24,10 +24,11 @@ void configServeIndex() {
strcpy(configBlock.mqttUser, "TouchSwitch");
strcpy(configBlock.mqttPass, "geheim123");
strcpy(configBlock.mqttClientId, "TouchSwitch");
- strcpy(configBlock.mqttTopic, "IoT/TouchSwitch/Press");
configBlock.mqttPort = 8883;
- configBlock.debugMode = 0;
+ strcpy(configBlock.mqttTopic, "IoT/TouchSwitch/Press");
strcpy(configBlock.mqttDebugTopic, "IoT/TouchSwitch/Debug");
+ strcpy(configBlock.mqttBaselineTopic, "IoT/TouchSwitch/Baseline");
+ configBlock.debugMode = 0;
configBlock.period = 500;
configBlock.calibrationTimeout = 20000;
configBlock.threshold = 10;
@@ -136,6 +137,20 @@ void configServeIndex() {
buffer += configBlock.mqttClientId;
buffer += "\"";
+ buffer +=
+ " />"
+ " "
+ " "
+ "
"
+ " "
+ " "
+ " | "
+ " "
" | "
@@ -157,12 +172,28 @@ void configServeIndex() {
"
"
" "
" "
- " "
+ " "
" | "
- " "
+ " | "
+ "
"
+ " "
+ " "
+ " "
+ " | "
+ " "
- " | "
- "
"
- " "
- " "
- " "
- " | "
- " "
" | "
@@ -273,14 +289,16 @@ void configServeGetConfiguration() {
strcpy(configBlock.mqttPass, arg.c_str());
arg = webServer.arg("mqttClientId");
strcpy(configBlock.mqttClientId, arg.c_str());
- arg = webServer.arg("mqttTopic");
- strcpy(configBlock.mqttTopic, arg.c_str());
arg = webServer.arg("mqttPort");
configBlock.mqttPort = atoi(arg.c_str());
- arg = webServer.arg("debugMode");
- configBlock.debugMode = atoi(arg.c_str());
+ arg = webServer.arg("mqttTopic");
+ strcpy(configBlock.mqttTopic, arg.c_str());
arg = webServer.arg("mqttDebugTopic");
strcpy(configBlock.mqttDebugTopic, arg.c_str());
+ arg = webServer.arg("mqttBaselineTopic");
+ strcpy(configBlock.mqttBaselineTopic, arg.c_str());
+ arg = webServer.arg("debugMode");
+ configBlock.debugMode = atoi(arg.c_str());
arg = webServer.arg("period");
configBlock.period = atoi(arg.c_str());
arg = webServer.arg("calibrationTimeout");
@@ -328,18 +346,21 @@ void showConfiguration() {
Serial.print("mqttClientId = ");
Serial.println(configBlock.mqttClientId);
- Serial.print("mqttTopic = ");
- Serial.println(configBlock.mqttTopic);
-
Serial.print("mqttPort = ");
Serial.println(configBlock.mqttPort);
- Serial.print("debugMode = ");
- Serial.println(configBlock.debugMode);
+ Serial.print("mqttTopic = ");
+ Serial.println(configBlock.mqttTopic);
Serial.print("mqttDebugTopic = ");
Serial.println(configBlock.mqttDebugTopic);
+ Serial.print("mqttBaselineTopic = ");
+ Serial.println(configBlock.mqttBaselineTopic);
+
+ Serial.print("debugMode = ");
+ Serial.println(configBlock.debugMode);
+
Serial.print("period = ");
Serial.println(configBlock.period);
diff --git a/configuration.h b/configuration.h
index c1c4487..b593a0c 100644
--- a/configuration.h
+++ b/configuration.h
@@ -6,10 +6,11 @@ typedef struct {
char mqttUser[32];
char mqttPass[32];
char mqttClientId[32];
- char mqttTopic[64];
uint32_t mqttPort;
- uint32_t debugMode;
+ char mqttTopic[64];
char mqttDebugTopic[64];
+ char mqttBaselineTopic[64];
+ uint32_t debugMode;
uint32_t period;
uint32_t calibrationTimeout;
uint32_t threshold;
diff --git a/productionMode.cpp b/productionMode.cpp
index 29bf415..53cc470 100644
--- a/productionMode.cpp
+++ b/productionMode.cpp
@@ -10,7 +10,9 @@
#define MQTT_MAX_PACKET_SIZE 256
-
+#include
+#include
+#include
#include
#include
#include
@@ -18,7 +20,6 @@
#include "configuration.h"
-typedef enum { NOT_PRESSED, PRESSED, LONG_PRESSED_PREPARE, LONG_PRESSED } tPressedState;
@@ -26,9 +27,6 @@ typedef enum { NOT_PRESSED, PRESSED, LONG_PRESSED_PREPARE, LONG_PRESSED } tPress
WiFiClientSecure espClient;
PubSubClient client(espClient);
-extern uint32_t startTime;
-
-
void setup_wifi() {
delay(10);
WiFi.mode(WIFI_STA);
@@ -88,11 +86,14 @@ void reconnect() {
}
-void mqtt_connect() {
+bool mqtt_connect() {
+ bool reconnected = false;
if (!client.connected()) {
reconnect();
+ reconnected = true;
}
client.loop();
+ return reconnected;
}
@@ -103,8 +104,11 @@ void setupProduction() {
void loopProduction() {
- mqtt_connect();
+ bool reconnected = mqtt_connect();
+
+
+ noInterrupts();
// discharge
digitalWrite(TOUCH_PIN_SEND, LOW);
pinMode(TOUCH_PIN_SEND, OUTPUT);
@@ -116,26 +120,24 @@ void loopProduction() {
digitalWrite(TOUCH_PIN_SEND, HIGH);
const uint32_t MAX_CHARGE_CNT = 1000;
- static uint32_t senseCnt = 0;
- static uint32_t chargeCntSum = 0;
-
uint32_t chargeCnt = 0;
- noInterrupts();
while ((! digitalRead(TOUCH_PIN_RECEIVE)) && (chargeCnt < MAX_CHARGE_CNT)) {
chargeCnt++;
}
interrupts();
+ static uint32_t senseCnt = 0;
+ static uint32_t chargeCntSum = 0;
+
chargeCntSum += chargeCnt;
senseCnt++;
static uint32_t lastMillis = 0;
uint32_t currentMillis = millis();
- static uint32_t lastCalibration = 0;
- if (currentMillis - lastMillis > configBlock.period) {
+ if ((currentMillis - lastMillis > configBlock.period) && (! reconnected)) {
lastMillis = currentMillis;
uint32_t chargeCntAvg = chargeCntSum / senseCnt;
@@ -143,6 +145,10 @@ void loopProduction() {
static uint32_t baseline = UINT32_MAX;
if (chargeCntAvg < baseline) {
baseline = chargeCntAvg;
+
+ char payload[128];
+ snprintf(payload, 127, "%ld", baseline);
+ client.publish(configBlock.mqttBaselineTopic, payload);
}
uint32_t capNum = chargeCntAvg - baseline;
@@ -153,7 +159,10 @@ void loopProduction() {
client.publish(configBlock.mqttDebugTopic, payload);
}
- static tPressedState state = NOT_PRESSED;
+ chargeCntSum = 0;
+ senseCnt = 0;
+
+ static enum { NOT_PRESSED, PRESSED, LONG_SHORT_GAP_1, LONG_SHORT_GAP_2, LONG_PRESSED } state = NOT_PRESSED;
if (capNum > configBlock.threshold) {
#ifdef DEBUG
char payload[128];
@@ -166,9 +175,12 @@ void loopProduction() {
state = PRESSED;
break;
case PRESSED:
- state = LONG_PRESSED_PREPARE;
+ state = LONG_SHORT_GAP_1;
break;
- case LONG_PRESSED_PREPARE:
+ case LONG_SHORT_GAP_1:
+ state = LONG_SHORT_GAP_2;
+ break;
+ case LONG_SHORT_GAP_2:
state = LONG_PRESSED;
client.publish(configBlock.mqttTopic, "LONG_BEGIN");
break;
@@ -178,6 +190,7 @@ void loopProduction() {
break;
}
} else {
+ static uint32_t lastCalibration = 0;
if (currentMillis - lastCalibration > configBlock.calibrationTimeout) {
baseline = UINT32_MAX;
lastCalibration = currentMillis;
@@ -187,7 +200,8 @@ void loopProduction() {
case NOT_PRESSED:
break;
case PRESSED:
- case LONG_PRESSED_PREPARE:
+ case LONG_SHORT_GAP_1:
+ case LONG_SHORT_GAP_2:
client.publish(configBlock.mqttTopic, "SHORT");
break;
case LONG_PRESSED:
@@ -196,9 +210,6 @@ void loopProduction() {
}
state = NOT_PRESSED;
}
-
- chargeCntSum = 0;
- senseCnt = 0;
}
}