This is a project to promote productivity by creating a “punishment” if I look at my phone, and a “reward” if I go long enough without looking at it.
This is an overall photo of my project; this includes the tree and the phone cover as well as the wiring that makes all of it work.
This is a picture of the main tree alone; this was laser cut using white acrylic, and is the focal point of the project.
This is what the back of the tree looks like; there are LEDs hot glued to the back that will light up eventually.
This is the inside of the phone cover; there is a light sensor (that will probably not be used) and an accelerometer that checks to see if you move the cover to access your phone.
Here is a gif displaying the “success” reaction (when the person manages to wait the full time length without distraction)- followed by a wait, then the “failure” reaction (what happens when/if the person gets distracted and tries looking at their phone).
Process
Initially I had the (ambitious) idea of creating about 5 trees that could be raised at a controlled rate, and all would “grow” and eventually all create a “forest.” The major roadblock I had with that idea was finding out that making things go up and down (especially at a controlled rate) is not trivial- it requires a pulley system to make things go up and down, and it requires a stepper motor to make things move at a controlled rate. Unfortunately, a stepper motor is quite heavy and somewhat large- which convinced me that it was probably impractical to have 5 different stepper motors all moving these trees. I also didn’t think it would really be doable- or visually attractive- to have the stepper motor hovering above where the tree would be lifted, so I thought of creating a pole for a string for the pulley to go over, so the motor could be hidden within a box on ground level.
This is a schematic of my original idea; you can see how the tree was supposed to emerge from a hole, and how the stepper motor was supposed to be hidden.
My work came to another halt as I tried to understand how to laser cut everything I needed to- I don’t have permission to laser cut on my own, so I would need to try and make the one hour a day that the laser cutter open hours were available to laser cut- as well as try to learn the software needed to create my designs. By the end, I managed to learn more; but the day before, I still had not created the gears needed to be put around the stepper motor, or the box that everything would hide underneath. I decided that I was making this too large an undertaking and rethought my idea; I had all the code working, so I could keep the concept and just change the execution.
I changed ideas- instead of having a physical tree “grow,” there would be a large tree already standing that would symbolically “grow”- with lights going up the tree as time passed to show that time is passing. If I looked at my phone and “failed” it would flash red lights, and if I managed to not procrastinate I would “succeed.”
Here is a crude diagram of my final idea- in this sketch, I feature about 11 lights on the tree, and show where I chose to put them, and how long I want each one to take before lighting up.
An unexpected difficulty that I did not anticipate was the wiring and the length of time it would take to solder- each LED needs an input and an output- so 22 wires for that- and each LED also needs a resistor (of 330 ohms), so that was 11 more resistors that I also needed to solder onto my breadboard. This photo is a picture of the mess of wires that took place about halfway through the soldering process.
Discussion
In the crit, I got a few responses, such as: “I don’t fully understand the purpose of the light sensor”. This made me evaluate the purpose of including a light sensor as well; initially, I thought that if the person was to click on their phone or move it that the program would “fail”, however with a cover it is impossible for someone to click their phone without moving the cover. I think that trying to incorporate a light sensor overcomplicated the project and didn’t match my purpose; so I would get rid of the code that involved lighting and remove the light sensor- in the circuit diagram I didn’t include it because it lost its purpose as is.
I also got a response saying “I really liked the concept, but maybe you could make another tree for the back to hide the wiring and lights”. I really liked this comment, because I never thought of adding a back to this project- I only envisioned it being 2D with a front and not a back that would be used. I also imagined hiding the majority of the wiring with another box, that would also hide the breadboard and the Arduino. After creating the extra box with the material I have, I will see if I have enough to create a back for what I have now- I think it would make my project cleaner and more attractive in other locations.
Frankly, I am not totally satisfied with how my project came out. I really like how my tree and phone cover came out, but the extra wiring is very off-putting. In addition, during the crit my code didn’t fully work because I forgot to add the wiring of the accelerometer. I consider this project unfinished because I want to work at it until it both looks attractive and functions well consistently.
That being said, I learned a ton in this process. One of the things I learned is that moving things are more difficult than I anticipated. I also learned how to create my own laser cutting file- something that I think may come in handy in the future for my own projects. Due to all the soldering I did, I got a lot of practice and got to work on proper soldering techniques. This project was frankly frustrating at many points, and I am the type who hates having to downscale (like when I changed directions from having 5 moving trees to 1 large stationary tree), but I’m very grateful for learning the different difficulties that comes with creating a project. Next project I think I will focus on all the hardware first, especially all the sizing/laser cutting things- and get more help earlier when I run into something I am more unfamiliar with.
I still plan to work more on this project- I want to create a box, or some kind of container, that can hold the wiring, breadboard, and Arduino in a way that is attractive. I want to make sure all the lights on the tree are bright as well- and maybe add an LED strip to make there be more lights and a more dramatic effect. I also want to learn how to connect my project to a battery pack so I may use it to study when I’m not near my computer. Also as of right now the timer and the button are in inconvenient spots; I would integrate them into the box that I will be creating.
//Megan Roche //Productivity Tree //This is the code to create a "tree" that has lights that help you stay productive. A list of the inputs/outputs and what they do are below. //what is needed (input): mute button, potentiometer (timer), set time button, maybe second timer? //what is needed (input sensors): photosensor (dramatic change), accelerometer (dramatic change) //what is needed (output): various lights? all on string, motors that move gradually //different effects: // if set button pressed, start timer for whatever potentiometer is at // use internal clock and compare, have timer be unsigned long // if dramatic change happens with either sensor, then immediately "quit" // if "quit", then have motors (trees) go all the way down // if not "quit", then have motors continue moving gradually #include <AccelStepper.h> unsigned long timer; const int LIGHTONE = 0; const int LIGHTTWO = 1; const int LIGHTTHREE = 2; const int LIGHTFOUR = 6; const int LIGHTFIVE1 = 5; const int LIGHTFIVE2 = 9; const int SLIGHT1 = 3; const int SLIGHT2 = 7; const int SLIGHT3 = 11; const int fLight1 = 4; const int fLight2 = 10; //lights 0-7,9-11 int secLight = 0; int thirdLight = 0; int fourthLight = 0; int fifthLight = 0; const int POTTIMER = A0; const int SETBUTTON = 8; const int X = A5; const int Y = A4; const int Z = A3; int moveThresh = 1000; int currpos = 0; //const int PHOTOSENS = A2; const int ACCEL = 12; //two things are looking at the accelerometer //const int MOT1 = 10; const int numRots = 3; unsigned long duration = 0; int lightThresh = 1000; bool timerGoing = false; bool failure = false; unsigned long timeStart = 0; bool lightsON = false; int timeForEach = 0; //4 steps/revolution rn //const int steps_needed = 50; //const int STEP_PIN = 11; //const int DIR_PIN = 10; //const int fLight = 2; //const int sLight = 3; //this creates an object myMotor //AccelStepper myMotor(1, STEP_PIN, DIR_PIN); void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(LIGHTONE,OUTPUT); pinMode(LIGHTTWO,OUTPUT); pinMode(LIGHTTHREE,OUTPUT); pinMode(LIGHTFOUR,OUTPUT); pinMode(LIGHTFIVE1,OUTPUT); pinMode(LIGHTFIVE2,OUTPUT); pinMode(SLIGHT1,OUTPUT); pinMode(SLIGHT2,OUTPUT); pinMode(SLIGHT3,OUTPUT); pinMode(fLight1,OUTPUT); pinMode(fLight2,OUTPUT); pinMode(POTTIMER,INPUT); pinMode(SETBUTTON,INPUT_PULLUP); pinMode(PHOTOSENS,INPUT_PULLUP); pinMode(ACCEL,INPUT); //digitalWrite(LIGHTFOUR,HIGH); //digitalWrite(SLIGHT1,HIGH); //digitalWrite(SLIGHT3,HIGH); //pinMode(MOT1,OUTPUT); //pinMode(fLight,OUTPUT); //pinMode(sLight,OUTPUT); //myMotor.setAcceleration(500); } int failed() { Serial.println(analogRead(PHOTOSENS)); Serial.println(analogRead(ACCEL)); Serial.println("FAILED"); timerGoing = false; digitalWrite(fLight1,HIGH); digitalWrite(fLight2,HIGH); delay(500); digitalWrite(LIGHTFIVE1,LOW); digitalWrite(LIGHTFIVE2,LOW); delay(500); digitalWrite(LIGHTFOUR,LOW); delay(500); digitalWrite(LIGHTTHREE,LOW); delay(500); digitalWrite(LIGHTTWO,LOW); delay(500); digitalWrite(LIGHTONE,LOW); delay(500); digitalWrite(fLight1,LOW); digitalWrite(fLight2,LOW); } int success() { Serial.println("SUCCEEDED"); timerGoing = false; for(int a = 0; a < 5; a++) { if(lightsON == false) { digitalWrite(SLIGHT1,HIGH); digitalWrite(SLIGHT2,HIGH); digitalWrite(SLIGHT3,HIGH); digitalWrite(LIGHTONE,HIGH); digitalWrite(LIGHTTWO,HIGH); digitalWrite(LIGHTTHREE,HIGH); digitalWrite(LIGHTFOUR,HIGH); digitalWrite(LIGHTFIVE1,HIGH); digitalWrite(LIGHTFIVE2,HIGH); lightsON = true; } else { digitalWrite(SLIGHT1,LOW); digitalWrite(SLIGHT2,LOW); digitalWrite(SLIGHT3,LOW); lightsON = false; } delay(1000); } if(lightsON == true) { digitalWrite(SLIGHT1,LOW); digitalWrite(SLIGHT2,LOW); digitalWrite(SLIGHT3,LOW); } //delay(3000); //failed(); } //0-1023 void loop() { // put your main code here, to run repeatedly: //Serial.println(digitalRead(SLIGHT2)); if(digitalRead(SETBUTTON) == LOW && timerGoing == false) { timeStart = millis(); //changing duration for testing purposes; turn back to 3 * analogRead after this duration = ((analogRead(POTTIMER))/3.0)*1000; //myMotor.moveTo(steps_needed); int xpos = analogRead(X); int ypos = analogRead(Y); int zpos = analogRead(Z); currpos = (xpos+ypos+zpos)/3; moveThresh = currpos + 10; Serial.print("potentiometer reading: "); Serial.println(analogRead(POTTIMER)); Serial.print("duration (in seconds) is "); Serial.println(duration/1000); Serial.print("X position: "); Serial.println(analogRead(X)); Serial.print("Y position: "); Serial.println(analogRead(Y)); Serial.print("Z position: "); Serial.println(analogRead(Z)); Serial.print("average position: "); Serial.println((xpos+ypos+zpos)/3); timeForEach = (duration)/5; //myMotor.setSpeed((4*numRots)/(duration/1000)); digitalWrite(LIGHTONE,HIGH); secLight = timeForEach; thirdLight = timeForEach * 2; fourthLight = timeForEach * 3; fifthLight = timeForEach * 4; Serial.print("light sensor: "); Serial.println(analogRead(PHOTOSENS)); timerGoing = true; //find the range for potentiometer, then change output into range 0-1hour } if(timerGoing == true && (analogRead(PHOTOSENS) < lightThresh) && millis() < (timeStart+duration)) { Serial.print("photo "); Serial.println(analogRead(PHOTOSENS)); Serial.print("accel "); Serial.println(analogRead(ACCEL) - moveThresh); Serial.println(analogRead(PHOTOSENS) < lightThresh || analogRead(ACCEL) > moveThresh); //failed(); timerGoing = false; } if(timerGoing == true && millis() >= (timeStart+duration)) { success(); timerGoing = false; } if(timerGoing == true && digitalRead(LIGHTTWO) == LOW && millis() >= (timeStart + secLight)) { digitalWrite(LIGHTTWO,HIGH); } if(timerGoing == true && digitalRead(LIGHTTHREE) == LOW && millis() >= (timeStart + thirdLight)) { digitalWrite(LIGHTTHREE,HIGH); } if(timerGoing == true && digitalRead(LIGHTFOUR) == LOW && millis() >= (timeStart + fourthLight)) { digitalWrite(LIGHTFOUR,HIGH); } if(timerGoing == true && (digitalRead(LIGHTFIVE1) == LOW || digitalRead(LIGHTFIVE2) == LOW) && millis() >= (timeStart + fifthLight)) { digitalWrite(LIGHTFIVE1,HIGH); digitalWrite(LIGHTFIVE2,HIGH); } }
Leave a Reply
You must be logged in to post a comment.