Generally we associate life with heartbeat. But with plants, we do not know whether they are alive unless they fall. I aim to create a plant which has an emotional connection with the user through the perception of life displayed as a beating heart.
When we see an animal, we discern that it is living by the movement of its lungs as it is breathing. This innate movement is always intuitive to suggest that something has life. The rate at which this movement occurs is also indicative of the state of the living thing.
Considering the case of a plant which one can grow in a pot. You water the plant hoping that it will grow but you do not know whether it is alive or dead.
Wouldn't it be great if you could see the plant having a heartbeat that tells how healthy it is?
That's why I set out to make a plant with a heart!
I wanted to enchant the plant with glanceability (to know how healthy it is) and loveability (by giving it life through moving parts)
The idea was conceptualized as heartbeat showing the different levels of moisture of the soil in the plant pot as a measure of it's health. The concept conveyed information about the health of the plant by 2 ways
1. Movement of a membrane: The rate at which the membrane moves indicates the health which in turn is the water content in the soil. Too much water will cause the membrane to move fast whereas too low water content in soil will cause the movement to be slow. A gentle movement indicates that the plant is healthy and no movement indicates that the plant is dead
2. LED light: A LED will glow in different colors indicating the health of the plant. Red color for too low water, blue color for too much water and green for sufficient water content in the soil. The LED turns off when the plant is dead.
With the challenge of creating a plant's heartbeat, I brainstormed for the ways and materials for displaying the movement discussed earlier. I finally decided to go ahead with making a foam core box model with a flexible membrane using surgical gloves to make a heart box. I validated the movement of the flexible membrane by using a servo motor.
From the prototype above, following observations were made
These improvement opportunities were worked on and implemented on the final prototype.
The aesthetics of the prototype was improved for better visibility of the membrane movement and the LED light. Also, a touch button was incorporated which will send the real-time moisture value reading on to an online spreadsheet.
Link of the spreadsheet:
https://docs.google.com/spreadsheets/d/1WE28CpKEqx0S5XC9YLMaoOgCNGyP_xg7DRrJ2KJfVK0/edit?usp=sharing
Process Flow:
The circuit was made as per the circuit diagram below.
List of Components:
Amount | Part Type | Properties |
---|---|---|
1 | Particle Argon | variant variant 3 |
1 | Basic Servo | |
1 | Basic Force Sensing Resistor (FSR) | package THT; sensing area diameter .5 " |
1 | RGB LED (com. anode, rbg) | package 5 mm [THT]; pin order rbg; polarity common anode; rgb RGB |
4 | 220 Ω Resistor | package THT; tolerance ±5%; bands 4; resistance 220Ω; pin spacing 400 mil |
1 | 10k Ω Resistor | package THT; tolerance ±5%; bands 4; resistance 10kΩ; pin spacing 400 mil |
Source code for the program:
int redPin = D2; // RED pin of the LED to PWM pin **d2**
int greenPin = D3; // GREEN pin of the LED to PWM pin **d3**
int bluePin = D4; // BLUE pin of the LED to PWM pin **D4**
int fsrPin=A2; //Fsr pin initialization
int fsrReading=0; //variable for reading fsr sensor
int moistPin=A1;//initializing moisture sensor pin
int moistVal=0;//variable for reading moist sensor
int moistMax=1500;//variable for reading maximum moisture in the soil
int moistMin=800;//variable for reading minimum moisture in the soil
int redValue=255; // Brightness of red LED
int greenValue=255; // Brightness of green LED
int blueValue=255; // Brightness of blue LED
Servo heartbeat;//define the servo motor
int moisture=0;//Moisture value to be logged in the google sheets
void setup() {
Particle.variable( "SoilReading", moistVal );//Display actual soil moisture sensor reading
Particle.variable( "Moisture", moisture );//Display the moisture value mapped from the actual sensor reading
Particle.variable( "Button", fsrReading );//Display the FSR button reading
heartbeat.attach( D5 );
pinMode( redPin, OUTPUT ); //pin mode initialization for red pin
pinMode( greenPin, OUTPUT ); //pin mode initialization for green pin
pinMode( bluePin, OUTPUT ); //pin mode initialization for blue pin
analogWrite(redPin, 255);//Initializing red pin to off state
analogWrite(greenPin, 255);//Initializing green pin to off state
analogWrite(bluePin, 255);//Initializing blue pin to off state*/
Particle.function("MaxMoistLevel", setmoistMax);//Get user input for moistMax variable from console
Particle.function("MinMoistLevel", setmoistMin);//Get user input for moistMin variable from console
}
int setmoistMax( String command )
{
// get the maximum moisture level from console
moistMax= command.toInt();
return 1;
}
int setmoistMin( String command )
{
// get the maximum moisture level from console
moistMin= command.toInt();
return 1;
}
void setRGBLED(int red,int green,int blue) //function for setting the RGB LED color
{
analogWrite(redPin, red); //output the red led
analogWrite(greenPin, green);//output the green led
analogWrite(bluePin,blue);//output the blue led
}
void loop() {
fsrReading= analogRead(fsrPin);
moistVal = analogRead(moistPin);
moisture=map(moistVal,0,4095,0,100);
if(moistVal<=moistMax&&moistVal>=moistMin)//check if moisture is in the optimum range
{
setRGBLED(255,0,255);//set green color
heartbeat.write(180);
delay(300);
heartbeat.write(145);
delay(300);
}
if(moistVal>moistMax)//check if the moisture is very high
{
setRGBLED(0,255,255);//set red color
heartbeat.write(180);
delay(120);
heartbeat.write(155);
delay(120);
}
if(moistVal<moistMin && moistVal>30)//check if the moisture is very low
{
setRGBLED(255,255,0);//set blue color
heartbeat.write(180);
delay(1000);
heartbeat.write(145);
delay(1000);
}
if(moistVal<=30)//check if no moisture i.e., the plant is dead
{
setRGBLED(255,255,255);//switch off the LED
delay(10000);
}
if(fsrReading>3000)//check if fsr is pressed
log_to_spreadsheet();//log the moisture value in the spreadsheet
}
int last_published = -1;
void log_to_spreadsheet( )
{
// check if 1 minute has elapsed
if( last_published + 60000 < millis() ){
Particle.publish("Moisture_Value",String(moisture));//publish the moisture value
last_published = millis();
}
}
Click to Expand