Hackster is hosting Impact Spotlights: Industrial Automation. Watch the stream live on Thursday!Hackster is hosting Impact Spotlights: Industrial Automation. Stream on Thursday!
IsaacDeleon223
Published

Smart water plant

A "smart" plant that can water itself when moisture sense are low.

IntermediateFull instructions providedOver 1 day8
Smart water plant

Story

Read more

Custom parts and enclosures

plant in action

display

ftiz

Schematics

schematics

Code

code

C/C++
/*
 * Project midterm2
 * Description:
 * Author:
 * Date:
 */
// #define OLED_RESET D0

#include <Adafruit_MQTT.h>
#include "Adafruit_MQTT/Adafruit_MQTT_SPARK.h"
#include "Adafruit_MQTT/Adafruit_MQTT.h"
#include "HX711.h"
#include "credentials.h"
#include "math.h"
#include "Adafruit_SSD1306.h"
#include <Adafruit_Sensor.h>
#include "Adafruit_BME280.h"
#include "Air_Quality_Sensor.h"

TCPClient TheClient; 
Adafruit_MQTT_SPARK mqtt(&TheClient,AIO_SERVER,AIO_SERVERPORT,AIO_USERNAME,AIO_KEY); 
Adafruit_MQTT_Subscribe subFeed = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/feed1"); 
Adafruit_MQTT_Publish pubFeed = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/feed2");
Adafruit_MQTT_Publish pubmoist = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/midtermpot.moist");
Adafruit_MQTT_Publish pubhum = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/midtermpot.hum");
Adafruit_MQTT_Publish pubpressure = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/midtermpot.pressure");
Adafruit_MQTT_Publish pubtemp = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/midtermpot.temp");
Adafruit_MQTT_Subscribe subbutton  = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/midtermpot.button"); 
Adafruit_MQTT_Publish pubair = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/midtermpot.air");
Adafruit_MQTT_Publish pubdust = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/midtermpot.dust");

Adafruit_BME280 bme ; // this is for I2C device
String DataTime, TimeOnly ;

unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;//sampe 30s ;
float concentration = 0;
unsigned int last, lastTime;
bool status;
int onlinebutton;
int moist;
int hum;
int pressure;
int temp;
int offset ;
float pressuremmhg;
float subValue,pubValue;
const int OLED_RESET=D0;
const int moistsens=A3;
const int waterthingy=D6;


unsigned long lasttime;
unsigned long pumplasttime;
unsigned long duststarttime;
 int value;
 int airquailty;
 int capread;
 int slopequality;
 char dangerreading;
 int dust;
 float lowpulseoccupancy;
float realconceration;
float ratio; 
const int dustpin=D5;
const int airpin=A4;

AirQualitySensor air(A4);
Adafruit_SSD1306 display (OLED_RESET);
SYSTEM_MODE(SEMI_AUTOMATIC);

void MQTT_connect();
bool MQTT_ping();

void setup () {
    mqtt.subscribe(&subbutton);
   pinMode (waterthingy,OUTPUT);
    pinMode(dustpin,INPUT);
    starttime = millis();//get the current time;
  status= bme.begin (0x76) ;
  Serial.begin(9600);
  waitFor(Serial.isConnected,10000);
  WiFi.on();
  WiFi.connect();
  while(WiFi.connecting()) {
    Serial.printf(".");
 }
  Serial.printf("\n\n");
 Time . zone ( -6) ; // MST = -7, MDT = -6
 Particle . syncTime () ; // Sync time with Particle Cloud
 Serial.begin(9600);
 Wire.begin();
 display.begin(SSD1306_SWITCHCAPVCC, 0X3C);
display.display();
Wire.begin();
bme.begin(0x76);
if (air.init()){
  Serial.printf("sensor ready.");
}else{
  Serial.printf("sensor error");
}
mqtt.subscribe(&subbutton);
duststarttime = millis();
}
void loop () {
  MQTT_connect();
  MQTT_ping();

 temp = bme.readTemperature () ; // deg C
 pressure = bme.readPressure () ; // pascals
 hum= bme.readHumidity () ; // %RH
 pressuremmhg=pressure/133.3;
 DataTime= Time.timeStr () ; // Current Date and Time from Particle Time class
 TimeOnly = DataTime.substring (11 ,19) ; // Extract the Time from the DateTime String
 moist = analogRead(moistsens);
   if (moist>=1700) {
   digitalWrite ( waterthingy , HIGH ) ;
   Serial.printf("watering plant\n");
   delay (1000) ;
  }
  if (moist<=1390){
  digitalWrite (waterthingy , LOW);
  Serial.printf("no water for u \n");
   delay (1000) ;

  }
  if (moist>=500) {
   display.clearDisplay();
   display.setTextSize(1);
   display.setTextColor(WHITE);
   display.setCursor(0,0);
   display.printf("Moisture = %d\n",moist);
   display.printf("Time. %s\n",TimeOnly.c_str());
   display.printf("Temp. %i\n",temp );
   display.printf("Pressure. %i\n",pressure );
   display.printf("humidty. %i\n",hum );
     Serial.printf("Temp. %i\n",temp );
     Serial.printf("Presssure. %i\n",pressure );
     Serial.printf("humidty. %i\n",hum );
     Serial.printf(" Date. %\n", DataTime . c_str () );
     Serial.printf(" Time.  %s\n", TimeOnly . c_str () );
     Serial.printf(" moisture. %i\n",moist);
   display.display();
   pubmoist.publish(moist);
   pubhum.publish(hum);
   pubpressure.publish(pressure);
   pubtemp.publish(temp);
   display.display();
   delay(10000);
  }
     Adafruit_MQTT_Subscribe * subscription;
while ((subscription = mqtt.readSubscription(100))){
  if(subscription==&subbutton){
    onlinebutton =atoi((char*)&subbutton.lastread);
    if(onlinebutton==1){
      digitalWrite (waterthingy,HIGH);
    }
    else{
       digitalWrite (waterthingy,LOW);
    }
  }
 
}
    duration = pulseIn(dustpin, LOW);
    lowpulseoccupancy = lowpulseoccupancy+duration;

    if ((millis()-duststarttime) >= 30000)//if the sampel time == 30s
    {
        ratio = lowpulseoccupancy/(30000*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
        if(concentration>1){
          realconceration=concentration;
        }
        else {
          Serial.printf("Conc = %0.2f\n",concentration);
        }
        Serial.printf("convertaion=%f pcs/0.01cf\n",realconceration);
        lowpulseoccupancy = 0;
        duststarttime = millis();
    }
    int slopequlatiy=air.slope();
    if (slopequlatiy== AirQualitySensor::FORCE_SIGNAL){
      Serial.printf("high pollution force signal active\n");
    }
    else if (slopequlatiy== AirQualitySensor::HIGH_POLLUTION) {
      Serial.printf("high pollution\n");
    }
    else if (slopequlatiy== AirQualitySensor::LOW_POLLUTION) {
      Serial.printf("low pollution\n");
    }
    else if (slopequlatiy== AirQualitySensor::FRESH_AIR) {
      Serial.printf("fresh air\n");
    }
}
void MQTT_connect() {
  int8_t ret;
   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

IsaacDeleon223
3 projects • 5 followers
I am currently enrolled in IoT programming 10week program in which I learn C+ coding comprehending and applying my use knowledge in projects
Contact

Comments

Please log in or sign up to comment.