From 1147656d472925ed6b026474a7e81b486031ce9d Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Tue, 30 Jan 2018 13:26:26 +0100 Subject: [PATCH] other sensing mechanism, schematic still needs to be adjusted, works so far --- .settings/org.eclipse.cdt.core.prefs | 8 +-- ConfigGenerator/configGen.py | 3 +- configuration.cpp | 22 +++++++- configuration.h | 1 + defines.h | 4 +- productionMode.cpp | 75 ++++++++++++++++------------ 6 files changed, 73 insertions(+), 40 deletions(-) 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; } - - }