Aura Smart Hair Oil Dispenser
Final Presentation Slide
AI Image Prompt
chat gpt prompt: I lost original prompt of this image. I gave screenshot's from cad and then I told "generate this image in to product photography in 1920*1080size with detailing of product and realistic lighting and shadows and background should be white and product should be in center of image.make it profetional slide for presentation"
AI Tool Used: ChatGPT
Final Presentation Video
Project Planning & Design
During Week 01 (Principles and Practices), I sketched the initial concept and defined the project requirements. The sketch below shows my initial hand-drawn concept:
Abstract
The Smart Hair Oil Dispenser is an innovative personal care device designed to improve hair nourishment and scalp health through controlled oil heating, precise dispensing, and therapeutic massage. The system incorporates a 20 ml aluminum chamber that enables efficient heating and cooling of hair oil, with a maximum operating temperature of 60 °C. Controlled heating enhances oil absorption, supports faster hair growth, and helps maintain scalp protection without causing thermal damage.
The device features a precision nozzle that ensures smooth and direct oil delivery to the hair roots, minimizing wastage and improving effectiveness. An integrated vibration motor at the tip provides gentle scalp massage, promoting better blood circulation and enhanced nutrient penetration. The body is ergonomically curved to prevent oil staining and to ensure comfortable handling during use.
For safety and reliability, the dispenser is equipped with wireless charging technology, eliminating the risk of sparks in oil-exposed environments. A built-in rechargeable battery provides backup power for uninterrupted operation. By combining thermal control, targeted oil application, and massage therapy in a compact and safe design, the Smart Hair Oil Dispenser offers an efficient and user-friendly solution for modern hair care.
In Week 02 (Computer-Aided Design), I developed a detailed 3D mockup using Fusion 360, which helped visualize the final product design with proper dimensions, materials, and renders:
3D Animation
The video below shows the animated render of the Smart Hair Oil Dispenser created during the design week:
This is the rendered version of my product created using Fusion. You can rotate the model and view it from multiple angles.
Exploaded View
AI Prompt for Exploded View
Turn this above image into a clean and clear professional exploded view
AI Tool Used: ChatGPT
Project Highlights
Building the System Skeleton
Pogo pin connections for vibration actuation
this is final cad model
Firmware of aura smart hair oil dispenser
/*
Thermistor + PTC Heater Controller — ATtiny1624 (megaTinyCore)
── Wiring ────────────────────────────────────────────────────────────────────
Thermistor: VCC → 4.7kΩ → PA6 → Thermistor → GND
Heater MOSFET: PA2 → gate
12V sense: 12V → 15kΩ → PB0 → 5kΩ → GND (3.0V when present)
LED1: PA4
LED2: PA1
LED3: PA3
Vibration MOSFET: PB1 → gate (PWM via TCA WO1)
Push button: PA7 → GND (internal pull-up enabled)
── Docked (12V present) ──────────────────────────────────────────────────────
· Heater runs HEATING → MAINTAINING → COOLING cycle
· LEDs show temperature climb (solid, no blinking):
< 20 °C → LED3 only
20–60 °C → LED2+3
≥ 60 °C → LED1+2+3
MAINTAINING → LED1+2+3
COOLING → LED1+2+3
· Vibration motor forced OFF, button ignored (except long press)
── Undocked (12V absent) ─────────────────────────────────────────────────────
· Heater OFF
· Thermistor read every loop — gates motor and LEDs
· Temp < 40 °C:
All three LEDs blink @ 400 ms
Motor reset to OFF instantly, button short-press ignored
· Temp ≥ 40 °C:
LEDs solid per motor mode:
Motor OFF → all LEDs OFF
Motor LOW → LED3
Motor MED → LED2+3
Motor HIGH → LED1+2+3
Button short-press cycles: OFF → LOW (30%) → MED (60%) → HIGH (100%) → OFF
── Power / sleep ─────────────────────────────────────────────────────────────
· Long press ≥ 2 s (any mode): heater OFF, motor OFF, LEDs OFF,
3-flash confirmation, ATtiny enters deep power-down sleep (~0.1 µA)
· Button press wakes device — fresh boot, state fully reset
*/
#include <math.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
// ── Pins ──────────────────────────────────────────────────────────────────────
#define THERM_PIN PIN_PA6
#define HEATER_PIN PIN_PA2
#define V12_SENSE_PIN PIN_PB0
#define LED1_PIN PIN_PA4
#define LED2_PIN PIN_PA1
#define LED3_PIN PIN_PA3
#define MOTOR_PIN PIN_PB1
#define BUTTON_PIN PIN_PA7
// ── 12V sense threshold ───────────────────────────────────────────────────────
// 15kΩ + 5kΩ divider → 3.0V at PB0 when 12V present → ADC ≈ 614
// Threshold at 2.0V (ADC ≈ 409) gives solid noise margin
const int V12_THRESHOLD_ADC = 409;
// ── Circuit constants ─────────────────────────────────────────────────────────
const float VCC = 5.0;
const float R_FIXED = 4700.0;
// ── Thermistor (Beta equation) ────────────────────────────────────────────────
const float BETA = 3950.0;
const float T0_KELVIN = 298.15;
const float R0 = 100000.0; // 100 kΩ at 25 °C
// ── ADC ───────────────────────────────────────────────────────────────────────
const int NUM_SAMPLES = 16;
const float ADC_MAX = 1023.0;
// ── Heater setpoint & hysteresis ─────────────────────────────────────────────
const float TARGET_TEMP = 60.0;
const float HYST_HIGH = 60.5;
const float HYST_LOW = 59.5;
// ── Hold duration ─────────────────────────────────────────────────────────────
const unsigned long HOLD_MS = 3UL * 60UL * 1000UL; // 3 minutes
// ── Motor PWM levels (0–255) ──────────────────────────────────────────────────
const uint8_t MOTOR_OFF = 0;
const uint8_t MOTOR_LOW = 77; // ~30%
const uint8_t MOTOR_MED = 153; // ~60%
const uint8_t MOTOR_HIGH = 255; // 100%
// ── Timing ────────────────────────────────────────────────────────────────────
const unsigned long BLINK_WARNING_MS = 400; // undocked temp < 40 °C
const unsigned long DEBOUNCE_MS = 50;
const unsigned long LONG_PRESS_MS = 2000; // hold ≥ 2 s → sleep
// ── Heater state machine ──────────────────────────────────────────────────────
enum HeaterState { HEATING, MAINTAINING, COOLING };
HeaterState state = HEATING;
unsigned long holdStart = 0;
// ── Motor state ───────────────────────────────────────────────────────────────
enum MotorMode { MOTOR_MODE_OFF, MOTOR_MODE_LOW, MOTOR_MODE_MED, MOTOR_MODE_HIGH };
MotorMode motorMode = MOTOR_MODE_OFF;
// ── Blink state ───────────────────────────────────────────────────────────────
unsigned long lastBlinkTime = 0;
bool blinkPhase = false;
// ── Button state ──────────────────────────────────────────────────────────────
bool lastButtonRaw = HIGH;
bool lastButtonStable = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long buttonPressStart = 0;
bool buttonHeld = false;
// ─────────────────────────────────────────────────────────────────────────────
// Helpers
// ─────────────────────────────────────────────────────────────────────────────
bool detect12V() {
return analogRead(V12_SENSE_PIN) >= V12_THRESHOLD_ADC;
}
void setLEDs(bool l1, bool l2, bool l3) {
digitalWrite(LED1_PIN, l1 ? HIGH : LOW);
digitalWrite(LED2_PIN, l2 ? HIGH : LOW);
digitalWrite(LED3_PIN, l3 ? HIGH : LOW);
}
void allLEDsOff() { setLEDs(false, false, false); }
void setMotor(uint8_t pwmValue) { analogWrite(MOTOR_PIN, pwmValue); }
void stopMotor() {
motorMode = MOTOR_MODE_OFF;
setMotor(MOTOR_OFF);
}
// ─────────────────────────────────────────────────────────────────────────────
// ISR — wake from sleep only, no action needed
// ─────────────────────────────────────────────────────────────────────────────
ISR(PORTA_PORT_vect) {
PORTA.INTFLAGS = PIN7_bm;
}
// ─────────────────────────────────────────────────────────────────────────────
// sleepConfirmFlash — 3 quick flashes on all LEDs before sleeping
// ─────────────────────────────────────────────────────────────────────────────
void sleepConfirmFlash() {
for (uint8_t i = 0; i < 3; i++) {
setLEDs(true, true, true);
delay(80);
allLEDsOff();
delay(80);
}
}
// ─────────────────────────────────────────────────────────────────────────────
// enterSleep — safe state, flash, then power-down sleep
// Wakes on PA7 falling edge (button press)
// ─────────────────────────────────────────────────────────────────────────────
void enterSleep() {
Serial.println("INFO: Entering deep sleep — press button to wake");
Serial.flush();
digitalWrite(HEATER_PIN, LOW);
stopMotor();
allLEDsOff();
sleepConfirmFlash();
// Reset all runtime state — wake = fresh boot
state = HEATING;
motorMode = MOTOR_MODE_OFF;
blinkPhase = false;
lastBlinkTime = 0;
buttonHeld = false;
// Configure PA7 as falling-edge interrupt to wake from sleep
PORTA.PIN7CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sei();
sleep_cpu(); // execution pauses here until button pressed
// Woke up
sleep_disable();
PORTA.PIN7CTRL = PORT_PULLUPEN_bm; // restore normal input, no interrupt
delay(200); // let button settle before re-entering loop
Serial.println("INFO: Woke from sleep — fresh boot");
}
// ─────────────────────────────────────────────────────────────────────────────
// checkButton — returns 0=nothing 1=short press 2=long press
// ─────────────────────────────────────────────────────────────────────────────
uint8_t checkButton() {
bool raw = digitalRead(BUTTON_PIN);
if (raw != lastButtonRaw) {
lastDebounceTime = millis();
lastButtonRaw = raw;
}
if ((millis() - lastDebounceTime) < DEBOUNCE_MS) return 0;
if (raw != lastButtonStable) {
lastButtonStable = raw;
if (raw == LOW) {
buttonPressStart = millis();
buttonHeld = true;
} else {
if (buttonHeld) {
buttonHeld = false;
if (millis() - buttonPressStart >= LONG_PRESS_MS) return 2;
else return 1;
}
}
}
return 0;
}
// ─────────────────────────────────────────────────────────────────────────────
// updateLEDs_temperature — solid indicators, docked mode
// ─────────────────────────────────────────────────────────────────────────────
void updateLEDs_temperature(float tempC, HeaterState currentState) {
if (tempC >= TARGET_TEMP ||
currentState == MAINTAINING ||
currentState == COOLING) {
setLEDs(true, true, true);
return;
}
if (tempC < 20.0) setLEDs(false, false, true); // LED3 only
else setLEDs(false, true, true); // LED2+3
}
// ─────────────────────────────────────────────────────────────────────────────
// updateLEDs_vibration — solid per motor mode, undocked + temp ≥ 40 °C
// ─────────────────────────────────────────────────────────────────────────────
void updateLEDs_vibration() {
switch (motorMode) {
case MOTOR_MODE_OFF: setLEDs(false, false, false); break;
case MOTOR_MODE_LOW: setLEDs(false, false, true); break;
case MOTOR_MODE_MED: setLEDs(false, true, true); break;
case MOTOR_MODE_HIGH: setLEDs(true, true, true); break;
}
}
// ─────────────────────────────────────────────────────────────────────────────
// updateLEDs_warning — all three blink @ 400 ms, undocked + temp < 40 °C
// ─────────────────────────────────────────────────────────────────────────────
void updateLEDs_warning() {
if (millis() - lastBlinkTime >= BLINK_WARNING_MS / 2) {
blinkPhase = !blinkPhase;
lastBlinkTime = millis();
}
setLEDs(blinkPhase, blinkPhase, blinkPhase);
}
// ─────────────────────────────────────────────────────────────────────────────
// advanceMotorMode — OFF → LOW → MED → HIGH → OFF
// ─────────────────────────────────────────────────────────────────────────────
void advanceMotorMode() {
switch (motorMode) {
case MOTOR_MODE_OFF:
motorMode = MOTOR_MODE_LOW;
setMotor(MOTOR_LOW);
Serial.println("[MOTOR] LOW (30%)");
break;
case MOTOR_MODE_LOW:
motorMode = MOTOR_MODE_MED;
setMotor(MOTOR_MED);
Serial.println("[MOTOR] MEDIUM (60%)");
break;
case MOTOR_MODE_MED:
motorMode = MOTOR_MODE_HIGH;
setMotor(MOTOR_HIGH);
Serial.println("[MOTOR] HIGH (100%)");
break;
case MOTOR_MODE_HIGH:
motorMode = MOTOR_MODE_OFF;
setMotor(MOTOR_OFF);
Serial.println("[MOTOR] OFF");
break;
}
}
// ─────────────────────────────────────────────────────────────────────────────
void setup() {
Serial.begin(115200);
pinMode(HEATER_PIN, OUTPUT);
pinMode(V12_SENSE_PIN, INPUT);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(HEATER_PIN, LOW);
setMotor(MOTOR_OFF);
allLEDsOff();
analogReference(VDD);
analogReadResolution(10);
delay(2000);
Serial.println("Heater Controller — ATtiny1624");
Serial.println("Target: 60 C | Hold: 3 min | 12V interlock: ON");
Serial.println("Long press 2 s: sleep | Press button to wake");
Serial.println("---------------------------------------------------");
}
// ── ADC helpers ───────────────────────────────────────────────────────────────
float readVoltage() {
long sum = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
sum += analogRead(THERM_PIN);
delay(2);
}
return (sum / (float)NUM_SAMPLES / ADC_MAX) * VCC;
}
float voltageToResistance(float v) {
if (v <= 0.0 || v >= VCC) return -1.0;
return R_FIXED * v / (VCC - v);
}
float resistanceToCelsius(float r) {
if (r <= 0) return NAN;
float invT = (1.0 / T0_KELVIN) + (1.0 / BETA) * log(r / R0);
return (1.0 / invT) - 273.15;
}
// ─────────────────────────────────────────────────────────────────────────────
void loop() {
static bool v12WasAbsent = false;
static bool warningTracked = false;
bool v12Now = detect12V();
// ── Read temperature (always — gates both modes) ───────────────────────────
float voltage = readVoltage();
float resistance = voltageToResistance(voltage);
float tempC = resistanceToCelsius(resistance);
// ── Sensor fault — safe state ──────────────────────────────────────────────
if (isnan(tempC) || resistance < 0) {
digitalWrite(HEATER_PIN, LOW);
stopMotor();
allLEDsOff();
Serial.println("ERROR: Sensor fault — heater and motor OFF");
delay(1000);
return;
}
// ── Button — checked every iteration in all modes ──────────────────────────
uint8_t btn = checkButton();
if (btn == 2) {
enterSleep();
v12WasAbsent = false;
warningTracked = false;
return;
}
// ── 12V ABSENT — undocked ──────────────────────────────────────────────────
if (!v12Now) {
if (!v12WasAbsent) {
Serial.println("WARNING: 12V absent — heater OFF, entering undocked mode");
digitalWrite(HEATER_PIN, LOW);
state = HEATING;
stopMotor();
blinkPhase = false;
lastBlinkTime = millis();
v12WasAbsent = true;
}
if (tempC < 40.0) {
stopMotor(); // reset instantly, one line
updateLEDs_warning();
if (!warningTracked) warningTracked = true;
} else {
if (warningTracked) { // just crossed above 40 °C
blinkPhase = false;
lastBlinkTime = millis();
warningTracked = false;
}
if (btn == 1) advanceMotorMode();
updateLEDs_vibration();
}
// Serial (undocked)
Serial.print("Temp: ");
Serial.print(tempC, 1);
Serial.print(" C | Motor: ");
switch (motorMode) {
case MOTOR_MODE_OFF: Serial.print("OFF "); break;
case MOTOR_MODE_LOW: Serial.print("LOW "); break;
case MOTOR_MODE_MED: Serial.print("MEDIUM "); break;
case MOTOR_MODE_HIGH: Serial.print("HIGH "); break;
}
Serial.print(" | Gate: ");
Serial.print(tempC < 40.0 ? "LOCKED (temp < 40 C)" : "OPEN");
Serial.print(" | LEDs: ");
Serial.print(digitalRead(LED1_PIN) ? "1" : "-");
Serial.print(digitalRead(LED2_PIN) ? "2" : "-");
Serial.println(digitalRead(LED3_PIN) ? "3" : "-");
delay(20);
return;
}
// ── 12V PRESENT — docked ───────────────────────────────────────────────────
if (v12WasAbsent) {
Serial.println("INFO: 12V restored — stopping motor, resuming heating cycle");
stopMotor();
motorMode = MOTOR_MODE_OFF;
v12WasAbsent = false;
warningTracked = false;
digitalWrite(HEATER_PIN, HIGH);
}
// ── Heater state machine ───────────────────────────────────────────────────
switch (state) {
case HEATING:
digitalWrite(HEATER_PIN, HIGH);
if (tempC >= TARGET_TEMP) {
holdStart = millis();
state = MAINTAINING;
Serial.println("[STATE] MAINTAINING");
}
break;
case MAINTAINING:
if (tempC >= HYST_HIGH) digitalWrite(HEATER_PIN, LOW);
else if (tempC <= HYST_LOW) digitalWrite(HEATER_PIN, HIGH);
if (millis() - holdStart >= HOLD_MS) {
digitalWrite(HEATER_PIN, LOW);
state = COOLING;
Serial.println("[STATE] COOLING — heater OFF");
}
break;
case COOLING:
digitalWrite(HEATER_PIN, LOW);
break;
}
// ── LEDs show temperature climb ────────────────────────────────────────────
updateLEDs_temperature(tempC, state);
// ── Serial (docked) ────────────────────────────────────────────────────────
Serial.print("Temp: ");
Serial.print(tempC, 1);
Serial.print(" C | R: ");
Serial.print(resistance / 1000.0, 2);
Serial.print(" kOhm | V: ");
Serial.print(voltage, 3);
Serial.print(" V | Heater: ");
Serial.print(digitalRead(HEATER_PIN) ? "ON " : "OFF");
Serial.print(" | State: ");
switch (state) {
case HEATING:
Serial.print("HEATING ");
break;
case MAINTAINING: {
unsigned long secs = (HOLD_MS - (millis() - holdStart)) / 1000;
Serial.print("MAINTAINING ");
Serial.print(secs / 60); Serial.print("m ");
Serial.print(secs % 60); Serial.print("s left ");
break;
}
case COOLING:
Serial.print("COOLING ");
break;
}
Serial.print(" | LEDs: ");
Serial.print(digitalRead(LED1_PIN) ? "1" : "-");
Serial.print(digitalRead(LED2_PIN) ? "2" : "-");
Serial.println(digitalRead(LED3_PIN) ? "3" : "-");
delay(1000);
}
Power
Works with 12V
Controller
here i used ATtiny1624 as the main controller for the heater, motor, thermistor, LEDs, and button.
12V Mode
Heats upto 60°C
Motor stays OFF when heat is goes down to 40°C.
Battery Mode
vibration Motor works only above 40°C.
3 momdes of vibratio (slow ,medium ,high)
Bill of Materials (BOM)
| No. | Component | Qty | Description | Price (INR) | Price (USD) | Source | Purchase Link |
|---|---|---|---|---|---|---|---|
| 1 | ATtiny1624 | 1 | Microcontroller | ₹220 | $2.56 | Purchase | Buy Here |
| 2 | Aluminum Block | 1 | Cooling Block | ₹250 | $2.91 | Purchase | Buy Here |
| 3 | 12V PTC Heater | 1 | Heating Element | ₹195 | $2.27 | Purchase | Buy Here |
| 4 | SMD Push Button | 6 | Tactile Switch | ₹8 | $0.09 | Purchase | Buy Here |
| 5 | USB Type-C PD Trigger Module | 1 | 12V PD Trigger | ₹180 | $2.09 | Purchase | Buy Here |
| 6 | Coin Vibration Motor | 2 | ERM Vibration Motor | ₹67 | $0.78 | Purchase | Buy Here |
| 7 | USB Type-A to Type-C Cable | 1 | Power Cable | ₹60 | $0.70 | Purchase | Buy Here |
| 8 | 100K Thermistor | 1 | Temperature Sensor | ₹20 | $0.23 | Purchase | Buy Here |
| 9 | TP4056 Charging Module | 1 | Battery Charger | ₹35 | $0.41 | Purchase | Buy Here |
| 10 | 3.7V Li-Po Battery (600mAh) | 1 | Rechargeable Battery | ₹250 | $2.91 | Purchase | Buy Here |
| 11 | LM2596 Buck Converter | 1 | DC-DC Step Down Module | ₹70 | $0.81 | Purchase | Buy Here |
| 12 | 5-Pin Magnetic Pogo Connector | 1 | Charging Connector | ₹239 | $2.78 | Purchase | Buy Here |
| 13 | Resistor 10Ω | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 14 | Resistor 499Ω | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 15 | Resistor 1kΩ | 5 | 1206 SMD Resistor | ₹10 | $0.12 | Purchase | Buy Here |
| 16 | Resistor 5kΩ | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 17 | Resistor 100kΩ | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 18 | Resistor 1.8kΩ | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 19 | Resistor 4.7kΩ | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 20 | Resistor 10kΩ | 1 | 1206 SMD Resistor | ₹2 | $0.02 | Purchase | Buy Here |
| 21 | 100nF Ceramic Capacitor | 1 | 1206 Ceramic Capacitor | ₹2 | $0.02 | Purchase | Buy Here |
| 22 | 1µF Ceramic Capacitor | 1 | 1206 Ceramic Capacitor | ₹2 | $0.02 | Purchase | Buy Here |
| 23 | 10µF Ceramic Capacitor | 2 | 1206 Ceramic Capacitor | ₹4 | $0.05 | Purchase | Buy Here |
| 24 | 100µF Electrolytic Capacitor (8 × 10.2mm) | 1 | 25V Electrolytic Capacitor | ₹6 | $0.07 | Purchase | Buy Here |
| 25 | SS24 Schottky Diode | 1 | 40V 2A Schottky Diode | ₹4 | $0.05 | Purchase | Buy Here |
| 26 | UTT50N06MG N-Channel MOSFET (TO-252) | 1 | 60V 50A MOSFET | ₹22 | $0.26 | Purchase | Buy Here |
| 27 | Custom PCB | 2 | FR1 PCB | Lab Inventory | - | Lab Inventory | - |
| 28 | Copper Headers | As Required | Pin Headers | Lab Inventory | - | Lab Inventory | - |
| 29 | Solder Paste / Solder Wire | As Required | Assembly Material | Lab Inventory | - | Lab Inventory | - |
| 30 | Flux | As Required | Soldering Flux | Lab Inventory | - | Lab Inventory | - |
| 31 | Double-Sided Tape | As Required | Assembly | Lab Inventory | - | Lab Inventory | - |
| 32 | JST Connector | As Required | Battery Connector | Lab Inventory | - | Lab Inventory | - |
| 33 | Heat Shrink Tube | As Required | Wire Insulation | Lab Inventory | - | Lab Inventory | - |
| 34 | Hook-up Wire | As Required | Electrical Wiring | Lab Inventory | - | Lab Inventory | - |
this is the final model after fabrication