Basement Alert System (BAS)
Project Motivation and Description
The Fulford and Sons group are home renters that have a basement on their premises. The basement is only accessible from outside of the home. Because of this, periodically checking on the condition of the basement can be spaced out, let alone inconvenient. Also, flooding or mold can be happening while we are unaware that these things are going on down there. This is exactly what happened to us on multiple occasions.
The Fulford and Sons have a furnace that is used in delivering heat to the home. The furnace has a condensation pump that takes water out of the furnace and into a container. The water is then delivered from the container to outside of the home. This container can overflow if things are not functioning correctly, for example, frozen lines. This past winter, the lines froze, and the basement had large amounts of water dispersed throughout it. If left unattended for several days, the overflow will cause significant damage, especially to anything stored down there.
The BAS is designed to alert the home owner/renter of any threatening situations that can occur in the basement. The system contains temperature, humidity, gas, and water level sensors. The BAS also houses a LPC1768 microcontroller that takes the sensor's readings and transmits the data to a local sever web page on the LAN connection of the home. If anything serious occurs, the mbed will use the Huzzah WIFI module to activate an action on the IFTTT website. This action is a text message sent to the home owner/renter indicating which condition is developing. The BAS will produce an alert sound through a simple speaker and amplifier for the water level condition only.
Block Diagram of BAS
System Devices with Pinouts
Adafruit HTU21D-F
| Mbed | HTU21D-F |
|---|---|
| Vout | Vin |
| GND | GND |
| p10 | SCL |
| p9 | SDA |
Adafruit MiCS5524
| Mbed | MiCS5524 |
|---|---|
| VU | 5V |
| GND | GND |
| p15 | A0 |
Huzzah WIFI
| Mbed | Huzzah WIFI | 5V Power Supply |
|---|---|---|
| V+ | + | |
| GND | GND | - |
| p16 | RST | |
| p17 | TX | |
| p18 | RX |
SD Card Reader
| Mbed | SD Card Reader |
|---|---|
| Vout | VCC |
| GND | GND |
| p5 | DI |
| p6 | DO |
| p7 | SCK |
| p8 | CS |
| Mbed | TPA2005D1 | Speaker |
|---|---|---|
| VU | PWR+ | |
| GND | PWR- | |
| p18 | IN+ | |
| GND | IN- | |
| OUT+ | + | |
| OUT- | - |
System Demo
BAS response when water level is too high
BAS response when temperature is too high.

Web page created by BAS

