Added led for signalling change
This commit is contained in:
111
src/main.cpp
111
src/main.cpp
@@ -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,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<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);
|
||||
}
|
||||
Reference in New Issue
Block a user