please watch my video!!!!
*
* Project Midterm Project
* Author: Ben Njus
* Date: 03/22/2025
* For comprehensive documentation and examples, please visit:
* https://docs.particle.io/firmware/best-practices/firmware-template/
*/
// Include Particle Device OS APIs
#include "Particle.h"
#include "Adafruit_BME280.h"
#include "Adafruit_SSD1306.h"
#include "Adafruit_GFX.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT/Adafruit_MQTT_SPARK.h"
#include "Adafruit_MQTT/Adafruit_MQTT.h"
#include "Air_Quality_Sensor.h"
#include "Credentials.h"
SYSTEM_MODE(SEMI_AUTOMATIC);
TCPClient TheClient;
Adafruit_BME280 bme; // this is for I2C device
const int OLED_RESET = -1;
Adafruit_SSD1306 display(OLED_RESET);
// Setup Feeds to publish or subscribe
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_SPARK mqtt(&TheClient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe button1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/button");
Adafruit_MQTT_Publish quality1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/quality");
Adafruit_MQTT_Publish humidRH1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidRH");
Adafruit_MQTT_Publish tempC1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/tempC");
Adafruit_MQTT_Publish Moisture1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/Moisture");
String dateTime;
String timeOnly;
const int moist = D13;
const int pump = D16;
AirQualitySensor sensor(A0);
int quality;
const int hexAddress = 0x76; // BME280 address
float tempC;
float humidRH;
bool status;
int Moisture;
unsigned int lastSecond;
unsigned int currentTime;
unsigned int pumptime;
unsigned int lastpumptime;
float subValue, pubValue;
int value;
void MQTT_connect();
bool MQTT_ping();
void setup()
{
pinMode(moist, INPUT);
pinMode(pump, OUTPUT);
Serial.begin(9600);
waitFor(Serial.isConnected, 10000);
WiFi.clearCredentials();
Serial.printf("Has Credentials = %i\n\n", WiFi.hasCredentials());
WiFi.setCredentials("DDCIOT", "ddcIOT2020"); // Connect to Internet but not Particle Cloud
WiFi.on();
WiFi.connect();
while (WiFi.connecting())
{
Serial.printf(".");
}
mqtt.subscribe(&button1);
status = bme.begin(hexAddress);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
display.clearDisplay();
Time.zone(-7); // MST =-7, MDT =-6
Particle.syncTime();
if (status == false)
{
Serial.printf("BME280 at address 0x%02X failed tostart", hexAddress);
}
}
//***************************************************************************************************************************
void loop()
{
MQTT_connect();
MQTT_ping();
dateTime = Time.timeStr(); // Current Date and Time from Particle Time class
currentTime = millis();
Moisture = analogRead(moist);
if ((currentTime - lastSecond) > 2000)
{
if (Moisture >= 2000)
{
digitalWrite(pump, HIGH);
delay(500);
}
if (Moisture < 2000)
{
digitalWrite(pump, LOW);
}
// pumptime = millis();
timeOnly = dateTime.substring(11, 19); // Extract the Time from the DateTime String]
tempC = bme.readTemperature(); // deg C
humidRH = bme.readHumidity(); //%RH
int quality = sensor.slope();
Serial.printf("temp is %0.1f\n ", tempC);
Serial.printf("humidity is %0.1f\n ", humidRH);
Serial.printf("moisture is %i\n", Moisture);
int value = sensor.getValue();
Serial.printf("Sensor value: %i ", value);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.printf("the temp is: %0.1f\n", tempC);
display.printf("the humidity is: %0.1f\n", humidRH);
display.printf("the moisture is: %i\n", Moisture);
display.printf("air quality is: %i\n", value);
display.printf("the time is: %s\n", timeOnly.c_str());
display.display();
Adafruit_MQTT_Subscribe *subscription;
if (mqtt.Update())
{ // if mqtt object (Adafruit.io) is available to receive data
Serial.printf("Publishing %i to Adafruit.io feed FeedNameB \n", quality);
quality1.publish(quality);
Serial.printf("Publishing %0.2f to Adafruit.io feed FeedNameB \n", humidRH);
humidRH1.publish(humidRH);
Serial.printf("Publishing %0.2f to Adafruit.io feed FeedNameB \n", tempC);
tempC1.publish(tempC);
Serial.printf("Publishing %i to Adafruit.io feed FeedNameB \n", Moisture);
Moisture1.publish(Moisture);
while ((subscription = mqtt.readSubscription(500)))
{ // wait a moment for new feed data
if (subscription == &button1)
{ // assign new data to appropriate variable
subValue = atof((char *)button1.lastread);
if (subValue == 1)
{
digitalWrite(pump, HIGH);
}
else
{
digitalWrite(pump, LOW);
}
}
}
}
}
lastSecond = millis();
}
// lastpumptime = millis();
//********************************************************************************************************************
// while ((subscription = mqtt.readSubscription(10000))){
// if(subscription == &gotmail) {
// Serial.printf("you've got mail \n");
// digitalWrite(D7,HIGH);
// flagServo.write(90);
// }
// }
// 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;
// Return if already connected.
if (mqtt.connected())
{
return;
}
Serial.print("Connecting to MQTT... ");
while ((ret = mqtt.connect()) != 0)
{ // connect will return 0 for connected
Serial.printf("Error Code %s\n", mqtt.connectErrorString(ret));
Serial.printf("Retrying MQTT connection in 5 seconds...\n");
mqtt.disconnect();
delay(5000); // wait 5 seconds and try again
}
Serial.printf("MQTT Connected!\n");
}
bool MQTT_ping()
{
static unsigned int last;
bool pingStatus;
if ((millis() - last) > 120000)
{
Serial.printf("Pinging MQTT \n");
pingStatus = mqtt.ping();
if (!pingStatus)
{
Serial.printf("Disconnecting \n");
mqtt.disconnect();
}
last = millis();
}
return pingStatus;
}










Comments