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

vibration.jpg
fan2.jpg

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

fan1.jpg
plug.jpg

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

vent_vibration_sensor.png

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

zoom_out.jpg
zoom_in.jpg
breadboard.jpg
vibration.jpg

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:

https://www.instructables.com/id/VentMan-DIY-Autom...

https://github.com/onetrueandrew/green_ecobee