Franzduino
Published © GPL3+

Ambient Monitor

This monitor measures CO2 concentration (using XPAD CO2 by Infineon), temperature, humidity (DHT22) and soon even pressure (BMP280).

IntermediateProtip2 hours164
Ambient Monitor

Things used in this project

Hardware components

NodeMCU ESP8266 Breakout Board
NodeMCU ESP8266 Breakout Board
×1
Infineon XENSIV™ PAS CO2 sensor
×1
0.96" OLED 64x128 Display Module
ElectroPeak 0.96" OLED 64x128 Display Module
×1
DHT22 Temperature Sensor
DHT22 Temperature Sensor
×1
Bosch GY-BMP280
×1

Software apps and online services

Arduino IDE
Arduino IDE
MySQL Database

Story

Read more

Code

Co2_sensor_v1_4.ino

Arduino
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Base64.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <pas-co2-serial-ino.hpp>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define AP_SSID "xxxxxxxxxxxxxxx"
#define AP_PASSWORD "xxxxxxxxxxxxxxx"
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

TwoWire * bus = (TwoWire*) pltf->i2c;
PASCO2SerialIno cotwo(bus);
WiFiClient wifiClient;

int16_t co2ppm;
//int16_t temp;
//int16_t hygro;
int16_t pressure;
Error_t err;
IPAddress ip;
String payload;
// DHT Sensor
uint8_t DHTPin = D7; 
float temp;
float hygro;
DHT dht(DHTPin, DHTTYPE);
ESP8266WiFiMulti WiFiMulti;
  
void setup()
{
  Serial.begin(9600);
//  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(DHTPin, INPUT);
  dht.begin();
  digitalWrite(LED_BUILTIN, HIGH);
  delay(2000);
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  //INTRO
  Serial.println("Ambient Monitor: INITIALIZED");
  display.println("Ambient");
  display.println("");
  display.println("Monitor");
  display.display();
  delay(2000);
  
  //WiFI connection
  wifiConnect();
  printWifiStatus();
/*  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.print("Wifi Connected to: ");
    Serial.println(AP_SSID);
    for(int i=0; i<10;i++){blink_100ms();}
  }*/
  display.setTextSize(2);
  Serial.println("Start measure");
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("Start");
  display.println("measure");
  display.display();
}

void loop()
{
  display.clearDisplay();
  display.setTextSize(1);
  
// Init variables
  co2ppm = -999;
  temp = -999;
  hygro = -999;
  pressure = -999;

  //Get CO2 value
  co2ppm = measure_co2();
  temp = dht.readTemperature(); // Gets the values of the temperature
  hygro = dht.readHumidity(); // Gets the values of the humidity  
  
  // Print Co2 value on oled 0.96
  // Display static text
  displaymeasures();
  log_2_db();
  blink_1s();
}

void log_2_db(){
  HTTPClient http;
  String string4db = "http://xxxxxxxx.altervista.org/co2_log.php?valuestring=";
  string4db += co2ppm;
  string4db += ";";
  string4db += temp;
  string4db += ";";
  string4db += hygro;
  string4db += ";";
  string4db += pressure;
  Serial.println(string4db);
  http.begin(wifiClient, string4db);
  int httpCode = http.GET();

  // httpCode will be negative on error
  if (httpCode > 0)
  {
    if (httpCode == HTTP_CODE_OK)
    {
      payload = http.getString();
      Serial.println("New record created successfully after " + payload + " blinks");
    }
  }
  http.end();
  blink_1s();
}

void wifiConnect()
{
  display.setTextSize(1);
  Serial.print("Connecting to AP");
  WiFi.begin(AP_SSID, AP_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    display.setCursor(0, 0);
    Serial.print(".");
    display.clearDisplay();
    display.println("connecting...");
    display.display();
    blink_100ms();
  }
  digitalWrite(LED_BUILTIN, LOW);
  Serial.println("");
  Serial.println("WiFi connected");
  display.clearDisplay();
  display.print("WiFi connected");
  display.display();
  delay(2000);
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("Connected to SSID: ");
  Serial.println(WiFi.SSID());
  display.setCursor(0, 0);
  display.clearDisplay();
  display.println("Connected to SSID: ");
  display.println(WiFi.SSID());
  display.display();
  delay(2000);

  // print your WiFi shield's IP address:
  ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  display.setCursor(0, 0);
  display.clearDisplay();
  display.println("IP Address:");
  display.println(ip);
  display.display();
  delay(2000);
}

void blink_100ms(){
  delay(50);                       // wait for a 50ms
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(50);
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
}

void displaymeasures(){
  display.setCursor(0, 0);
  display.clearDisplay();
  display.print("co2:      ");
  display.print(co2ppm);
  display.println(" ppm");
  display.println("");
  display.print("Temp:     ");
  display.print(temp);
  display.println(" C");
  display.println("");
  display.print("Hygro:    ");
  display.print(hygro);
  display.println(" %");
  display.println("");
  display.print("Pressure: ");
  display.print(pressure);
  display.println(" mBar");
  display.display(); 
  
  Serial.print("co2:");
  Serial.print(co2ppm);
  Serial.print("ppm;Temp:");
  Serial.print(temp);
  Serial.print("C;Hygro:");
  Serial.print(hygro);
  Serial.print("%;Pressure:");
  Serial.print(pressure);
  Serial.println("mBar");
}

int measure_co2(){
  /* Trigger the measure with startMeasure() */
  err = cotwo.startMeasure();
  if(pasco2::OK != err)
  {
    Serial.print("error CO2 READ:");
    Serial.println(err);
    display.setCursor(0, 0);
    display.clearDisplay();
    display.println("error CO2 READ:");
    display.println(err);
    display.display();
  }

  /* Wait for the value to be ready */
  delay(5000);

  do
  {
    err = cotwo.getCO2(co2ppm);
    if(pasco2::OK != err)
    {
      Serial.print("error: ");
      Serial.println(err);
      break;
    }
  } while (0 == co2ppm);
  return co2ppm;
}

void blink_1s(){
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);
}

Credits

Franzduino
2 projects • 3 followers
Contact

Comments

Please log in or sign up to comment.