Miguel A LOPEZ-MONZON
Published

Self Watering System

Who needs to water their plant regularly when you can get this Self Watering System to do it for you!

IntermediateShowcase (no instructions)10 hours764
Self Watering System

Things used in this project

Hardware components

0.96" OLED 64x128 Display Module
ElectroPeak 0.96" OLED 64x128 Display Module
×1
Grove - Dust Sensor(PPD42NS)
Seeed Studio Grove - Dust Sensor(PPD42NS)
×1
Gravity: I2C BME280 Environmental Sensor
DFRobot Gravity: I2C BME280 Environmental Sensor
×1
Capacitive Soil Moisture Sensor
×1
Gikfun DC 3V 5V Micro Submersible Mini Water Pump
×1

Software apps and online services

Particle Argon Wi-Fi Development Board
Adafruit IO

Hand tools and fabrication machines

Formlabs
Ultimaker

Story

Read more

Schematics

Device Fritzing

Device Schematic

Code

Plant Water

C/C++
/*
 * 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();
    }
}

Credits

Miguel A LOPEZ-MONZON
3 projects • 6 followers
My name is Miguel Lopez, I am a student at the IoT Bootcamp in New Mexico which focuses on implementing smart devices to the real world.
Contact

Comments

Please log in or sign up to comment.