Do you have the trouble of having too many lipsticks and not knowing which one to use? Try this lipstick container! It can pick out your lucky color of the day for you!
Overall Photos
Detailed Photos
Process Images and Review
First Decision Point
At first, besides randomly choosing the lipstick, I designed another feature for the container. Since it was easy for me to mess up my table after make-up, I wish the container could remind me of putting the lipstick back in its place after using it. Therefore, it would beep after 2 minutes if the room of the container was still empty. I found that if I wanted to make it, it needed much more space for the wiring part which made the container huge. Meanwhile, this feature was not as attractive as the random-choosing one, so I finally canceled it.
Second Decision Point
Since I had to connect 12 LED lights, one LCD display, and one ADXL335 analog accelerometer, I wiring part was very complicated and hard to follow. Therefore at that time, I decided to do the soldering to make it look logical and clear.
Honestly, I tried to do the soldering and finished all about it. But the results were not satisfying which made me realize soldering is not suitable for all the situations. Because there was a certain distance between each LED, it was impossible to reduce the wiring part through soldering. Also, since the wiring part is at the bottom of the container, some wires were bent which made them easy to be broken. If it was broken, I have to do the soldering again (I did it almost 5-6 times). So finally I gave up the soldering idea and just used normal breadboards to connect them.
Process Highlights
Discussion
Overall, I am really satisfied with what I created for this project. It can successfully solve my trouble of choosing which lipstick to use in the morning and make my day starts with surprise and fun lol. As an architecture student, it was not a hard part for me to build a model in both digital and physical ways and do laser cutting. The most difficult thing for me is writing the code to make my device work. It was my first time writing the code independently which made me get a deeper understanding of the logic of each step. Thanks to Zach, he explained how to turn the lights on in order and taught me how to do the random choosing process. He was so patient and encouraged me a lot which made me become confident with learning the coding language. Also, I got a better understanding of the loop function which made the LCD display show the information incorrect time.
I really enjoyed the discussion about the prototype with my classmates. They were so kind that gave me a bunch of encouragement as well as a lot of suggestions. For instance, someone suggested that I could use some tools to make the choice of lipstick based on the eye shadow I wear. I did think it is a good idea, a sensor can detect the color of eye shadow which could bring about a specific lipstick matching with all the makeup look. But what I want for the lipstick container is a totally surprising thing, you would not know any hints about which one to use before you tap the screen. A boy told me that I could add a screen to the container with some warm-hearted words on it. This suggestion was super useful so I add ‘You Look so Nice Today’ when finishing the choosing process.
If I had more time, I would add a power switch to the container to make it work only when I need it. Also, I would think about developing another type of container like the girl’s idea about matching with eye shadow. I truly think it will be cool and get in touch with many other interesting sensors and improve my coding abilities as well. Due to the limited time and energy, I could not complete all the good ideas so perfectly. I am really looking forward to the next project! I love new challenges and I believe, the new project will bring me a lot of inspiring thoughts and much more improvement about my abilities.
Technical information
Block Diagram
Schematic Diagram
Code
/* 60-223 Assistive Device Yongwen Dai Description: This code enables the movement of ADXL335 analog accelerometer to start the lights on. All the 12 lights will be on in order at the beginning and finally only one of them will be chosen randomly to be on. The LCD display shows 2 different information at beginning and end of choosing. Pin mapping: Arduino pin | type | description ------------|--------|------------- A0 input X axis of ADXL335 analog accelerometer A1 input Y axis of ADXL335 analog accelerometer A2 input Z axis of ADXL335 analog accelerometer 2 output LED light 1 3 output LED light 2 4 output LED light 3 5 output LED light 4 6 output LED light 5 7 output LED light 6 8 output LED light 7 9 output LED light 8 10 output LED light 9 11 output LED light 10 12 output LED light 11 13 output LED light 12 The following sources were consulted to create our code: https://courses.ideate.cmu.edu/60-223/s2022/tutorials/ADXL335 https://courses.ideate.cmu.edu/60-223/s2022/tutorials/I2C-lcd */ #include <Wire.h> #include <LiquidCrystal_I2C.h> /* Creates an LCD display object called "screen" with I2C address 0x27 which is 16 columns wide and 2 rows tall. */ LiquidCrystal_I2C screen(0x27, 16, 2); //pin names int light1 = 2; int light2 = 3; int light3 = 4; int light4 = 5; int light5 = 6; int light6 = 7; int light7 = 8; int light8 = 9; int light9 = 10; int light10 = 11; int light11 = 12; int light12 = 13; const int XPIN = A0; const int YPIN = A1; const int ZPIN = A2; int Y; //other variables int timeShowDecision = 2000; int timeBlink = 80; void setup() { //set input ADXL335 pins pinMode(XPIN, INPUT); pinMode(YPIN, INPUT); pinMode(ZPIN, INPUT); //set LED output pins pinMode(light1, OUTPUT); pinMode(light2, OUTPUT); pinMode(light3, OUTPUT); pinMode(light4, OUTPUT); pinMode(light5, OUTPUT); pinMode(light6, OUTPUT); pinMode(light7, OUTPUT); pinMode(light8, OUTPUT); pinMode(light9, OUTPUT); pinMode(light10, OUTPUT); pinMode(light11, OUTPUT); pinMode(light12, OUTPUT); //initialize the serial communication: Serial.begin(9600); //set words for LCD screen screen.init(); screen.backlight(); } void loop() { //LCD display will show some words to encourage you to tap the screen. screen.setCursor(2, 0); screen.print("tap HERE for"); screen.setCursor(3, 1); screen.print("a lipstick"); delay(3600); int newX =analogRead(XPIN); //read from xpin delay(50); int newY =analogRead(YPIN); //read from ypin delay(50); int newZ =analogRead(ZPIN); //read from zpin delay(50); //YPIN will change if you tap the screen to make the ADXL335 analog accelerometer move, then all the 12 lights will be on in order. if(newY - Y > 2){ digitalWrite(light1,HIGH); delay(timeBlink); digitalWrite(light1,LOW); delay(timeBlink); digitalWrite(light2,HIGH); delay(timeBlink); digitalWrite(light2,LOW); delay(timeBlink); digitalWrite(light3,HIGH); delay(timeBlink); digitalWrite(light3,LOW); delay(timeBlink); digitalWrite(light4,HIGH); delay(timeBlink); digitalWrite(light4,LOW); delay(timeBlink); digitalWrite(light5,HIGH); delay(timeBlink); digitalWrite(light5,LOW); delay(timeBlink); digitalWrite(light6,HIGH); delay(timeBlink); digitalWrite(light6,LOW); delay(timeBlink); digitalWrite(light7,HIGH); delay(timeBlink); digitalWrite(light7,LOW); delay(timeBlink); digitalWrite(light8,HIGH); delay(timeBlink); digitalWrite(light8,LOW); delay(timeBlink); digitalWrite(light9,HIGH); delay(timeBlink); digitalWrite(light9,LOW); delay(timeBlink); digitalWrite(light10,HIGH); delay(timeBlink); digitalWrite(light10,LOW); delay(timeBlink); digitalWrite(light11,HIGH); delay(timeBlink); digitalWrite(light11,LOW); delay(timeBlink); digitalWrite(light12,HIGH); delay(timeBlink); digitalWrite(light12,LOW); delay(timeBlink); //Finally the system will use Random function to make only on light be on. digitalWrite(random(2,14),HIGH); delay(timeShowDecision); //LCD display will change the words after the accomplishment of choosing. screen.clear(); screen.setCursor(2, 0); screen.print("You Look so"); screen.setCursor(2, 1); screen.print("Nice Today"); delay(10000); screen.clear(); } else { // Reset all output pins digitalWrite(light1, LOW); digitalWrite(light2, LOW); digitalWrite(light3, LOW); digitalWrite(light4, LOW); digitalWrite(light5, LOW); digitalWrite(light6, LOW); digitalWrite(light7, LOW); digitalWrite(light8, LOW); digitalWrite(light9, LOW); digitalWrite(light10, LOW); digitalWrite(light11, LOW); digitalWrite(light12, LOW); } Y = newY; }