previous projects, such as tales of the visionaries and recitations had a major impact on my inspiration for the project. With the way interactive projects were made The project was meant to symbolize life continuing with new friends in a way. I mainly researched into projects that had a societal or cultural meaning and in every culture, there is this response to death. In the grieving process of death, people tend to isolate themselves from the future and look toward the past. This was in a way supposed to tell people that when a friend or person leaves, new ones will come. Newcomers won't ever replace the significance of your friends, but they will continue to fill a growing pot of life and multiply.
We knew our project required sensors, which meant they were not supposed to be covered in the slightest. There weren't many options with how we could design it. One of the designs regarded the project having the mushrooms inside, but that was rejected due to the LDR and fact it could cover the sensors. We decided to make the mushrooms and plant the interactive part of our project and wanted to cover it entirely with mushrooms. We used clay, paper, cardboard, materials that were light-weight. We also avoided the moisture sensor as it could only be activated once.
MATERIALS USED:
2 IR sensors
1 LDR
1 Micro servo
Clay
Paint
cardboard
MP3 + speakers
Potentiometer
5 LEDS
additional power supply
IR SENSOR
IR SENSOR 2
POTENTIOMETER
MP3 + SPEAKERS
EARLY STAGES
FINAL STAGES
The most significant steps in the process from my end:
soldering the LDR
The LDR needed to be on top of the pot and therefore needed to be soldered to a positive and negative wire
programming the LDR to work with the mp3 player
Coding the LDR was the most difficult part of the project. The hardware lacked the power to actually function with the mp3 as it also included a servo and i mistook it as a software issue. The LDR was hooked to pin A1, while the speakers were hooked to pin 10 and 11.
A lot of shorts occurred when the leds were connected when the extra power was connected
crafting the plant
it was supposed to be thin so it could stay upright. Painting this was a failure and therefore I resorted to basic copy white paper. I straightened it out until it appeared like a stem and taped on the end of a leaf to it.
painting and sculpting mushrooms
I wanted to paint all the mushrooms so it looked more complete. I tried to make what mushrooms were significant stand out more.
Making the plant
painting the shrooms
circuit diagram
//INCLUDES THE DF PLAYER MINI LIBRARY
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
int LDR = A1; //SET THE LDR TO A0
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
softSerial.begin(9600);
if (!myDFPlayer.begin(softSerial, /*isACK = */ false, /*doReset = */ false)) { //Use serial to communicate with mp3.
Serial.println("Error starting DFplayer");}
}
void loop() {
// put your main code here, to run repeatedly:
myDFPlayer.setTimeOut(500);
//READS THE LDR VALUE AND HAS THE IF STATEMENT
int LDR_VALUE = analogRead(LDR); //read the LDR_VALUE
LDR_VALUE = map(LDR_VALUE, 0, 1023, 0, 100); //maps the value from 0-100
LDR_VALUE = constrain(LDR_VALUE, 0, 100); //CONSTRAINS IT
//IF THERE IS A LIGHT LEVEL UNDER 20, PLAY MUSIC
if(LDR_VALUE <= 49){
myDFPlayer.start(); //start the mp3
myDFPlayer.volume(30);
}else{
myDFPlayer.pause();
};
Serial.print("LDR IS: ");
Serial.println(LDR_VALUE);
delay(10);
}
//The setup for servo that turns the mushroom
#include <Servo.h>
Servo myservo;
//Mp3 that I don't understand
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
//ir is the infrared sensor that controls led1 whose pin is 3
#define led1 3
#define ir 2
//irl is the infrared sensor that controls led2~5, whose pin is 4
#define led2 5
#define led3 6
#define led4 7
#define led5 8
#define irl 4
//The setup for the milit system for the led.
//This startTime tracks the whether the infrared sensor 2 is triggered.
//If it is triggered, the time is counted using millit.
//When for leds light up in serie, the startTime recount the wetich.
long startTime = -1;
//analog input for servo
int val;
//digital inout for the infrared sensor 1 with only 1 led
int val1;
//digital input for infrared sensor 2 wth 4 led serie
int val2;
//for infrared sensor 1 when not triggered
int prevVal1;
//for infrared sensor 2 when not triggered
int prevVal2 = HIGH;
//infrared sensor for the 1 led with four ways of blinking
int count = 0;
//infrared sensor for the 4 leds in series
int liushui = 0;
//the variables for the fading stage of led
int brightness = 0;
int fadeAmount = 10;
void setup() {
pinMode(ir, INPUT);
pinMode(led1, OUTPUT);
pinMode(irl, INPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
myservo.attach(9);
Serial.begin(9600);
}
//The input of potentialmeter under a mushroom is A0, the voltage passing through it is mapted into 180° to let the servo turn to spin another mushroom with a set of gears.
void loop() {
val = analogRead(A0);
val = map(val, 0, 1023, 0, 180);
myservo.write(val);
//Serial.println(val);It was for checking before.
delay(10);
//the transition for infrared sensor switch 1
val1 = digitalRead(ir);
if (prevVal1 == LOW && val1 == HIGH) {
count++; // Increment the count when the switch is pressed
if (count == 5) {
count = 0; // Reset the count after 4 presses
}
//For checking whether the infrared sensor returns its transition time to 0.
Serial.print("Switch pressed, count1: ");
Serial.println(count);
}
prevVal1 = val1;
delay(10);
//setup personalized functions
//If the sendor 1 is not triggered
if (count == 0) {
count0();
//If triggered once
} else if (count == 1) {
count1();
} else if (count == 2) {
count2();
} else if (count == 3) {
count3();
} else if (count == 4) {
count4();
}
//For checking the state of infrared sensor 2 and the prevVal2
Serial.println(val2);
val2 = digitalRead(irl);
//If the infrared sensor is switched on once
if (prevVal2 == HIGH && val2 == LOW) {
//staring to count the time after the transition of the switch state.
startTime = millis();
//for checking whether the time goes
Serial.println("started millis");
}
//the personalized functions
//if there is starTime, meaning that the switch is triggered, the time start to be counted
if (startTime != -1 && millis() - startTime < 1000) {
digitalWrite(led2, HIGH);
Serial.println("first second");
}
if (startTime != -1 && millis() - startTime > 1000 && millis() - startTime < 2000) {
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
Serial.println("seco second");
}
if (startTime != -1 && millis() - startTime > 2000 && millis() - startTime < 3000) {
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
Serial.println("3 second");
}
//give it a uppe limit becuse I want tohe forth led to go off after 1 second to match up with the rest.
if (startTime != -1 && millis() - startTime > 3000 && millis() - startTime < 4000){
Serial.println("last second");
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
}
//If the infrared is not switched on, nothing light up
else {
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
prevVal2 = val2;
//If the infrared is not triggered, nothing lights up.
}
//Four states of led
void count0() {
digitalWrite(led1, LOW);
}
void count1() {
digitalWrite(led1, HIGH);
}
void count2() {
digitalWrite(led1, HIGH);
delay(30);
digitalWrite(led1, LOW);
delay(30);
}
void count3() {
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
analogWrite(led1, brightness);
delay(50);
}
void count4() {
digitalWrite(led1, HIGH);
digitalWrite(led1, HIGH);
//delay
delay(300);
digitalWrite(led1, LOW);
delay(300);
}
//The setup for servo that turns the mushroom
#include <Servo.h>
Servo myservo;
//Mp3 that I don't understand
//INCLUDES THE DF PLAYER MINI LIBRARY
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
int LDR = A1; //SET THE LDR TO
//ir is the infrared sensor that controls led1 whose pin is 3
#define led1 3
#define ir 2
//irl is the infrared sensor that controls led2~5, whose pin is 4
#define led2 5
#define led3 6
#define led4 7
#define led5 8
#define irl 4
//The setup for the milit system for the led.
//This startTime tracks the whether the infrared sensor 2 is triggered.
//If it is triggered, the time is counted using millit.
//When for leds light up in serie, the startTime recount the wetich.
long startTime = -1;
long LDR_startTime = -1;
//analog input for servo
int val;
//digital inout for the infrared sensor 1 with only 1 led
int val1;
//digital input for infrared sensor 2 wth 4 led serie
int val2;
//for infrared sensor 1 when not triggered
int prevVal1;
//for infrared sensor 2 when not triggered
int prevVal2 = HIGH;
//infrared sensor for the 1 led with four ways of blinking
int count = 0;
//infrared sensor for the 4 leds in series
int liushui = 0;
//the variables for the fading stage of led
int brightness = 0;
int fadeAmount = 10;
void setup() {
pinMode(ir, INPUT);
pinMode(led1, OUTPUT);
pinMode(irl, INPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
myservo.attach(9);
Serial.begin(9600);
softSerial.begin(9600);
if (!myDFPlayer.begin(softSerial, /*isACK = */ false, /*doReset = */ false)) { //Use serial to communicate with mp3.
Serial.println("Error starting DFplayer");}
}
//The input of potentialmeter under a mushroom is A0, the voltage passing through it is mapted into 180° to let the servo turn to spin another mushroom with a set of gears.
void loop() {
val = analogRead(A0);
val = map(val, 0, 1023, 0, 180);
myservo.write(val);
//Serial.println(val);It was for checking before.
delay(10);
//the transition for infrared sensor switch 1
val1 = digitalRead(ir);
if (prevVal1 == LOW && val1 == HIGH) {
count++; // Increment the count when the switch is pressed
if (count == 5) {
count = 0; // Reset the count after 4 presses
}
//For checking whether the infrared sensor returns its transition time to 0.
Serial.print("Switch pressed, count1: ");
Serial.println(count);
}
prevVal1 = val1;
delay(10);
//setup personalized functions
//If the sendor 1 is not triggered
if (count == 0) {
count0();
//If triggered once
} else if (count == 1) {
count1();
} else if (count == 2) {
count2();
} else if (count == 3) {
count3();
} else if (count == 4) {
count4();
}
//For checking the state of infrared sensor 2 and the prevVal2
Serial.println(val2);
val2 = digitalRead(irl);
//If the infrared sensor is switched on once
if (prevVal2 == HIGH && val2 == LOW) {
//staring to count the time after the transition of the switch state.
startTime = millis();
//for checking whether the time goes
Serial.println("started millis");
}
//the personalized functions
//if there is starTime, meaning that the switch is triggered, the time start to be counted
if (startTime != -1 && millis() - startTime < 1000) {
digitalWrite(led2, HIGH);
Serial.println("first second");
}
if (startTime != -1 && millis() - startTime > 1000 && millis() - startTime < 2000) {
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
Serial.println("seco second");
}
if (startTime != -1 && millis() - startTime > 2000 && millis() - startTime < 3000) {
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
Serial.println("3 second");
}
//give it a uppe limit becuse I want tohe forth led to go off after 1 second to match up with the rest.
if (startTime != -1 && millis() - startTime > 3000 && millis() - startTime < 4000){
Serial.println("last second");
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
}
//If the infrared is not switched on, nothing light up
else {
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
}
prevVal2 = val2;
myDFPlayer.setTimeOut(500);
//READS THE LDR VALUE AND HAS THE IF STATEMENT
int LDR_VALUE = analogRead(LDR); //read the LDR_VALUE
LDR_VALUE = map(LDR_VALUE, 0, 1023, 0, 100); //maps the value from 0-100
LDR_VALUE = constrain(LDR_VALUE, 0, 100); //CONSTRAINS IT
//IF THERE IS A LIGHT LEVEL UNDER 20, PLAY MUSIC
long LDR_startTime = millis();
if(LDR_VALUE <= 20 && LDR_startTime > 5000 ){
myDFPlayer.start(); //start the mp3
myDFPlayer.volume(30);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led1, HIGH);
}else{
myDFPlayer.pause();
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led5, LOW);
digitalWrite(led4, LOW);
digitalWrite(led1, LOW);
}
Serial.println(LDR_startTime);
//If the infrared is not triggered, nothing lights up.
}
//Four states of led
void count0() {
digitalWrite(led1, LOW);
}
void count1() {
digitalWrite(led1, HIGH);
}
void count2() {
digitalWrite(led1, HIGH);
delay(30);
digitalWrite(led1, LOW);
delay(30);
}
void count3() {
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
analogWrite(led1, brightness);
delay(50);
}
void count4() {
digitalWrite(led1, HIGH);
digitalWrite(led1, HIGH);
//delay
delay(300);
digitalWrite(led1, LOW);
delay(300);
}
The project was meant to be an explorative situation and it succeeded. People are design to explore new people in the forms of mushrooms, searching for ways to move on. In a way, the MP3 playing music is a form of comforting you with humor when the plant has gotten wilted to a point where it rots and can no longer stand on its own. This project doesn't appear as symbolic as it was initially intended to be, but it makes people want to engage with their environment and senses. When it comes to the issues with programming, it is important to reach out to someone with more knowledge in the situation rather than attempting to work on it on your own, as that cut into the time I had. After the project, I decided to program the LEDs to work with the LDR, which was intended to make them all light up.
Final video/ presentation
cropped out faces as much as possible
Project Analysis/breakdown
shows where the interactivity is and how to trigger it