Daniel DouglasAlex Yang
Published © GPL3+

Well House Temperature Manager

Monitors the temperature of the well house to prevent the well from freezing.

BeginnerFull instructions provided3 hours997
Well House Temperature Manager

Things used in this project

Hardware components

Breadboard (generic)
Breadboard (generic)
This project can be completed with a single photon. However, this is a class project and using two photons is a requirement. I used a longer breadboard so as to fit both photons on the same breadboard.
Particle Photon
DHT11 Temperature & Humidity Sensor (4 pins)
DHT11 Temperature & Humidity Sensor (4 pins)
The DHT11 may be slower than other available sensors but ease of use and the recommendations of friends led me to choose a DHT11 Breakout Board as my temperature monitor.
Wall Outlet
The wall outlet will be used to wire a relay without the need to worry about the house's wiring.
Relay (Single)
Power Cable

Software apps and online services

ThingSpeak API
ThingSpeak API

Hand tools and fabrication machines

Wire Stripper


Read more


DH11 Wiring Schematic

Wiring schematic of the DH11 temperature and humidity sensor. Exclude the use of the resistor.


Wiring schematic for the relay.


Data Collection Photon Code

This program collects data from the DHT11 Sensor and publishes both to the Particle cloud and ThingSpeak for analysis.
// This #include statement was automatically added by the Particle IDE.
#include <Adafruit_DHT.h>
// DHT Pin Setting and DHT Type
#define DHTPIN 5
#define DHTTYPE DHT11
//Initialize the temperature and humidity variables as integers
int temperature;
int humidity;
//Set a constant string for the API node obtained from ThingSpeak
const String key = "5R0NW9ZKQAP0SO2M";
//Use the Library commands to confirm DHT Data pin and DHT Type (Type 11)
//Start the DHT protocols
void setup() {

void loop() {
  //Collects temperature data in Celsius, the fact that the Library spells it      "CelCius" is somewhat amusing
  temperature = dht.getTempCelcius();
  //Collects Humidity data as a percentage
  humidity = dht.getHumidity();
  //Publishes temperature and Humidity data to the cloud
  Particle.publish("tempC_clone222", String(temperature), PRIVATE);
  Particle.publish("hum_clone222", String(humidity), PRIVATE);
  //Publishes temperature and humidity to ThingSpeak 
  Particle.publish("thingSpeakWrite_All", "{ \"1\": \"" + String(temperature) + "\"," +
    "\"2\": \"" + String(humidity) + "\"," +
    //"\"3\": \"" + String(var2) + "\"," +
    //"\"4\": \"" + String(var3) + "\"," +
    //"\"5\": \"" + String(var4) + "\"," +
    "\"k\": \"" + key + "\" }", 60, PRIVATE);
    //Delays the loop for 1/2 hour or 1800 seconds

Photon Switch

This subscribes the Photon to the data of the first, and compares it to given values to determine whether it should turn the light on or off.
//Sets pin D4 as the power toggle pin
const int tog = D4;
//initializes temperature
int temperature;

void setup() {
    pinMode(tog, OUTPUT);
    //The relay is wired as normally closed and is non-latching so that if the photon loses power the light will remain on, setting the pin value to high defaults the light to the off position by opening the relay circuit.
    digitalWrite(tog, HIGH);
void loop() {
    //Subscribes the device to the  temperature data coming from the first photon and send it to the temperature handler function
    Particle.subscribe("temperature", tempHandler, MY_DEVICES);
    //Compares the temperature value pulled from the cloud to the values set by the user to prevent the well from freezing
    if (temperature >= 10){
        //At a temperature greater than 10 deg C it opens the circuit and turns off the light
        digitalWrite(tog, HIGH);
    else if (temperature <= 5){
        //At temperatures lower than 5 deg C it will close the circuit and turn on the light
        digitalWrite(tog, LOW);
        //Reading any temperature in the "deadzone" between 5 and 10 deg C restarts the loop
//Takes the string data retrieved from the cloud and converts it to an integer value for comparison
void tempHandler(const char *event, const char *data){
    //sets a new string, which i have defined as "pew" to take in the temperature data
    String pew = data;
    //Converts this new string "pew" into the previously defined integer "temperature"
    temperature = pew.toInt();


Daniel Douglas

Daniel Douglas

1 project • 3 followers
Alex Yang

Alex Yang

1 project • 0 followers
Thanks to Esther Jun Kim.