diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs
index 611faf1..e0f4552 100644
--- a/.settings/org.eclipse.cdt.core.prefs
+++ b/.settings/org.eclipse.cdt.core.prefs
@@ -184,10 +184,10 @@ environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.DTS
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.DTS/value=0
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.LOCAL/delimiter=\:
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.LOCAL/operation=replace
-environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.LOCAL/value=1516881551
+environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.LOCAL/value=1517307730
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.UTC/delimiter=\:
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.UTC/operation=replace
-environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.UTC/value=1516877951
+environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.UTC/value=1517304130
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.ZONE/delimiter=\:
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.ZONE/operation=replace
environment/project/io.sloeber.core.toolChain.release.547546691/A.EXTRA.TIME.ZONE/value=3600
@@ -466,10 +466,10 @@ environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.BOARD_NAM
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.BOARD_NAME/value=NodeMCU 1.0 (ESP-12E Module)
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.COM_PORT/delimiter=\:
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.COM_PORT/operation=replace
-environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.COM_PORT/value=/dev/ttyUSB1
+environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.COM_PORT/value=/dev/ttyUSB0
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.ECLIPSE_LOCATION/delimiter=\:
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.ECLIPSE_LOCATION/operation=replace
-environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.ECLIPSE_LOCATION/value=${eclipse_home}////////////////////////////////
+environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.ECLIPSE_LOCATION/value=${eclipse_home}/////////////////////////////////////
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.EXTRA.ALL/delimiter=\:
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.EXTRA.ALL/operation=replace
environment/project/io.sloeber.core.toolChain.release.547546691/JANTJE.EXTRA.ALL/value=
diff --git a/ConfigGenerator/configGen.py b/ConfigGenerator/configGen.py
index 0a6576d..988cc9d 100644
--- a/ConfigGenerator/configGen.py
+++ b/ConfigGenerator/configGen.py
@@ -18,7 +18,8 @@ configItems = [
{"label":"DebugMode", "key":"debugMode", "type":"I", "default":0},
{"label":"MQTT DebugTopic", "key":"mqttDebugTopic", "type":"C", "length":64, "default":"IoT/TouchSwitch/Debug"},
{"label":"Period", "key":"period", "type":"I", "default":500},
- {"label":"Threshold", "key":"threshold", "type":"I", "default":350}
+ {"label":"CalibrationTimeout", "key":"calibrationTimeout", "type":"I", "default":20000},
+ {"label":"Threshold", "key":"threshold", "type":"I", "default":10}
]
diff --git a/configuration.cpp b/configuration.cpp
index b7728f6..9a890fc 100644
--- a/configuration.cpp
+++ b/configuration.cpp
@@ -29,7 +29,8 @@ void configServeIndex() {
configBlock.debugMode = 0;
strcpy(configBlock.mqttDebugTopic, "IoT/TouchSwitch/Debug");
configBlock.period = 500;
- configBlock.threshold = 350;
+ configBlock.calibrationTimeout = 20000;
+ configBlock.threshold = 10;
}
String buffer =
@@ -207,6 +208,20 @@ void configServeIndex() {
buffer += configBlock.period;
buffer += "\"";
+ buffer +=
+ " />"
+ " "
+ " "
+ "
"
+ " "
+ " "
+ " | "
+ " "
" | "
@@ -268,6 +283,8 @@ void configServeGetConfiguration() {
strcpy(configBlock.mqttDebugTopic, arg.c_str());
arg = webServer.arg("period");
configBlock.period = atoi(arg.c_str());
+ arg = webServer.arg("calibrationTimeout");
+ configBlock.calibrationTimeout = atoi(arg.c_str());
arg = webServer.arg("threshold");
configBlock.threshold = atoi(arg.c_str());
@@ -326,6 +343,9 @@ void showConfiguration() {
Serial.print("period = ");
Serial.println(configBlock.period);
+ Serial.print("calibrationTimeout = ");
+ Serial.println(configBlock.calibrationTimeout);
+
Serial.print("threshold = ");
Serial.println(configBlock.threshold);
diff --git a/configuration.h b/configuration.h
index 6421fca..c1c4487 100644
--- a/configuration.h
+++ b/configuration.h
@@ -11,6 +11,7 @@ typedef struct {
uint32_t debugMode;
char mqttDebugTopic[64];
uint32_t period;
+ uint32_t calibrationTimeout;
uint32_t threshold;
} tConfigBlock;
diff --git a/defines.h b/defines.h
index 24759f9..072674d 100644
--- a/defines.h
+++ b/defines.h
@@ -16,8 +16,8 @@
#define CONFIG_SWITCH 4
#define LED_PIN 14
-#define TOUCH_PIN_HIGH 16
-#define TOUCH_PIN_LOW 5
+#define TOUCH_PIN_RECEIVE 16
+#define TOUCH_PIN_SEND 5
diff --git a/productionMode.cpp b/productionMode.cpp
index cff9c9b..c81ad06 100644
--- a/productionMode.cpp
+++ b/productionMode.cpp
@@ -18,10 +18,11 @@
#include "configuration.h"
-
typedef enum { NOT_PRESSED, PRESSED, LONG_PRESSED_PREPARE, LONG_PRESSED } tPressedState;
+
+
WiFiClientSecure espClient;
PubSubClient client(espClient);
@@ -98,61 +99,66 @@ void mqtt_connect() {
void setupProduction() {
setup_wifi();
client.setServer(configBlock.mqttBroker, configBlock.mqttPort);
- pinMode(A0, INPUT);
}
void loopProduction() {
- static tPressedState state = NOT_PRESSED;
- static uint32_t lastMillis = 0;
mqtt_connect();
+ // discharge
+ digitalWrite(TOUCH_PIN_SEND, LOW);
+ pinMode(TOUCH_PIN_SEND, OUTPUT);
+ digitalWrite(TOUCH_PIN_RECEIVE, LOW);
+ pinMode(TOUCH_PIN_RECEIVE, OUTPUT);
- // http://www.elektronik-labor.de/AVR/Touch.html
- // Phase 1
- pinMode(TOUCH_PIN_HIGH, INPUT);
- pinMode(TOUCH_PIN_LOW, INPUT);
+ // sense
+ pinMode(TOUCH_PIN_RECEIVE, INPUT);
+ digitalWrite(TOUCH_PIN_SEND, HIGH);
- // Phase 2
- digitalWrite(TOUCH_PIN_HIGH, HIGH);
- pinMode(TOUCH_PIN_HIGH, OUTPUT);
+ const uint32_t MAX_CHARGE_CNT = 1000;
+ static uint32_t senseCnt = 0;
+ static uint32_t chargeCntSum = 0;
- // Phase 3
- pinMode(TOUCH_PIN_HIGH, INPUT);
+ uint32_t chargeCnt = 0;
- // Phase 4
- digitalWrite(TOUCH_PIN_LOW, LOW);
- pinMode(TOUCH_PIN_LOW, OUTPUT);
+ noInterrupts();
+ while ((! digitalRead(TOUCH_PIN_RECEIVE)) && (chargeCnt < MAX_CHARGE_CNT)) {
+ chargeCnt++;
+ }
+ interrupts();
+ chargeCntSum += chargeCnt;
+ senseCnt++;
+ static uint32_t lastMillis = 0;
uint32_t currentMillis = millis();
+ static uint32_t lastCalibration = 0;
+
if (currentMillis - lastMillis > configBlock.period) {
lastMillis = currentMillis;
- int v = analogRead(A0);
+ uint32_t chargeCntAvg = chargeCntSum / senseCnt;
+
+ static uint32_t baseline = UINT32_MAX;
+ if (chargeCntAvg < baseline) {
+ baseline = chargeCntAvg;
+ }
+
+ uint32_t capNum = chargeCntAvg - baseline;
if (configBlock.debugMode) {
char payload[128];
- snprintf(payload, 127, "%ld", v);
+ snprintf(payload, 127, "%ld %ld %ld %ld", senseCnt, baseline, chargeCntAvg, capNum);
client.publish(configBlock.mqttDebugTopic, payload);
-
-#ifdef DEBUG
- Serial.println(v);
-#endif
}
- if (v > configBlock.threshold) {
+ static tPressedState state = NOT_PRESSED;
+ if (capNum > configBlock.threshold) {
#ifdef DEBUG
- Serial.println(v);
+ Serial.println(capNum);
#endif
- // discharge
- digitalWrite(TOUCH_PIN_HIGH, LOW);
- pinMode(TOUCH_PIN_HIGH, OUTPUT);
- digitalWrite(TOUCH_PIN_LOW, LOW);
- pinMode(TOUCH_PIN_LOW, OUTPUT);
-
switch (state) {
case NOT_PRESSED:
state = PRESSED;
@@ -170,6 +176,11 @@ void loopProduction() {
break;
}
} else {
+ if (currentMillis - lastCalibration > configBlock.calibrationTimeout) {
+ baseline = UINT32_MAX;
+ lastCalibration = currentMillis;
+ }
+
switch (state) {
case NOT_PRESSED:
break;
@@ -184,9 +195,9 @@ void loopProduction() {
state = NOT_PRESSED;
}
+ chargeCntSum = 0;
+ senseCnt = 0;
}
-
-
}