Adafruit.io Smart Home
2020-07-01 | By Grace Hill
License: General Public License Fans Arduino Adafruit Feather
Guide By Grace Hill
Overview
This project is based on the Digi-Key Mini Smart Home for Atmosphere IoT Studio.
Explore the Internet of Things(IoT) with Adafruit IO in a real-life situation! Through Digi-Key's Mini Smart Home kit, you will be able to experiment with environmental sensors and an alarm system. All this is possible through Adafruit.io which allows for a connection with your microcontroller over WiFi. No need to wonder if it's staying cool in your house in the summer or warm in the winter when you can check from anywhere with a Wi-Fi connection. After experimenting on a small scale, you can repurpose the supplies and use them in your own house.
Adafruit.io
Adafruit.io is a cloud service without the need for personal management (Adafruit takes care of that for you). It provides the ability to store data, interact with the microcontroller, and be connected to Wi-Fi which allows you to check in on your device wherever you have Wi-Fi. And they offer this to you all for free! It's up to you how you will use it.
Smart Home Hub
The hardware of the mini smart home consists of the main hub that is connected through a 2 x 2 quad board. It has one main microcontroller along with two sensors and a relay. Connected to the microcontroller are multiple inputs/outputs that allow for interactions.
Materials
- Adafruit Huzzah 32- ESP32 Feather Board
- Adafruit Quad 2x2 FeatherWing Kit with Headers
- Adafruit ADXL343 + ADT7410 Sensor FeatherWing
- Mini Relay FeatherWing
- Adafruit BME680
- Spindle Motor
- LED Sequin Pack
- Buzzer
- Trifoil Fan
- 3 JST-PH Extension Cable
- Door Sensor
- USB Cable
- Cardboard/paper mache house
Tools
All these materials can be bought on Digi-Key's website.
Wiring
BME680
- Vin To 3.3 V
- GND to GND
- SCK to SCL
- SDI to SDA
Buzzer
- Long leg to pin 12
- Short leg to GND
Mini Relay FeatherWing
- 3 V to NC on the Pin Connector
- Signal to Pin 33
Female JST connectors
- JST Female-red to Pin 15
- JST Female-black to GND
- JST 2 Female-red to Pin 13
- JST 2 Female-black to GND
- JST 3 Female-red to Pin A3
- JST 3 Female-black to GND
Door
If you haven't recycled the box already, use it for the door. Measure and cut a door to fit in the inside of the house. Before installing the door, glue the sensor for the door with the wires to the door frame. Once the glue has set, begin to attach the door. Tape or a bamboo shoot will work for allowing the door to open and close. When the door has been placed, close it and glue on the second part of the magnetic door sensor (there should be no wires attached). Now, take the wires and strip about an eighth of an inch off. Slide a piece of shrink wrap on both wires and then solder on a JST Male Cable. It does not matter which wire is connected to which. After soldering, slide the shrink wrap over the newly soldered area and apply heat. Now that the connection is protected you are ready to proceed.
Fan
Take the popsicle stick out of the kit and cut it to the size of the ceiling. Put it on the ceiling and glue in place.
Place a small ring of shrink wrap around both of the fan wires and slide them down by the fan. Strip the wires and solder to a male JST wire so that the colors match up. After the soldering is complete, slide the shrink wrap over the newly soldered area and apply heat to shrink into place.
Once the wiring is done, put a small dot of glue in the center of the back of the motor (be cautious of the holes, do not get glue in them), and adhere to the popsicle stick making sure it is centered. If glue doesn't work try a sturdy tape such as duct tape or hockey tape.
Before placing the fan blades onto the motor, trim about an eighth of an inch off each blade or enough so that the fan can run without hitting the walls of the house.
LEDs
Strip the ends of a male JST cable and match the black wire to the negative and the red wire to the positive. There are five LEDs that come in the kit. The amount used is up to you, just be mindful when stripping the wires and placing the LEDs. Solder into place then tape or glue the LEDs to the ceiling or the inside of the roof.
Putting it All Together
Solder the headings onto the quad prototype board and attach the Non-Latching Relay on the upper left corner and the Huzzah 32 in the lower right corner. They should slip into the newly connected headers of the Quad board.
Make the following connection of JST cables:
- JST female Pin 13 to JST male LEDs
- JST female Pin 12 to JST male Fan
- JST female Pin A3 to JST male Door
Hole for USB Connection
Look at the house straight on, turn the house to the side on which the door is closer. In the lower-left corner of this wall, measure the height as well as the length you need to put the USB through the wall. Cut with a box cutter or Exacto knife.
How Adafruit.io Works
Adafruit IO connects to your device through Wi-Fi. To get the device onto the Wi-Fi, the code must allow for your device to do so. Adafruit.io has a library of codes that allow for those who are new to coding a chance to experience the Internet of Things(IoT), all with having little to no knowledge of coding. In this project, the code to allow for communication back and forth will be in a file called config.h.
Setup
Before being able to hook up your microcontroller, you must log in or create an account on the Adafruit.io website. Once your profile is made, we can continue on with our project.
Feeds
Our main line of communication with the microcontroller is through the feeds. To create a feed, click on the drop bar in the top left corner and hit Create Feed.
Name your feed.
This project consists of five feeds: Temperature, Humidity, Digital, Door, and Alarm. All of these will be either feeding information to you or the controller. For more information on feeds, Adafriut.io has a course: https://learn.adafruit.com/series/adafruit-io-basics.
Dashboards
After your feeds have been created, click on the dashboard, and create a new one. The dashboard is where you will be able to monitor and interact with your home.
To add a gauge to receive your data, click on the blue plus sign in the upper right corner.
A variety of options will be available, choose the gauge.
Select the Temperature feed.
Name the block then change the gauge so that the minimum is 0 and your maximum is 100.
Add a block with the blue plus sign.
Select the gauge again.
Set the feed to Humidity.
Set the minimum value to 0 and the maximum m value to 100.
To add the light switch, click the blue plus sign in the corner.
Choose the toggle.
Connect the Digital feed.
Name the toggle LED. It’s important to change the toggle name for On and Off to 1 and 0, respectively. If not done, your light will not respond. Create the block and place.
Create another toggle and set the feed to Alarm.
Name the toggle Alarm System. You do not need to change the On and Off, it will work without switching it to 1 and 0. Create the block and place.
The last feed we will use is the Door feed. For this sensor, we will be indicating if the door is open or closed. Add another block and choose the indicator.
Set the feed as a door.
Rename to read the Door indicator. Change the values and the condition. The conditions should be set to if equal to 1.
To edit the layout of the dashboard, click the green gear in the upper right corner. This will allow you to drag the blocks into different places as well as change the setting of each of the blocks.
Arduino IDE
With the Arduino IDE application, we will be able to access the library of pre-made projects by Adafruit as well as upload our code and write new ones. If you do not have Arduino IDE installed on your device, do so now. Once installed there are a few more files that need to be installed within the Arduino IDE application.
Libraries
Under the Sketch tab, you will find Include Library, go onto Manage Libraries. Once at the search bar, install the following libraries: Adafruit IO Arduino, and BME680.
Boards
Click Tools, Board, then Manage Boards. Here you will need to install the ESP 32 file to be able to run on the Huzzah 32 FeatherWing. Once completed, go back to the Tool handlebar, go to Board and find the Adafruit ESP32 FeatherWing.
Code
Open a new code and copy and paste this code:
//include libraries
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include "Adafruit_SGP30.h"
#include "config.h"
//
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define LED_PIN 13
#define FAN_PIN 15
#define DOOR_PIN A3
#define BUZZER_PIN 12
#define ALARM_PIN 5
//set the feeds
Adafruit_BME680 bme; // I2C
AdafruitIO_Feed *TempFeed = io.feed("temperature");
AdafruitIO_Feed *HumFeed = io.feed("humidity");
AdafruitIO_Feed *Digital = io.feed("digital");
AdafruitIO_Feed *Alarm = io.feed("alarm");
AdafruitIO_Feed *Door = io.feed("door");
//global variable
bool isAlarm = false;
bool isDoor = false;
void handleMessage(AdafruitIO_Data *data) {
Serial.print("received <- ");
if(data->toPinLevel() == HIGH)
Serial.println("HIGH");
else
Serial.println("LOW");
digitalWrite(LED_PIN, data->toPinLevel());
}
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;
}
}
void setup() {
//set inputs/outputs
pinMode(LED_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
pinMode(DOOR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(ALARM_PIN, OUTPUT);
Serial.begin(9600);
while (!Serial);
Serial.println(F("BME680 test"));
if (!bme.begin()) {
Serial.println("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
Serial.print("Connecting to Adafruit IO");
io.connect();
// wait for a connection
while (io.status() < AIO_CONNECTED)
{
Serial.print(".");
delay(500);
}
// we are connected
Serial.println();
Serial.println(io.statusText());
Digital->onMessage(handleMessage);
Alarm->onMessage(handleAlarm);
Digital->get();
Alarm->get();
}
void loop() {
io.run();
Serial.println("Reading Sensors....");
int TempRead = bme.readTemperature();
TempRead=((TempRead)*(9/5))+32;
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println("*C");
int HumRead = bme.readHumidity();
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println("%");
//saves to the io
TempFeed->save(TempRead);
HumFeed->save(HumRead);
// Fan turns on if it gets above 70 degrees
if(TempRead >= 70){
digitalWrite(15,HIGH);
}
else
digitalWrite(15,LOW);
int i = 0;
//Alarm system: if door is open and the alarm is set then turn on the buzzer
if(analogRead(DOOR_PIN)>0){
isDoor = true;
if(isAlarm ==true)
digitalWrite(BUZZER_PIN,HIGH);
}
else{
digitalWrite(BUZZER_PIN,LOW);
isDoor=false;
}
Door->save(isDoor);
//wait 20 sec to check sensors again
delay(2500);
}
//acts as light switch
After the main code is in we need to add some side code. Add a new tab and name it config.h. This file of code allows your device to connect over the Wi-Fi network. Copy and paste the config.h code into the program.
#define IO_USERNAME "Username"
#define IO_KEY "Keycode"
#define WIFI_SSID "SSID"
#define WIFI_PASS "password"
#include "AdafruitIO_WiFi.h"
#if defined(USE_AIRLIFT) || defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) || \
defined(ADAFRUIT_PYPORTAL)
// Configure the pins used for the ESP32 connection
#if !defined(SPIWIFI_SS) // if the wifi definition isnt in the board variant
// Don't change the names of these #define's! they match the variant ones
#define SPIWIFI SPI
#define SPIWIFI_SS 10 // Chip select pin
#define NINA_ACK 9 // a.k.a BUSY or READY pin
#define NINA_RESETN 6 // Reset pin
#define NINA_GPIO0 -1 // Not connected
#endif
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS, SPIWIFI_SS,
NINA_ACK, NINA_RESETN, NINA_GPIO0, &SPIWIFI);
#else
AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS);
#endif
Before compiling, type in your username, keycode, Wi-Fi name, and password in place of the filler in the config.h code. Without this, you will not be able to communicate with your board.
Afterward, in the upper right corner is a checkmark. Hit this to compile the program to make sure that everything is in place.
Upload code by clicking on the arrow next to the compile button.
log in to Adafruit.io to watch the data roll in. Don't forget to have fun with the light and alarm system as well.
If you would like more information on how Adafruit.io works, visit their website here.
For original BME680 Wiring photo, Buzzer Wiring photo, and Hole for the USB photo go to the original project: https://www.digikey.com/en/maker/projects/digi-key-iot-studio-mini-smart-home/c545d33029044fa183531c43ff052715
Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.
Visit TechForum