ben njus
Published

Flower Pot midterm

You can water your plants from miles away

IntermediateFull instructions provided3 hours62
Flower Pot midterm

Things used in this project

Story

Read more

Schematics

rough schematic

not completed

Code

my awesome code

C/C++
beautifully writtern
*
 * 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;
    }

Credits

ben njus
2 projects • 1 follower

Comments