Pomodoro Lamp
Joy Leung
Joy Leung
An overview photograph of the Pomodoro Lamp.
The Pomodoro Lamp functions as an ambient lamp that supports taking breaks after working or studying for a long period of time. The lamp's flower turning speed and color can be changed using the two dials on the front of the lamp to support the vibe that the user wants to experience when working. After a certain amount of time, the lamp will rapidly link red to remind the user to take a break.
An overview photograph of the lamp.
A detailed top view of the lamp where the flower is visible and the LED light is showing through.
How the user interacts with the product to change the speed (left dial) and the color (right dial).
An alternate view of the lamp showing an angled view of the form.
In this video, the lamp's dials are turned to show the variation in speed and light color during the 'work' state. The left dial controls the speed of the flower turning, and the right dial controls the light color produced from the LED NeoPixel Ring.
In this video, the 'break' state is shown, which is when a certain amount of 'work' time has passed and it is time for the user to take a break. This state consists of the rapidly blinking red LED Neopixel to trigger the user to take a break, get out of their seat, and walk around.
This is a 3D model in Blender created in the very early stages of ideation. The final product is quite different from this model in terms of the flower shape and the type of potentiometer.
This photo shows an overview of the wiring process in the beginning stages. The motor required a dual H-bridge motor driver, which was something new that I haven't worked with before.
My first iteration of this lamp had very large dimensions that did give plenty of space for the wiring but was unnecessary considering the size that I wanted my flower to be printed. I decided to make the box smaller to match the sizing of the flower and to have a more portable lamp.
This is a photograph of the lamp base that I 3D modeled in Fusion 360, when I was still considering using a slider potentiometer.
This is the 3D model of the flower, which was created from this tutorial: https://www.youtube.com/watch?v=KlHjHTOSgSY
Laser cutting in action of smaller, more condensed pieces for the base of the lamp.
A close-to-finished iteration of the lamp that is secured with tape and the 'stem' of the flower is not made.
The lamp had changed a bit during the process due to aesthetics and technical considerations. After my very first iteration, I realized that I had forgotten to make a hole in the back of the lamp base for the wire that connects the Arduino to my computer. When realizing this mistake, I also reconsidered the sizing of my model and the accuracy of each side's size. I certainly did not spend enough of my project creation time on the physical building of it. If I had given myself more time for the physical aspect of the model, I believe that the accuracy and cleanliness of the appearance would be more appealing. Overall, the process of creating the Pomodoro Lamp was a new experience and I learned a lot about my abilities!
Due to illness, I was unable to attend the in-class critique. However, I received some critique from Professor Zacharias. One of the critiques I received from him was that the 'break' time versus the 'work' time of the lamp could be more differentiated in terms of the output. He mentioned that he wished that the flower would stop spinning during the break time to demonstrate the difference between break and work time. He also mentioned that the start and end of the break time could have a greater differentiation to trigger the user to know when a break is starting and about to end. He suggested crazy jiggling at the end of the break to capture the user's attention. I think that these critiques are valid. I definitely would have put greater consideration into the outputs of the break time so that it would output a stronger signal to the user. Another critique I received from the Professor was regarding the physical aesthetic and construction of the lamp. He mentioned that the LEDs being shown are a little tacky and it would be better if they were hidden in the box. I considered this when creating my design, but decided to keep it a bit higher up in the form for the light to go through the translucent flower. He also mentioned that the motor shaft, which is covered with stacked wooden squares, looks unnatural and suggests creating something that looks like a flower stem. I think that this is another consideration that I was thinking about but was unable to fix due to a mixture of time constraints and poor time management.
I am happy with how the project turned out. It satisfied the goals I had for the project going into it, and I feel like I accomplished everything that I had planned to. However, after finishing the project and receiving critiques, I realized there was so much I would change or add to my lamp to satisfy ergonomic considerations, the overall user experience, and its usefulness. I am grateful to have learned so many new skills coming out of this project. One of my favorite skills was learning how to 3D model in Fusion 360 for laser cutting and 3D printing. I've always wanted to learn these skills, especially as a design major, so that I can visualize my designs in a 3-dimensional space.
I certainly have learned a lot about my capabilities surrounding all aspects of this project. I struggled a little with coding, especially when figuring out the time intervals for the work and break states. I discovered that I had to write a few lines of code at the beginning of the loop to reset the current time to 0 every time the lamp would exit the break state and start the work state again. I also learned that my time management skills could be a little poor sometimes, especially when deadlines are tight, and many other final projects are due in the same week. Next time, I would create a schedule that considers how much time needs to be spent on certain points of the project, such as giving myself more days to ideate, build the model, and maybe receive user testing from others to get some feedback on the ergonomics and functionality.
If I were to build another iteration of the Pomodoro Lamp, to reiterate what was mentioned above, I would change the output of the break state to be more alarming so that there is more of a differentiation between the two states. I would consider possibly adding a sound component to the lamp to serve as a more triggering alert to signify the start and end of a break. In addition, I would also reconsider the construction of my lamp, particularly the location of the LEDs, how the light goes through the flower form, and the addition of the grass. Perhaps making the grass shape more visually appealing by cutting the inside part to frame the circular LED light could make the design less tacky. Overall, there are a lot of considerations for a future prototype, but I am excited to apply the skills I've learned from this project to the final project!
/*
Pomodoro Lamp
Joy Leung
This code reads two potentiometer values as input and drives LED light color
and motor rotation as an output.
pin mapping:
Arduino pin | role | description
-----------------------------------------------------------
A0 input attached to the potentiometer that controls the speed of the motor.
A1 input attached to the potentiometer that controls the color of the LED NeoPixel ring.
10 output attached to the dual H-bridge motor driver that controls the motor.
11 output attached to the dual H-bridge motor driver that controls the motor.
3 output connects the LED NeoPixel to the arduino.
outside sources used:
NeoPixel code: https://forum.arduino.cc/t/how-to-control-two-rgb-led-neopixel-rings-16x-pixels-each-with-arduino-uno/527355
*/
# include <Adafruit_NeoPixel.h>
const int POTPINMOTOR = A0;
const int POTPINLED = A1;
const int MOTORPIN1 = 10;
const int MOTORPIN2 = 11;
#define NUM_PIXELS 16
#define NPPIN 3
Adafruit_NeoPixel NeoPixel(NUM_PIXELS, NPPIN, NEO_GRB + NEO_KHZ800); // new object called neopixel
unsigned long Break = 20000; //twenty seconds in milliseconds
unsigned long Interval = 50000; // 50 seconds in milliseconds
unsigned long currentMillis = 0;
void setup() {
pinMode(POTPINMOTOR, INPUT);
pinMode(MOTORPIN1, OUTPUT);
pinMode(MOTORPIN2, OUTPUT);
pinMode(NPPIN, OUTPUT);
}
int counter = 0;
void loop() {
Serial.begin(9600);
Serial.println(currentMillis);
currentMillis = millis()-(counter * (Break + Interval));
if(currentMillis >= (Break + Interval)){
counter += 1;
}
if (currentMillis >= Interval && currentMillis <= Interval + Break){// current time is >= 50 and <= 50+20
for(int i = 0; i < NUM_PIXELS; i++){
if (currentMillis % 2 == 1){
NeoPixel.setPixelColor(i, NeoPixel.Color(255, 0 ,0));
NeoPixel.show();
}
else {
NeoPixel.setPixelColor(i, NeoPixel.Color(0, 0, 0));
NeoPixel.show();
}
}
}
else {
//potentiometer controls DC motor
int PotVal1 = analogRead(POTPINMOTOR);
int MotorSpeed = map(PotVal1, 0, 1023, 0, 255);
analogWrite(MOTORPIN1, 0);
analogWrite(MOTORPIN2, MotorSpeed);
//potentiometer controls LED color
int PotVal2 = analogRead(POTPINLED);
int lightnumber = map(PotVal2, 0, 1023, 0, 5);
if (lightnumber == 0){
for(int i = 0; i < NUM_PIXELS; i++){
NeoPixel.setPixelColor(i, NeoPixel.Color(255, 0, 0)); //red
NeoPixel.show();
}
}
else if (lightnumber == 1){
for(int i = 0; i < NUM_PIXELS; i++){
NeoPixel.setPixelColor(i, NeoPixel.Color(255, 100, 0)); //orange
NeoPixel.show();
}
}
else if (lightnumber == 2){
for(int i = 0; i < NUM_PIXELS; i++){
NeoPixel.setPixelColor(i, NeoPixel.Color(255, 255, 0)); //yellow
NeoPixel.show();
}
}
else if (lightnumber == 3){
for(int i = 0; i < NUM_PIXELS; i++){
NeoPixel.setPixelColor(i, NeoPixel.Color(0, 255, 0)); //green
NeoPixel.show();
}
}
else if (lightnumber == 4){
for(int i = 0; i < NUM_PIXELS; i++){
NeoPixel.setPixelColor(i, NeoPixel.Color(0, 0, 255)); //blue
NeoPixel.show();
}
}
else if (lightnumber == 5){
for(int i = 0; i < NUM_PIXELS; i++){
NeoPixel.setPixelColor(i, NeoPixel.Color(255, 0, 255)); //purple
NeoPixel.show();
}
}
}
}