/*
* Project L14_04_PlantWater
* Description: Intergrating OLED BME280 and Adafruit.io
* Author: Miguel Lopez
* Date: 8/10/20
*/
#include <Adafruit_MQTT.h>
#include "Adafruit_MQTT/Adafruit_MQTT.h"
#include "Adafruit_MQTT/Adafruit_MQTT_SPARK.h"
#include "Adafruit_MQTT/Adafruit_MQTT.h"
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#define OLED_RESET D4
Adafruit_SSD1306 display(OLED_RESET);
#include <Wire.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883 // use 8883 for SSL
#define AIO_USERNAME "MiguelLopez"
#define AIO_KEY "aio_YMOO14iH2BBdDomoli8eD8tPWyJj"
/************ Global State (you don't need to change this!) *** ***************/
TCPClient TheClient;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_SPARK mqtt(&TheClient,AIO_SERVER,AIO_SERVERPORT,AIO_USERNAME,AIO_KEY);
/****************************** Feeds ***************************************/
// Setup Feeds to publish or subscribe
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe Button = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/PushButton");
Adafruit_MQTT_Publish Temp = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/TempValue");
Adafruit_MQTT_Publish Humid = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/HumidValue");
Adafruit_MQTT_Publish Press = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/PressValue");
Adafruit_MQTT_Publish Soil = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/SoilMoisture");
Adafruit_MQTT_Publish Dust = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/DustLevel");
/************Declare Variables*************/
unsigned long last;
float value;
int lastTime;
int randomNum;
int currentTime;
int lastSecond;
float tempF; //BME280 Values
float pressinHg;
float humidRH;
int tempValue;
bool status;
int moistSens = A5; //Moisture Sensor
int readings = 0;
int motorPump = A4;
int dustSensor = A2; //Dust Sensor
unsigned long duration;
unsigned long startTime;
unsigned long sampleTime_ms = 30000;
unsigned long lowPulseOccupancy = 0;
float ratio = 0;
float concentration = 0;
void setup()
{
Serial.begin(9600);
delay(100); //wait for Serial Monitor to startup
// Setup MQTT subscription for onoff feed.
//mqtt.subscribe(&TempF);
mqtt.subscribe(&Button);
pinMode(D7, OUTPUT);
status = bme.begin(0x76);
pinMode(moistSens, INPUT);
pinMode(motorPump, OUTPUT);
pinMode(dustSensor, INPUT);
startTime = millis();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop()
{
currentTime = millis();
if((currentTime-lastSecond)>1000)
{
lastSecond = millis();
}
MQTT_connect();
if ((millis()-last)>120000) {
Serial.printf("Pinging MQTT \n");
if(! mqtt.ping()) {
Serial.printf("Disconnecting \n");
mqtt.disconnect();
}
last = millis();
displayBMEValues();
intOLED();
//airQualitySensor();
groveDustSensor();
}
// this is our 'wait for incoming subscription packets' busy subloop
// try to spend your time here
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(10000))) {
if (subscription == &Button) {
value = atof((char *)Button.lastread);
}
if(value == 1){
digitalWrite(motorPump, HIGH);
}
else
{
digitalWrite(motorPump,LOW);
}
}
if((millis()-lastTime > 30000)) {
if(mqtt.Update())
{
Temp.publish(tempF);
Humid.publish(humidRH);
Press.publish(pressinHg);
Soil.publish(readings);
Dust.publish(concentration);
}
lastTime = millis();
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect()
{
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
}
Serial.println("MQTT Connected!");
}
void displayBMEValues() //Initializes BME280 Sensor
{
tempF = (bme.readTemperature() * 8/5) + 32;
pressinHg = (bme.readPressure() * 0.00029530);
humidRH = bme.readHumidity();
Values(tempF, pressinHg, humidRH);
}
void Values(float VtempF, float VpressinHg, float VhumidRH) //Temperature Values
{
Serial.printf("Temp. = %0.2f *F\n", VtempF);
Serial.printf("Press. = %0.2f inHg\n", VpressinHg);
Serial.printf("Humi. = %0.2f \n", VhumidRH);
}
void intOLED() //Initializes OLED Screen
{
readings = analogRead(moistSens);
display.clearDisplay();
display.setRotation(0);
display.setTextSize(0);
display.setCursor(0,0);
display.setTextColor(WHITE);
display.printf("Enviornment Readings \n");
display.printf("Moisture Level:%i\n", readings);
display.printf("Temperature:%0.2f(F)\n", tempF);
display.printf("Pressure:%0.2f(inHg)\n", pressinHg);
display.printf("Humidity:%0.2f\n", humidRH);
display.printf("Dust Reading:%0.2f\n", concentration);
display.display();
if(readings >= 3200)
{
digitalWrite(motorPump, HIGH);
delay(500);
digitalWrite(motorPump, LOW);
}
if(readings <= 1900)
{
digitalWrite(motorPump,LOW);
}
}
void airQualitySensor() //Initializes Air Quality Sensor
{
}
void groveDustSensor() //Initializes Dust Sensor
{
duration = pulseIn(dustSensor, LOW);
lowPulseOccupancy = lowPulseOccupancy + duration;
if ((millis()-startTime) > sampleTime_ms)//if the sample time == 30s
{
ratio = lowPulseOccupancy/(sampleTime_ms*10.0); // Integer percentage 0=>100
concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
Serial.print(lowPulseOccupancy);
Serial.print(",");
Serial.print(ratio);
Serial.print(",");
Serial.println(concentration);
lowPulseOccupancy = 0;
startTime = millis();
}
}
Comments
Please log in or sign up to comment.