Added led for signalling change

This commit is contained in:
Ard Kuijpers
2020-02-28 23:41:02 +01:00
parent f19bc85a86
commit b7c3e47e28
2 changed files with 86 additions and 29 deletions

View File

@@ -29,8 +29,8 @@ class MQTTHelper {
String getIdentifier() { return _identifier; } String getIdentifier() { return _identifier; }
String getTopic(String sensor) { String getTopic(String node) {
return _group + "/" + _identifier + "/" + sensor; return _group + "/" + _identifier + "/" + node;
} }
void Configure(IPAddress server, uint16 port) { void Configure(IPAddress server, uint16 port) {

View File

@@ -7,10 +7,19 @@
#include <ESP8266WebServer.h> #include <ESP8266WebServer.h>
#include <WiFiManager.h> #include <WiFiManager.h>
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <NewPing.h>
#define TURN_ON LOW #define TURN_ON LOW
#define TURN_OFF HIGH #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 { struct Config {
IPAddress mqtt_server = {192, 168, 249, 5}; IPAddress mqtt_server = {192, 168, 249, 5};
uint16 mqtt_port = 1883; uint16 mqtt_port = 1883;
@@ -18,8 +27,10 @@ struct Config {
MQTTHelper mqtt; MQTTHelper mqtt;
#define heartbeatMillis 10000 NewPing sonar(trigPin,echoPin,maxDistance*100.0);
#define messageMillis 1000
#define heartbeatMillis 5000
#define messageMillis 5000
//flag for saving data //flag for saving data
bool shouldSaveConfig = false; bool shouldSaveConfig = false;
@@ -29,19 +40,21 @@ void saveConfigCallback () {
shouldSaveConfig = true; shouldSaveConfig = true;
} }
void heartbeat(int times = 3); void signal_led(bool ons = true);
void longbeat(); void heartbeat_led(int times = 2);
void longbeat_led();
void setup_wifi(String ssid, String password); void setup_wifi(String ssid, String password);
void reconnect(); void reconnect();
void readConfig(); void readConfig();
void saveConfig(); void saveConfig();
float readDistance();
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
Serial.println(); Serial.println();
randomSeed(analogRead(0)); randomSeed(analogRead(0));
pinMode(LED_BUILTIN, OUTPUT); pinMode(ledPin, OUTPUT);
pinMode(LED_BUILTIN, TURN_OFF); digitalWrite(ledPin, TURN_OFF);
//clean FS, for testing //clean FS, for testing
//SPIFFS.format(); //SPIFFS.format();
@@ -70,12 +83,16 @@ void setup() {
long lastMessage = 0; long lastMessage = 0;
long lastHeartbeat = 0; long lastHeartbeat = 0;
float distance = 0.0; float oldDistance = 0.0;
float diff = 4.0; float diff = 4.0;
bool checkBound(float newValue, float prevValue, float maxDiff) { bool checkBounds(float value, float min, float max) {
return !isnan(newValue) && return !isnan(value) &&
(newValue < prevValue + maxDiff || newValue > prevValue - maxDiff); (value >= min && value <= max);
}
bool signalChange(float distance, float oldDistance) {
return fabs(distance - oldDistance) > minimumChange;
} }
void loop() { void loop() {
@@ -84,24 +101,55 @@ void loop() {
long now = millis(); long now = millis();
if (now - lastHeartbeat > heartbeatMillis) { if (now - lastHeartbeat > heartbeatMillis) {
lastHeartbeat = now; lastHeartbeat = now;
heartbeat(); heartbeat_led();
} }
if (now - lastMessage > messageMillis) { if (now - lastMessage > messageMillis) {
lastMessage = now; lastMessage = now;
float newDistance = random(5,400)/100.0; float distance = readDistance();
// Serial.print("New distance:"); //float distance = random(5,400)/100.0;
// Serial.println(String(newDistance).c_str()); // Serial.print("Distance read:");
// Serial.print(int(distance*1000));
// Serial.println(" mm");
if (checkBound(newDistance, distance, diff)) { if (checkBounds(distance, 0, maxDistance)) {
distance = newDistance; String node = "distance";
auto sensorName = "distance"; Serial.println(mqtt.getTopic(node)+" = "+String(distance));
Serial.print(mqtt.getTopic(sensorName)); mqtt.publish(node, distance);
Serial.println(" = "+String(distance));
mqtt.publish("distance", 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() { void readConfig() {
@@ -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<times; blink++) for (int blink=0; blink<times; blink++)
{ {
digitalWrite(LED_BUILTIN, TURN_ON); signal_led(true);
delay(20); delay(10);
digitalWrite(LED_BUILTIN, TURN_OFF); signal_led(false);
delay(200); delay(200);
} }
} }
void longbeat() void longbeat_led()
{ {
digitalWrite(LED_BUILTIN, TURN_ON); signal_led(true);
delay(500); delay(500);
digitalWrite(LED_BUILTIN, TURN_OFF); signal_led(false);
} }