Front view of the Automatic Candle Extinguisher, with power on, and the timer not yet set.
This project automatically extinguishes a candle after a certain amount of time. Powered by a battery, the screen at the front displays directions and the time remaining before the candle is extinguished. The user updates the time (by minutes) using the silver knobs and then confirms with the green button. After the given amount of time, the servo motor/arm will cover the lid of the candle for 15 seconds (displayed on the screen) and then move away after the flame is out. The arm can also be utilized immediately if desired by clicking the red button, which is an automatic extinguisher. Once extinguished, the timer will automatically reset and can be adjusted accordingly again.
Overall photo of the extinguisher - about 8 in. x 8 in. x 8 in. in dimensions.
View panel on the front of the extinguisher - includes screen, time up/down buttons, confirm button (green) and extinguish button (red).
Inside the base of the device: soldered wires to a board, battery, and Arduino board hidden inside for better visual aesthetics.
Close-up view of the servo motor: placed inside a box the height of the candle, attached to a snuffer plate that rotates to cover the candle and then move away from the top.
Side view of the device, showing the middle plate used to support the candle 0.5 inch below the top panel.
In this video, I show the operation of the extinguisher using the timer. I set the timer to 1 minute, wait, and then watch as the arm moves to cover the candle for 15 seconds and then move back to its original position. The timer then becomes available again to adjust.
In this video, I show the operation of the extinguisher simply using the automatic button. I adjust the timer, confirm it, but then a few seconds in use the red button to automatically set it out. The arm moves, I wait 15 seconds, and then the arm moves back to its original position.
This prototype was made to be an exact scale replica of the final model. It was useful to know how big the view panel would be, as I wanted to make sure my buttons would fit even with the slant and that the middle piece of wood inside that would be holding the candle wouldn't interfere with the buttons. I used the dimensions here to assist with my CAD drawing.
It took many different variations in CAD before I could finalize my the sketches that I would laser cut. Because I have never used Fusion before, it was very challenging making sure that I sketched something correctly and exported the right face as a DXF. Here is the little rectangle the servo motor arm would come out of. Initially, I had it so that there would be a little roof covering the arm so it looks neater, but this changes in later variations.
Another view of the final CAD version of my prototype. I didn't realize that the laser cutter can't cut at an angle, so I had to update the view panel sketch accordingly so that it would reach both the top and bottom.
Ready for assembly. I printed quite a few variations of the rectangle where the servo motor arm would come out because I still wasn't sure how it would function/which way it would turn.
I had to reprint my view panel because I had to use different buttons and incorrectly measured the LCD screen size.
This is what my device looked like before I closed off all the sides and after I had soldered all my wires. This was my first time using the soldering machine, but it went smoothly. I wanted to make sure my device functioned before closing it up with glue.
As you can see, my prototype and final version are different in terms of the servo motor mechanism. Originally, it was going to stationary horiziontally, but I was concerned the material would heat up if it was right above the candle while it was burning, so I made adjustments so that the candle would be covered only for 15 seconds and then the arm would move completely out of the way.
A closer shot of the arm moving mechanism. The circular wood won't heat up away from the candle, while still snuffing out the oxygen when needed.
After presenting my device to the professors in the IDeATe office, I received a few comments about my device. Professor Zach noted that the snuffing plate should be non-flammable in case the servo motor stops working and the flame comes in contact with the wood. He said "The snuffing plate should not be flammable, because especially if this is an unattended device, that makes for a very real safety risk. (Consider the case in which the motor moves the cover halfway across the candle and then conks out. Then the wood is suspended just a few inches above the candle and will likely catch on fire)." I agree with this note as well; for the demonstration, I could have potentially wrapped the snuffing plate in aluminum, but I also believe that next time, I should find a material that is completely safe as the aluminum could tear. Professor Cody talked about the scalability of the project: Is there any way I could make this so that other candles can work as well? I believe that adding a linear actuator and making the snuffing plate larger would allow the servo motor to adjust to the height of any candle while also making sure to cover the entire diameter. Overall, my demonstration went smoothly. I was honestly rather impressed with how well my device works and how clean it looks. I did satisfy my own goals, and because I was under a time constraint, I was very proud that I was able to teach myself how to solder and use CAD well enough for this project. This project did teach me the importance of having a plan. I knew exactly what had to be done because I had written it out for myself, and I appreciated that level of organization because it allowed me to work efficiently with limited backtracking. I found that working with Fusion was incredibly difficult at first. Although I had the correct dimensions for my project after the cardboard prototype, I struggled with recreating it in Fusion. At first, I was simply using the wrong dimensions (cm instead of in), so I had to go back after making it halfway. Once I had accomplished the bigger pieces in CAD, I was unable to get the FingerJointing + any holes on the correct sketch plane face, so it served as a big challenge. Eventually, I was able to print the right shapes, but it took a lot longer than expected. Next time, I would spend more time understanding CAD basics because jumping straight into it without a solid understanding ate up time during this project. Other than that, though, the wiring and coding part came rather smoothly. It was a struggle to fit everything into the base of my project smoothly with the wires and boards, but it was an easy challenge I overcame quickly. If I were to do this again, as mentioned, I would probably add a linear actuator to adjust to different candle heights and make the snuffing plate bigger. I would also like to find a way to hide the servo motor arm more discretely, whether that be through additional pieces to make a small roof over it or attaching the snuffing plate to the arm with a better cut-out piece of wood. All in all, I am very content with my project and feel as though I am leaving the project with a solid introduction to CAD and soldering, and I look forward to building upon those skills.
Block Diagram
Schematic Diagram
/*
Automatic Candle Extinguisher (Aziza Norkulova)
The following code displays and updates the time that is left before a snuffer extinguishes a candle. It changes the time based on button presses, shows a timer, and sends out confirmation messages as well.
Pin mapping:
Arduino pin | role | details
------------------------------
9 output Servo Motor Pin
2 input increase time button
3 input decrease time button
4 input countdown starter
5 input extinguisher
In order to complete this project, I watched a few videos on how to use a push button and the wiring, linked below.
https://www.youtube.com/watch?v=_Gi8QNmP5nc
https://www.youtube.com/watch?v=OmVZg8VhkfM
*/
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
// Initialize LCD screen
LiquidCrystal_I2C screen(0x27, 16, 2);
Servo extinguisher;
const int buttonUp = 2; // Increase time
const int buttonDown = 3; // Decrease time
const int buttonStart = 4; // Start countdown
const int buttonInstant = 5; // Instant extinguish
const int servoPin = 9; // Servo control pin
// Default time in seconds (5 minutes)
int timeLeft = 5 * 60;
bool countDownActive = false;
void setup() {
extinguisher.attach(servoPin);
// Start on the right side
extinguisher.write(75);
pinMode(buttonUp, INPUT);
pinMode(buttonDown, INPUT);
pinMode(buttonStart, INPUT_PULLUP);
pinMode(buttonInstant, INPUT_PULLUP);
screen.init();
screen.backlight();
updateLCD();
}
void loop() {
if (digitalRead(buttonUp) == HIGH) {
timeLeft += 60;
updateLCD();
delay(300);
}
if (digitalRead(buttonDown) == HIGH && timeLeft > 60) {
timeLeft -= 60;
updateLCD();
delay(300);
}
// Start countdown when button is pressed
if (digitalRead(buttonStart) == LOW) {
// Display confirmation on second line
screen.setCursor(0, 1);
screen.print("Confirming... ");
countDownActive = true;
while (timeLeft > 0 && countDownActive) {
updateLCD();
delay(1000);
timeLeft--;
if (digitalRead(buttonInstant) == LOW) {
extinguishCandle();
return;
}
}
extinguishCandle();
}
// Instant extinguish triggers immediately
if (digitalRead(buttonInstant) == LOW) {
extinguishCandle();
}
}
void updateLCD() {
screen.clear();
screen.setCursor(0, 0);
screen.print("Time Left: ");
int minutes = timeLeft / 60;
int seconds = timeLeft % 60;
if (minutes < 10) screen.print("0");
screen.print(minutes);
screen.print(":");
if (seconds < 10) screen.print("0");
screen.print(seconds);
}
void extinguishCandle() {
screen.clear();
screen.setCursor(0, 0);
screen.print("Extinguishing...");
// Move to the candle
extinguisher.write(2);
for (int i = 15; i > 0; i--) {
screen.setCursor(0, 1);
screen.print("Time Left: ");
if (i < 10) screen.print("0");
screen.print(i);
screen.print(" sec");
delay(1000);
}
// Move back to the right side
extinguisher.write(77);
screen.clear();
screen.setCursor(0, 0);
screen.print("Done!");
delay(1500);
countDownActive = false;
timeLeft = 5 * 60;
updateLCD();
}