81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
|
|
#include "sensor_anemometer.h"
|
|
|
|
//uses ATS177 Latched hall sensor for rotation sensing
|
|
|
|
/*
|
|
Sensor_Anemometer* Sensor_Anemometer_Instance;
|
|
|
|
|
|
void assignAnemometerObject(Sensor_Anemometer* p) {
|
|
Sensor_Anemometer_Instance = p;
|
|
}*/
|
|
/*
|
|
void sensor_anemometer_interrupt() {
|
|
Sensor_Anemometer_Instance->interrupt_anemometer();
|
|
}*/
|
|
|
|
Sensor_Anemometer::Sensor_Anemometer(int p)
|
|
{
|
|
pin=p;
|
|
}
|
|
|
|
void Sensor_Anemometer::init() //Things to be done during setup()
|
|
{
|
|
pinMode(pin,INPUT_PULLUP);
|
|
attachInterrupt(digitalPinToInterrupt(pin),interrupt_anemometer,CHANGE); //anemometer interrupt
|
|
init_ok=true;
|
|
}
|
|
|
|
//Also called during setup()
|
|
void Sensor_Anemometer::setSettings(float minchange, unsigned long senddelaymax, unsigned long readdelay)
|
|
{
|
|
data.minchange=minchange;
|
|
data.senddelaymax=senddelaymax;
|
|
data.readdelay=readdelay;
|
|
}
|
|
|
|
//Called during setup
|
|
void Sensor_Anemometer::advertise(HomieNode& p_sensorNode)
|
|
{
|
|
sensorNode = &p_sensorNode;
|
|
sensorNode->advertise("windspeed");
|
|
}
|
|
|
|
void Sensor_Anemometer::sensorloop()
|
|
{
|
|
if (init_ok) {
|
|
sensordata &d=data;
|
|
|
|
bool _changed=false;
|
|
if (millis() >= (d.lastreadtime+d.readdelay)) {
|
|
uint16_t _anepulsesPerMinute=anemometer_pulsecounter/((millis()-anemometer_lasttimereset)/60000.0);
|
|
d.value = _anepulsesPerMinute*SENSOR_ANEMOMETER_PPMtoMPS;
|
|
|
|
if (abs((int)d.lastsentvalue-d.value)>=d.minchange){ //int abs
|
|
_changed=true;
|
|
}
|
|
d.lastreadtime=millis();
|
|
}
|
|
|
|
if (_changed || millis() >= (d.lastsent+d.senddelaymax)) {
|
|
Serial.print("Sending windspeed. reason=");
|
|
if (_changed) Serial.println("change"); else Serial.println("time");
|
|
|
|
Homie.getLogger() << "windspeed tcs " << ": " << d.value << endl;
|
|
sensorNode->setProperty("windspeed").send(String(d.value));
|
|
|
|
//reset when sent. makes it more accurate but keeps fast response
|
|
anemometer_pulsecounter=0; //reset counter
|
|
anemometer_lasttimereset=millis();
|
|
d.lastreadtime=millis(); //also set lastread time to avoid having 1 count with a low time = high windspeed
|
|
|
|
d.lastsentvalue=d.value;
|
|
|
|
d.lastsent=millis();
|
|
}
|
|
}
|
|
}
|
|
|
|
|