Added led for signalling change
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
111
src/main.cpp
111
src/main.cpp
@@ -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,26 +101,57 @@ 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() {
|
||||||
//read configuration from FS json
|
//read configuration from FS json
|
||||||
Serial.println("mounting FS...");
|
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<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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user