Front view of Study Buddy, which is plugged into power and set to study mode.
This device helps the user stay productive during work periods. When you study with Studdy Buddy, a countdown to breaktime begins. Once the clock hits 0 seconds left, the user can flip the switch to start the breaktime countdown, and Study Buddy will put down his book. However, once breaktime is over, Study Buddy will sound the alarm and make a high pitched noise that can only be turned off by flipping the switch back to study time. Once study time is re-activated, Study Buddy picks up his book again to study with you.
Overall photo of Study Buddy taking a break
Wire attached to servo arm is also attatched to a dowel acting as an arm joint. This allows the mechanism to work as intended!
Taking a break with Study Buddy by watching some Netflix
Working on my final project with Study Buddy
In this video, Study Buddy is wrapping up his study session. He is holding his book in the upright position. Once the countdown hits 0, the screen changes to say "Let's take a break!". Study Buddy is now waiting for the lever to be flipped in order to switch to breaktime. Once flipped, Study Buddy puts his book down.
In this video, Study Buddy is wrapping up his breaktime. He is resting his book on his legs. Once the countdown hits 0, the screen changes to say "GET TO WORK >:(" and the buzzer starts to make noise. Study Buddy is now waiting for the lever to be flipped in order to switch back to study time. Once flipped, Study Buddy picks his book back up and the buzzer becomes silent again.
Inital brainstorming for potential mechanism designs. I considered using pulley system or gears and adding a backpack to Study Buddy if the parts wouldn't fit.
Inital prototype of the mechanism for the book. This process took a few hours, as I experimented with potential solutions.
Lasercut and assembled the pieces for the device. I pivoted from doing a 3D printed design for Study Buddy for time efficiency and for a more cohesive design.
Attempt at using the e-ink display. I wanted to use the display for better aesthetics, but ultimately switched to an LCD screen due to faster refresh time and better compatibility with the Arduino Uno.
Inserting the hardware into the box. I learned a lot about cable management for this.
One positive critique that I received was: "The fact that the beep is actually quite loud means that this thing really, actually functions to embarrass you into being careful to end your break as soon as you’re supposed to. That’s a great feature." I really appreciated this critique because it showed that I did achieve the goal that I had set out to achieve when I first came up with this idea. One negative critique that I received was: "The toggle switch could have been properly panel mounted, which would have made it more physically stable. This requires drilling a smaller hole for the switch, and using a nut from the top side to hold it in place." I definitely agree with this critque as well. I had originally hoped to have the time to properly mount the switch, but due to time constraints I was not able to have this task completed.
I am happy with how the Study Buddy came out. It satisfied my goals of creating something that is both functional and cute. I think that the final design for the Study Buddy was very close to what I had envisioned. In particular, I am very proud of the mechanism that I created for the arms, as it was a challenge that was very satisfying to overcome. The only part that I am not completely satisfied with is the fact that I was not able to fit the screen to the box, as I originally cut the front pane of the box to fit the e-ink display rather than the LCD.
From this project, I learned that I enjoy the process of prototyping mechanisms, as it was the most challenging part of building the Study Buddy for me. It was a surprisingly creative endeavor, and I relied on my imagination a lot for envisioning how the motor will fit inside the final product. I also learned that I need to re-route my work when I hit major setbacks. In particular, I was stuck on trying to make the display work for me while I was working on this project. Ultimately, I learned from speaking to the professor that the display itself is not completely compatible with an Arduino Uno and also has a very slow refresh rate, which implies that I should not have requested the part. As advice to my past self, I would ask for more information before diving right into whatever it is that I am new to.
I don't expect to build another iteration of this project, but I do see myself potentially cutting and installing a back panel for this project, as well as properly mounting the toggle switch. I would like to install hinges to the back panel so that I can easily readjust wiring if needed, but still be able to hide all the guts inside the box otherwise. Additionally, I would like to fix the issue with the blinking box on the screen, as I'm not completely sure where that came from in my code.
/*
Project Title: Study Buddy
Author: Michelle Chen
Description: Study Buddy studies with you and quietly counts down to breaktime. Once time is up, you flip the switch to start breaktime. Study Buddy will put down his book, but once time is up, Study Buddy's buzzer will go off until you flip the switch back to study
time, where he will pick up his book to start reading again.
Pin mapping:
Arduino pin | role | details
------------------------------
4 input Toggle Switch (aka lever)
11 output Buzzer
13 output Servo Motor
Released to the public domain by the authors, March 2025
Michelle Chen, mfchen@andrew.cmu.edu
*/
/* Pin mapping section of code, creating variables to store
pin numbers. Note that the "const int" data type is used
instead of plain "int" because the pin numbers are
constant--they will never change in the code.
All-caps names are used by convention for variables whose
values won't change.
*/
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C screen(0x27, 16, 2);
Servo motor;
const int MOTORPIN = 13,
BUZZERPIN = 11,
LEVERPIN = 4,
STUDYTIME = 1,
BREAKTIME = 1,
ONESEC = 1;
int leverPos,
timeRemaining;
void setup() {
motor.attach(MOTORPIN);
Serial.begin(9600);
pinMode(LEVERPIN, INPUT);
pinMode(BUZZERPIN, OUTPUT);
// initialize the screen
screen.init();
screen.backlight();
}
void loop() {
leverPos = digitalRead(4);
digitalWrite(BUZZERPIN, LOW);
if (leverPos == 1){
// study time!
motor.write(100);
Serial.println(" reached!");
for (timeRemaining = STUDYTIME * 60; timeRemaining >= 0; timeRemaining--) {
int minutes = timeRemaining / 60;
int seconds = timeRemaining % 60;
motor.write(100);
screen.clear();
screen.home();
screen.print("studying... ");
screen.setCursor(0, 1);
screen.print(String(minutes) + ":" + (seconds < 10 ? "0" : "") +
String(seconds));
delay(1000);
Serial.println("studying" + String(timeRemaining));
}
// once the time is up:
while (leverPos == 1){
screen.clear();
screen.home();
screen.print("It's break time!");
screen.setCursor(0, 1);
screen.print(":>");
delay(50);
// check that the lever is still not flipped
leverPos = digitalRead(4);
Serial.println("lever:" + String(leverPos));
}
}
else{
// break time!
motor.write(170);
Serial.println(" reached!");
for (timeRemaining = STUDYTIME * 60; timeRemaining >= 0; timeRemaining--) {
int minutes = timeRemaining / 60;
int seconds = timeRemaining % 60;
motor.write(170);
Serial.println("relaxing" + String(timeRemaining));
screen.clear();
screen.home();
screen.print("Let's take a break!");
screen.setCursor(0, 1);
screen.print(String(minutes) + ":" + (seconds < 10 ? "0" : "") +
String(seconds));
delay(1000);
}
// once time is up:
while (leverPos == 0){
digitalWrite(BUZZERPIN, HIGH);
screen.clear();
screen.home();
// check that the lever is not flipped
leverPos = digitalRead(4);
screen.print("GET BACK TO WORK!");
screen.setCursor(0, 1);
screen.print(">:(");
delay(500);
Serial.println("lever:" + String(leverPos));
}
}
}