Things used in this project

Hardware components:
Photon new
Particle Photon
×1
10167 01
DHT22 Temperature Sensor
×1
SainSmart MQ135
×1
Double-side Prototype PCB Universal Printed Circuit Board
×1
09264 1
RGB Diffused Common Cathode
×1
11026 02
Jumper wires (generic)
×1
Adafruit industries ada592 image 75px
USB-A to Micro-USB Cable
×1
Mfr 25frf52 10k sml
Resistor 10k ohm
×1
Mfr 25frf52 100r sml
Resistor 100 ohm
×3
Hand tools and fabrication machines:
Lasercutter
Laser cutter (generic)

Custom parts and enclosures

Box Enclosure
SVG File containing the plans for our enclosure.
co2_box_W5lNLDkMJA.svg

Schematics

Photon with MQ135, DHT22, and RGB LED
This was the breadboard layout we used to connect our Photon to the DHT22 sensor, the MQ135 sensor, and an RGB LED.
project3breadboard_5XFnt29qPH.fzz

Code

Particle Photon CO2 Sensor to Phant DatabaseArduino
This code collects input from a DHT22 and MQ135 sensor, and uploads it to a phant database.

Be sure to include the SparkFunPhant, MQ135, and Adafruit_DHT libraries when you implement this yourself.
// This #include statement was automatically added by the Particle IDE.
#include <SparkFunPhant.h>
// This #include statement was automatically added by the Particle IDE.
#include <MQ135.h>
// This #include statement was automatically added by the Particle IDE.
#include <Adafruit_DHT.h>

#define DHTPIN 3    // the DHT pin
#define DHTTYPE DHT22		// DHT 22 (AM2302)
#define MQ135PIN A0  //the CO2 Sensor pin

MQ135 MQ135(MQ135PIN);

DHT dht(DHTPIN, DHTTYPE);

//RGB pin spots
int redPin = D1;
int greenPin = D2;
int bluePin = D0;

//Declare variables
double hum = 0;
double temp = 0;
double co2 = 0;

//Phant setup
const char server[] = "data.sparkfun.com"; // Phant destination server
const char publicKey[] = "Insert public key here"; // Phant public key - HAS TO BE CHANGED
const char privateKey[] = "Insert private key here"; // Phant private key  - HAS TO BE CHANGED
Phant phant(server, publicKey, privateKey);

void setup() {
    Serial.begin(9600);
    pinMode(DHTPIN, INPUT);
    Particle.variable("hum", hum);
    Particle.variable("temp", temp);
    Particle.variable("co2", co2);
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);  
}

void setColor(int red, int green, int blue)
{
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);  
}

void loop() {
    
    double tempTemp = dht.getTempFarenheit();
    if(tempTemp > 0 && tempTemp < 100){
        temp = tempTemp;
    }
    double tempHum = dht.getHumidity();
    if(tempHum > 0 && tempHum < 101){
        hum = tempHum;
    }
    
    double tempco2 = MQ135.getCorrectedPPM(temp, hum);
    if(tempco2 > 0){
        co2 = tempco2*100;
    }
    
    if(co2 < 500){
        setColor(0, 200, 0);
    }else{
        setColor(0, 0, 200);
    }
    
    Serial.println("temp: ");
    Serial.println(temp);
    Serial.println("hum: ");
    Serial.println(hum);
    Serial.println("co2: ");
    Serial.println(co2);
    
    postToPhant();
    delay(60000);
    
}

int postToPhant()
{    
    // Use phant.add(<field>, <value>) to add data to each field.
    // Phant requires you to update each and every field before posting,
    // make sure all fields defined in the stream are added here.
    phant.add("humidity", hum);
    phant.add("temp", temp);
    phant.add("co2", co2);
        	
    TCPClient client;
    char response[512];
    int i = 0;
    int retVal = 0;
    
    if (client.connect(server, 80)) // Connect to the server
    {
		// Post message to indicate connect success
        Serial.println("Posting!"); 
		
		// phant.post() will return a string formatted as an HTTP POST.
		// It'll include all of the field/data values we added before.
		// Use client.print() to send that string to the server.
        client.print(phant.post());
        delay(1000);
		// Now we'll do some simple checking to see what (if any) response
		// the server gives us.
        while (client.available())
        {
            char c = client.read();
            Serial.print(c);	// Print the response for debugging help.
            if (i < 512)
                response[i++] = c; // Add character to response string
        }
		// Search the response string for "200 OK", if that's found the post
		// succeeded.
        if (strstr(response, "200 OK"))
        {
            Serial.println("Post success!");
            retVal = 1;
        }
        else if (strstr(response, "400 Bad Request"))
        {	// "400 Bad Request" means the Phant POST was formatted incorrectly.
			// This most commonly ocurrs because a field is either missing,
			// duplicated, or misspelled.
            Serial.println("Bad request");
            retVal = -1;
        }
        else
        {
			// Otherwise we got a response we weren't looking for.
            retVal = -2;
        }
    }
    else
    {	// If the connection failed, print a message:
        Serial.println("connection failed");
        retVal = -3;
    }
    client.stop();	// Close the connection to server.
    return retVal;	// Return error (or success) code.
}

Credits

Replications

Did you replicate this project? Share it!

I made one

Love this project? Think it could be improved? Tell us what you think!

Give feedback

Comments

Similar projects you might like

Lightweight Sliding Door Automator
Intermediate
  • 1,535
  • 7

Work in progress

Automate the opening and closing of a lightweight sliding door (e.g. a screen door), including remote controls on your phone.

Christmas Gift Box
Intermediate
  • 3,633
  • 595

Full instructions

Christmas Gift Box plays music and sends an email when it is opened.

Carbon Fiber Vacuum Chamber
Intermediate
  • 2,905
  • 94

Full instructions

Our project is a carbon fiber vacuum chamber that is monitored by multiple particle photons and various sensors.

ConnectTheDots with Particle Azure IoT Hub Integration
Intermediate
  • 841
  • 8

Protip

This project will allow you to connect your Particle device into an Azure IoT Hub for viewing data in real-time through an ASP.NET web app!

What should I wear outside?
Intermediate
  • 5,044
  • 67

Full instructions

A whimsical weather clock powered by Particle and forecast.io

Garage Door Opener with Blynk
Intermediate
  • 367
  • 2

Open, close and monitor a garage door opener with a smart phone using a Particle Photon and the Blynk application.

Add projectSign up / Login