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 getTopic(String sensor) {
return _group + "/" + _identifier + "/" + sensor;
String getTopic(String node) {
return _group + "/" + _identifier + "/" + node;
}
void Configure(IPAddress server, uint16 port) {

View File

@@ -7,10 +7,19 @@
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <ArduinoJson.h>
#include <NewPing.h>
#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,24 +101,55 @@ 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() {
@@ -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++)
{
digitalWrite(LED_BUILTIN, TURN_ON);
delay(20);
digitalWrite(LED_BUILTIN, TURN_OFF);
signal_led(true);
delay(10);
signal_led(false);
delay(200);
}
}
void longbeat()
void longbeat_led()
{
digitalWrite(LED_BUILTIN, TURN_ON);
signal_led(true);
delay(500);
digitalWrite(LED_BUILTIN, TURN_OFF);
signal_led(false);
}