Moisture sensor tells an LED to blink and uses IFTTT to send an message to your phone when your plant needs water.
Things used in this project
Hardware components
Software apps and online services
IFTTT Maker service
ThingSpeak API
Story
Most people have one or more potted plants in their house that they need to water on a regular basis. The problem is that unless your a professional florist, you don't really know when each plant needs to be watered. To fix this problem we developed a system that sends you a notification on your phone when your plant is getting thirsty.
First, the moisture sensor was wired to the Photon and placed in the potted plant. The Photon was then programmed to publish an event called “moisturePercentage” when the sensor read a moisture level that was less than 20. Meanwhile, the Electron would subscribe to this event, and when it was published and would publish its own events called "plantStatus" and "handshake"; as well as change the value of a variable called thirsty from true to false. IFTTT would subscribe to “plantStatus” and send a notification to the user’s IFTTT app, while the Photon would subscribe to the "handshake" event and would stop publishing “moisturePercentage” when it heard it. In the electron code, there was a while loop that would cause its LED to start blinking while the variable thirsty=true. This provided another form of notification for the user in case they did not have their cell phone with them. When the plant was water, the moisture level would rise above 45 causing the Photon to publish another event called "plantWatered", which the Electron would subscribe to. This would cause the thirsty variable to be set to false, stopping the electron LED from flashing. After some time, the plant would absorb the water and the process would start all over again.
We decided that it would be interesting to see how the moisture level changed as the plant absorbed the water. So we used things speak to plot the moisture level every time the Photon recorded it. We found out that the blood-root plant we had chosen drank the water we gave it very quickly and would have to be watered at least once every other day.
Schematics
Code
Photon Code
int boardLed = D7; //LED D7 for testing purposes
int moisture_pin = A1; //connection point for moisture sensor
bool messageSent = false; //variable for checking if notification has been sent to phone
String plantWatered = "Your plant has been watered and is moist";
void setup() {
pinMode(boardLed,OUTPUT); //output to turn on LED for setup
pinMode(moisture_pin,INPUT); //Input from moisture sensor
//Flashes LED to indicate that flash is successful.
digitalWrite(boardLed,HIGH);
delay(2000);
digitalWrite(boardLed,LOW);
delay(2000);
digitalWrite(boardLed,HIGH);
delay(2000);
digitalWrite(boardLed,LOW);
delay(2000);
}
void loop() {
//digitalWrite(boardLed,HIGH);
// Now we'll take some readings...
int moisture_analog = analogRead(moisture_pin); // read capacitive sensor
float moisture_percentage = (100 - ((moisture_analog/4095.00) * 100 ));
Particle.subscribe("handshake", handShake, "34002f000a47373336373936"); //Subscribe command to listen to other device
if (moisture_percentage <= 22 && messageSent == false){ //Checks if moisture percentage is below threshold and also checks if the water message has been sent
Particle.publish("moisturePercentage", String(moisture_percentage),60,PUBLIC); //Publishes for message to be sent
}
if (moisture_percentage > 40 && messageSent == true){ //Checks if moisture levels have gone back up and also checks if message has been sent
Particle.publish("plantWatered", plantWatered, 60, PUBLIC);
messageSent = false; //If message sent, and plant watered, it resets the program so that the function above will run
}
Particle.publish("plantStatus_percentage", String(moisture_percentage),60,PUBLIC); //Publish command for logging data and sending it to thingspeak
//digitalWrite(boardLed,LOW);
delay(15000);
}
void handShake( const char *event, const char *data){ //If the message has been sent, it sets messageSent to true
messageSent = true;
}
Electron Code
int led=D7;//led that indicates the plant needs water
bool sent=false;// has the notification to water the plant been sent
bool thirsty=false;//whether or not the plant needs water
void setup()
{
pinMode(led,OUTPUT);
}
void loop()
{
Particle.subscribe("moisturePercentage",waterPlant,"3c0026001747373335333438");
while(thirsty==true)
{//while the plant needs water the LED flashes and the electron listens for when the water level goes up
digitalWrite(led,HIGH);
delay(500);
digitalWrite(led,LOW);
delay(500);
Particle.subscribe("plantWatered",breakloop,"3c0026001747373335333438");// checks for when the plant has been waterd.
}
delay(5000);// this loop every five minutes
}
void waterPlant( const char *event, const char*data)
{
Particle.publish("plantStatus","thirsty",60,PUBLIC);//sends a message to IFTTT to notify me to water my plants.
sent=true;
Particle.publish("handshake","sent",60,PUBLIC);// notifies the photon that the message has been sent
thirsty=true;
}
void breakloop( const char *event, const char*data)// changes thirsty to false to break the while loop and stop the led from flashing
{
thirsty=false;
sent=false;
}