Alert text sent from IFTTT.com
System Code
Import programBasement_Alert_System
Send text alert with Water level, Temp, and Gas Level
main.cpp
#include "mbed.h"
#include "ESP8266_Huzzah.h"
#include "HTU21D.h"
#include "rtos.h"
#include "wave_player.h"
#include "SDFileSystem.h"
#include "Server.h"
HTU21D temphumid(p9, p10); //Temp humid sensor || SDA, SCL
AnalogIn gas_lvl(A0);
AnalogIn water_lvl(A1);
SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card card reader
AnalogOut DACout(p18); // used to play sound on speaker
//wave player plays a *.wav file to D/A and a PWM
wave_player waver(&DACout);
float sample_ftemp=0.0;
float sample_humid=0.0;
float gas_density=0.0;
float gas_density_init = 0.0;
float gasDiff = 0.2;
float water_level=0.0;
float critWater = 0.10; // critical water level
bool soundOn = false;
bool tempAlerted = false;
bool gasAlerted = false;
bool humidAlerted = false;
bool waterAlerted = false;
Mutex mutex;
Mutex thMutex;
Mutex wifi;
Mutex waterMutex;
Thread *(sound);
DigitalOut gasLed(p11);
DigitalOut waterLed(p21);
DigitalOut tempLed(p22);
DigitalOut humidLed(p23);
Timer tt;
//========= Set up ESP8266 to act as server/client =========//
void ESP8266_config()
{
reset=0; //hardware reset for 8266
pc.baud(9600); // set what you want here depending on your terminal program speed
pc.printf("\f\n\r-------------ESP8266 Hardware Reset-------------\n\r");
wait(0.5);
reset=1;
timeout=2;
getreply();
esp.baud(9600); // change this to the new ESP8266 baudrate if it is changed at any time.
//ESPsetbaudrate(); // include this routine to set a different ESP8266 baudrate
ESPconfig(); // nclude Config to set the ESP8266 configuration
pc.baud(9600);
}
//======================== THREADS =========================//
void gas_thread(void const *arg)
{
while(1)
{
while(soundOn) Thread::yield(); // This helps the sound file for water
Thread::wait(60); // level play clearly
/*
mutex.lock();
pc.printf("Gas Density: %3f\r\n", gas_density);
mutex.unlock();
*/
thMutex.lock();
gas_density = gas_lvl.read();
thMutex.unlock();
if (gas_density_init - gas_density > gasDiff)
{
gasLed = 1;
if (!gasAlerted)
{
wifi.lock();
IFTTTgas();
wifi.unlock();
gasAlerted = true;
}
}
else
{
gasAlerted = false;
gasLed = 0;
}
}
}
void temp_thread(void const *arg)
{
while(1)
{
while(soundOn) Thread::yield();
thMutex.lock();
sample_ftemp = temphumid.sample_ftemp();
Thread::wait(60);
thMutex.unlock();
/*
mutex.lock();
pc.printf("Temperature: %d F\n\r", sample_ftemp);
mutex.unlock();
*/
if (sample_ftemp > 80 || sample_ftemp < 40)
{
tempLed = 1;
if (sample_ftemp < 40)
{
if (!tempAlerted)
{
tempAlerted = true;
wifi.lock();
IFTTTlowTemp(); // Send three messages back to back;
wifi.unlock();
}
}
else
{
if (!tempAlerted)
{
tempAlerted = true;
wifi.lock();
IFTTThighTemp();
wifi.unlock();
}
}
}
else
{
tempLed = 0;
tempAlerted = false;
}
}
}
void humid_thread(void const *arg)
{
while(1)
{
while(soundOn) Thread::yield();
thMutex.lock();
sample_humid = temphumid.sample_humid();
Thread::wait(60);
thMutex.unlock();
/*
mutex.lock();
pc.printf("Humidity: %d %%\n\r", sample_humid);
mutex.unlock();
*/
if (sample_humid > 70)
{
humidLed = 1;
if (!humidAlerted)
{
wifi.lock();
IFTTThumid();
wifi.unlock();
humidAlerted = true;
}
}
else
{
humidAlerted = false;
humidLed = 0;
}
}
}
void water_thread(void const *arg)
{
while(1)
{
thMutex.lock();
water_level = water_lvl.read();
thMutex.unlock();
/*
mutex.lock();
printf("Water Level: %3.2f\r\n",water_level);
mutex.unlock();
*/
if (water_level > critWater)
{
waterLed = 1;
if (!waterAlerted)
{
wifi.lock();
IFTTTwater();
wifi.unlock();
waterAlerted = true;
}
//Thread::wait(100);
FILE *wave_file;
sound->set_priority(osPriorityHigh);
soundOn = true;
wave_file=fopen("/sd/mydir/Red_Alert.wav","r");
waver.play(wave_file);
soundOn = false;
sound->set_priority(osPriorityNormal);
Thread::wait(1000);
fclose(wave_file);
}
else
{
waterLed = 0;
waterAlerted = false;
}
}
}
int main()
{
ESP8266_config();
tt.start();
if (time(NULL) < 1420070400) {
setRTC();
}
gas_density_init = gas_lvl.read(); // Get inititial gas density in basement
sample_ftemp = temphumid.sample_ftemp();
wait_ms(60);
sample_humid = temphumid.sample_humid();
wait_ms(60);
setServerValues(sample_ftemp,abs(gas_density_init - gas_density),sample_humid,water_lvl.read());
startserver();
/*
IFTTTwater();
IFTTThighTemp();
IFTTTlowTemp();
IFTTThumid();
IFTTTgas(); */
Thread thread1(gas_thread);
Thread thread2(temp_thread);
Thread thread3(humid_thread);
Thread thread4(water_thread);
sound = &thread4;
// continuosly get AP list and IP
while(1)
{
if(tt.read() > 5) { //let 5 seconds pass before updating
setServerValues(sample_ftemp,gas_density - gas_density_init,sample_humid,water_level);
gettime();
getgas();
gettemp();
gethumid();
getwater();
wifi.lock();
update_values();
wifi.unlock();
tt.reset();
tt.start();
}
while(soundOn) Thread::yield();
//sleep();
}
}
Please log in to post comments.

