From b7c3e47e2870852394897a4c2a4ebcd14b2ac8ec Mon Sep 17 00:00:00 2001 From: Ard Kuijpers Date: Fri, 28 Feb 2020 23:41:02 +0100 Subject: [PATCH] Added led for signalling change --- include/MQTTHelper.h | 4 +- src/main.cpp | 111 ++++++++++++++++++++++++++++++++----------- 2 files changed, 86 insertions(+), 29 deletions(-) diff --git a/include/MQTTHelper.h b/include/MQTTHelper.h index 98f18b9..29350d5 100644 --- a/include/MQTTHelper.h +++ b/include/MQTTHelper.h @@ -29,8 +29,8 @@ class MQTTHelper { String getIdentifier() { return _identifier; } - String getTopic(String sensor) { - return _group + "/" + _identifier + "/" + sensor; + String getTopic(String node) { + return _group + "/" + _identifier + "/" + node; } void Configure(IPAddress server, uint16 port) { diff --git a/src/main.cpp b/src/main.cpp index ed890f1..af38e0f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,10 +7,19 @@ #include #include #include +#include #define TURN_ON LOW #define TURN_OFF HIGH +const int trigPin = D1; //D6 +const int echoPin = D2; //D5 +const int ledPin = LED_BUILTIN; //D1 +const float maxDistance = 4.0; +const float minimumChange = 0.2; +const int updateInterval_ms = 1; // s +const int ledInterval_ms = 5; // s + struct Config { IPAddress mqtt_server = {192, 168, 249, 5}; uint16 mqtt_port = 1883; @@ -18,8 +27,10 @@ struct Config { MQTTHelper mqtt; -#define heartbeatMillis 10000 -#define messageMillis 1000 +NewPing sonar(trigPin,echoPin,maxDistance*100.0); + +#define heartbeatMillis 5000 +#define messageMillis 5000 //flag for saving data bool shouldSaveConfig = false; @@ -29,19 +40,21 @@ void saveConfigCallback () { shouldSaveConfig = true; } -void heartbeat(int times = 3); -void longbeat(); +void signal_led(bool ons = true); +void heartbeat_led(int times = 2); +void longbeat_led(); void setup_wifi(String ssid, String password); void reconnect(); void readConfig(); void saveConfig(); +float readDistance(); void setup() { Serial.begin(115200); Serial.println(); randomSeed(analogRead(0)); - pinMode(LED_BUILTIN, OUTPUT); - pinMode(LED_BUILTIN, TURN_OFF); + pinMode(ledPin, OUTPUT); + digitalWrite(ledPin, TURN_OFF); //clean FS, for testing //SPIFFS.format(); @@ -70,12 +83,16 @@ void setup() { long lastMessage = 0; long lastHeartbeat = 0; -float distance = 0.0; +float oldDistance = 0.0; float diff = 4.0; -bool checkBound(float newValue, float prevValue, float maxDiff) { - return !isnan(newValue) && - (newValue < prevValue + maxDiff || newValue > prevValue - maxDiff); +bool checkBounds(float value, float min, float max) { + return !isnan(value) && + (value >= min && value <= max); +} + +bool signalChange(float distance, float oldDistance) { + return fabs(distance - oldDistance) > minimumChange; } void loop() { @@ -84,26 +101,57 @@ void loop() { long now = millis(); if (now - lastHeartbeat > heartbeatMillis) { lastHeartbeat = now; - heartbeat(); + heartbeat_led(); } if (now - lastMessage > messageMillis) { lastMessage = now; - float newDistance = random(5,400)/100.0; - // Serial.print("New distance:"); - // Serial.println(String(newDistance).c_str()); + float distance = readDistance(); + //float distance = random(5,400)/100.0; + // Serial.print("Distance read:"); + // Serial.print(int(distance*1000)); + // Serial.println(" mm"); - if (checkBound(newDistance, distance, diff)) { - distance = newDistance; - auto sensorName = "distance"; - Serial.print(mqtt.getTopic(sensorName)); - Serial.println(" = "+String(distance)); - mqtt.publish("distance", distance); + if (checkBounds(distance, 0, maxDistance)) { + String node = "distance"; + Serial.println(mqtt.getTopic(node)+" = "+String(distance)); + mqtt.publish(node, distance); + + bool signal = signalChange(distance, oldDistance); + node = "signal"; + Serial.println(mqtt.getTopic(node)+" = "+String(signal)); + mqtt.publish(node, signal); + if (signal) + signal_led(); } + + oldDistance = distance; } } +float getEchoTime() { + // Clears the trigPin + digitalWrite(trigPin, LOW); + delayMicroseconds(2); + + // Sets the trigPin on HIGH state for 10 micro seconds + digitalWrite(trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(trigPin, LOW); + + // Reads the echoPin, returns the sound wave travel time in microseconds + return pulseIn(echoPin, HIGH); +} + +float readDistance() { + //auto ping_us = getEchoTime(); + auto ping_us = sonar.ping(); + // Calculating the distance @ 10 °C from d = t_ping /2 * c => t_ping /2 * 337 [m/s] => t_ping_us / 1e-6 * 1/2 * 337 + auto computedDistance = ping_us*0.0001685; + return computedDistance; +} + void readConfig() { //read configuration from FS json Serial.println("mounting FS..."); @@ -158,20 +206,29 @@ void saveConfig() { } } -void heartbeat(int times) + +void signal_led(bool on) +{ + if (on) + digitalWrite(ledPin, TURN_ON); + else + digitalWrite(ledPin, TURN_OFF); +} + +void heartbeat_led(int times) { for (int blink=0; blink