Setting up the Sketch
Since we don't want our motion detector to alert us of daytime activities (like a dog passing by, or a skateboarder), we'll need to give the sketch (prior to uploading) the current hour, minutes and seconds. In the sketch, set startingHour
, currentMinutes
, and currentSeconds
to the current time (we're using 24-hour time for this sketch). For the sketch to work properly, you'll need to change these values on every upload.
- While we're not using one for this project, you can add a Real-Time-Clock (like the RTC FeatherWing) if you'd like more precise timekeeping.
/**** Time Setup ****/ // set the current hour int startingHour = 0; // set the current minutes int currentMinutes = 0; // set the current seconds int currentSeconds = 0;
The first chunk of the code (setup()
) starts a MQTT connection to the Adafruit IO server. We also add three message handlers to handle changes from the indoor-lights, outdoor-lights, and home-alarm feeds from the dashboard blocks. We also set up the PIR sensor, reed switch, SGP30 sensor, and initalize the NeoPixel strip.
void setup() { // start the serial connection Serial.begin(115200); // wait for serial monitor to open while(! Serial); Serial.println("Adafruit IO Home: Security"); Serial.println("Connecting to Adafruit IO"); // start MQTT connection to io.adafruit.com io.connect(); // attach a message handler for the `home-alarm` feed alarm->onMessage(handleAlarm); // subscribe to lighting feeds and register message handlers indoorLights->onMessage(indoorLightHandler); outdoorLights->onMessage(outdoorLightHandler); // wait for an MQTT connection // NOTE: when blending the HTTP and MQTT API, always use the mqttStatus // method to check on MQTT connection status specifically while(io.mqttStatus() < AIO_CONNECTED) { Serial.print("."); delay(500); } // we are connected Serial.println(); Serial.println(io.statusText()); // declare PIR sensor as input pinMode(pirPin, INPUT); // declare reed switch as input pinMode(doorPin, INPUT); // set up the SGP30 sensor setupSGP30(); // init the neopixel strip and set to `off` strip.begin(); strip.show(); }
The next chunk of code (loop()
) calls io.run()
which keeps the client connected to Adafruit IO. Next, it makes a call to getTime()
which calculates and returns the current time. Then we read the door, SGP30, and PIR sensor (readDoorSensor
, readPIR
, readSGP30
) and send their values to their respective Adafruit IO feeds.
void loop(){ io.run(); getTime(); Serial.println("* read door sensor..."); readDoorSensor(); Serial.println("* read motion detector"); readPIR(); Serial.println("* reading SGP30..."); readSGP30(); }
The toggle button on your Adafruit IO dashboard is connected to the handleAlarm
message handler. When the toggle button's value is changed, it receives the current value of the feed and checks if it's ON
or OFF
and sets the isAlarm
boolean.
void handleAlarm(AdafruitIO_Data *data) { // handle the alarm toggle on the Adafruit IO Dashboard String toggleValue = data->toString(); Serial.print("> rcv alarm: "); Serial.println(toggleValue); if(toggleValue == String("ON")) { Serial.println("* Alarm Set: ON"); isAlarm = true; } else { Serial.println("* Alarm Set: OFF"); isAlarm = false; } }
Finally, we'll check if the alarm is armed (isAlarm==true
). If the alarm is armed, we check if the door is open (doorState == HIGH
) or if the hour is later than alarmHour
and if the motion detector is triggered, we'll make a call to the playAlarmAnimation()
function.
// check if the alarm toggle is armed from the dashboard if (isAlarm == true) { if (doorState == HIGH || (hour>alarmHour && pirState == HIGH)) { playAlarmAnimation(); } }
Connect your Feather Huzzah to USB and upload the io_home_security sketch.
Open up the IO-Home dashboard to interact with your smart home. Push the door open. You should see the Front Door Indicator change from green to red.
Switch the toggle from OFF to ON to arm your house's security system. When you push the front door open (or move past the PIR sensor past the time set by alarmHour
), the inside lights will blink red and the piezo will make noise.
Tired of the alarm? Want some peace and quiet? Toggle the alarm OFF.
Page last edited March 08, 2024
Text editor powered by tinymce.