VentMan Part II: Arduino-Automated Furnace Detection for Booster Fans
by onetrueandrew in Circuits > Arduino
489 Views, 2 Favorites, 0 Comments
VentMan Part II: Arduino-Automated Furnace Detection for Booster Fans
Main Points:
- This was a temporary hack put in place to detect when my AC/furnace blower motor was running, so that my two booster fans could turn on.
- I need two booster fans in my ductwork to push more warm/cool air two two isolated bedrooms. But I don't want to run the fans all the time, just when the furnace blower motor is running.
Supplies
- WeMos D1 Mini (or cheap knockoff / anything ESP8266)
- Jumper wires
- 10K resisitor
- Tilt sesnor
Fail
Some efforts that failed before this solution:
- Use ecobee API to detect thermostat status. API is on a 20 minute to two hour delay, not good enough
- Arduino flex sensor in the duct was not sensitive enough
- Current sensor on the 24V fan line from thermostat, I didn't have a DC current sensor and was impatient. Plus, the idea scares me.
- Homeassistant/Hass.io same limitations as ecobee API
- Air flow sensor not senstive enough for return air duct flow.
Install Booster Fans
This write-up is not about the booster fans themselves, but it is a required step. I installed two in-line booster fans, sealed any air leaks with vent tape, and plugged them both into a smart plug I had flashed Tasmota onto, so I could turn on/off both fans with a single GET request.
The used rubber washers where the fans are mounted onto the ceiling joists to reduce vibration.
Wire Up
The D1 mini, tilt sensor, and resistor fit together so the analog pin reads the tilt setting.
Code
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
//CONSTANTLY READS FROM D1 MINI VIBRATION SENSOR
//IF TWO DISTINCT VIBRATIONS DETECTED IN A 60-SECOND WINDOW, A WEB REQUEST IS MADE
//IF ZERO OR ONE VIBRATION DETECTED, NOTHING HAPPENS, LIKELY FALSE POSITIVE
const int sigPin = A0;
uint32_t period = 1 * 60000; // 60 second window
int flex = 0; //starting value
const char* ssid = "ssid"; //ADD WIFI SSID
const char* password = "password"; //ADD WIFI PASSWORD
void setup () {
WiFi.begin(ssid, password);
Serial.begin(9600);
pinMode(sigPin, INPUT);
}
void loop() {
flex = 0;
Serial.println("restarting count");
for ( uint32_t tStart = millis(); (millis() - tStart) < period; ) {
yield();
int sigStatus = analogRead(sigPin);
if (sigStatus != 1024) //it's working
{
//Serial.println("up");
flex += 1;
Serial.println(flex);
if (flex == 2)
{
//Serial.println("Shook twice, this is real");
HTTPClient http;
//http.begin("http://10.0.0.50:5000/fan_on");
http.begin("http://IP:PORT/path"); //ADD CORRECT IP, PORT, VALUES
int httpCode = http.GET();
String payload = http.getString();
Serial.println(payload);
http.end();
delay(6000); //rest a bit
}
delay(1000);
}
else {
Serial.println("undisturbed");
}
}
}
Install
This is the tricky part, it required a lot of trial-and-error. Ignore the rust stains in the vent, they're from an old humidifier that was installed in the duct.
I decided to place the vibration sensor just inside the cold-air return duct close to the furnace intake, so that all the air entering the blower motor would pass by it, hopefully enabling it to shake a little. The hardest part was getting the sensor to hang just right so that it stood up and still jiggled in the air flow. The photos show the breadboard before I made the solution more permanent. The D1 mini itself stayed outside the duct, to keep the wifi signal strong.
I ended up dangling the tilt sensor against an old wire that used to be used to control the humidifier, but was left in the duct, that way I got the angle just right.
Test
The code works by keeping a rolling 60-second window, and counting the number of times a vibration is detected. You can change the variables, but mine is set to make a GET request to my flask server if at least 2 vibrations are detected in a 60-second window.
The flask server then uses other data to determine if it should turn on my booster fans, like time of day, and house occupancy. See for more info: