Added temperature and relay nodes

This commit is contained in:
Ard Kuijpers
2020-03-08 20:10:23 +01:00
parent 82c7029e57
commit aa9fa938c4
12 changed files with 731 additions and 101 deletions

View File

@@ -1,28 +1,38 @@
#include <NewPing.h>
#include <Homie.h>
#include "PingNode.hpp"
#include "RelayNode.hpp"
#include "DHT22Node.hpp"
#define TURN_ON LOW
#define TURN_OFF HIGH
const int trigPin = D1; //D1
const int echoPin = D2; //D2
const int trigPin = D1;
const int echoPin = D2;
const int relayPin = 14; // D5
const int dhtPin = D7; ;
const int ledPin = LED_BUILTIN;
const float minDistance = 0.01;
const float maxDistance = 4.0;
const float minimumChange = 0.2;
#define MEASURE_INTERVAL 1000 // ms
#define PUBLISH_INTERVAL 5000 // ms
unsigned long HEARTBEAT_INTERVAL = 5;
unsigned long lastHeartbeat = 0;
NewPing sonar(trigPin,echoPin,maxDistance*100.0);
HomieNode obstacleNode("obstacle", "Obstacle", "object");
PingNode obstacleNode("obstacle",trigPin,echoPin);
DHT22Node airNode("air",dhtPin,20);
RelayNode relayNode("relay",relayPin,ledPin);
void signal_led(bool ons = true);
void signal_led(bool on = true);
void heartbeat_led(int times = 2);
void longbeat_led();
void loopHandler();
void setupHandler();
float readDistance();
void changeHandler() {
signal_led();
}
void loopHandler() {
if (millis() - lastHeartbeat > HEARTBEAT_INTERVAL * 1000UL || lastHeartbeat == 0) {
heartbeat_led();
lastHeartbeat = millis();
}
}
void setup() {
Serial.begin(115200);
@@ -31,14 +41,9 @@ void setup() {
pinMode(ledPin, OUTPUT);
Homie_setBrand("EtxeanIoT");
Homie_setFirmware("etxean-distancesensor", "1.0.4");
Homie_setFirmware("etxean-garagesensor", "1.0.5");
Homie.setLoopFunction(loopHandler);
obstacleNode
.advertise("distance").setName("Distance").setDatatype("float").setUnit("m");
obstacleNode
.advertise("valid").setName("Valid measurement").setDatatype("boolean");
obstacleNode
.advertise("changed").setName("Obstacle changed").setDatatype("boolean");
obstacleNode.setChangeHandler(changeHandler);
Homie.setup();
}
@@ -46,86 +51,9 @@ void loop() {
Homie.loop();
}
long lastPublish = 0;
long lastMeasurement = 0;
float lastDistance = 0.0;
float validDistance = -1;
bool checkBounds(float value, float min, float max) {
return !isnan(value) && value >= min && value <= max;
}
bool signalChange(float distance, float lastDistance) {
return fabs(distance - lastDistance) > minimumChange;
}
String toPayload(bool value)
{
return value ? "true" : "false";
}
void loopHandler() {
if (millis() - lastMeasurement >= MEASURE_INTERVAL) {
float distance = readDistance();
//float distance = random(5,400)/100.0;
Homie.getLogger() << "Distance: " << distance << " m";
bool valid = checkBounds(distance,minDistance,maxDistance);
Homie.getLogger() << ", valid = " << toPayload(valid) << endl;
if (valid)
validDistance = distance;
lastMeasurement = millis();
}
if (millis() - lastPublish >= PUBLISH_INTERVAL) {
heartbeat_led();
bool valid = validDistance > 0;
obstacleNode.setProperty("valid").send(toPayload(valid));
if (valid)
{
Homie.getLogger() << "Publish distance: " << validDistance << " m";
obstacleNode.setProperty("distance").send(String(validDistance));
bool changed = signalChange(validDistance, lastDistance);
obstacleNode.setProperty("changed").send(toPayload(changed));
if (changed)
{
signal_led();
Homie.getLogger() << ", changed" << endl;
}
lastDistance = validDistance;
validDistance = -1;
}
lastPublish = millis();
}
}
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_median();
// 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 signal_led(bool on)
{
if (on)
digitalWrite(ledPin, TURN_ON);
else
digitalWrite(ledPin, TURN_OFF);
digitalWrite(ledPin, on ? TURN_ON : TURN_OFF);
}
void heartbeat_led(int times)