A smart water plant that can water itself.
my smart water plant can tell the difference between moisture, temp, pressure, humidity, date, time and dust/polluted. air.
the online button also always me to water my plant when I'm away allowing remove access. I've also allowed for a green led to light up with all the valuables are stable. one unique feature was the watering time. the plant is a neu Mishma. meaning this plant need extra water to grow properly and with the online button activating and automatic pump it goes for 5-6 more seconds give the water the plant needs.
/*
* 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;
}
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
Comments
Please log in or sign up to comment.