#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);
}
Comments
Please log in or sign up to comment.