Fab Academy Site
  • Home
  • About Me
  • My Final Project: The Smart Coaster
  • Weekly Assignments

My Final Project: The Smart Coaster

Here are my project ideas and final project documentation.

You can reach to my past and current projects through my GitHub at the About Me page. Also, the projects that me and my group do as an assignment will be posted and documented through here.


First Idea: The Smart Health Assistant Coaster


Final Project

I wanted to design a piece of technology that could genuinely help people achieve their health goals, moving beyond simple fitness trackers. That’s why I created the concept for the Smart Health Assistant Coaster.

The core idea is simple: a smart coaster that monitors your fluid intake, optimizes your drink temperature, and uses AI model to give you highly personalized health advice based on what you’re drinking.


The Hardware: The Smart Coaster


The coaster itself is the physical interface. I designed it to be available in both square and circle shapes to fit different mugs. It needs to be practical, so it has an Open/Close mechanism.

The key feature is the dynamic temperature control. Using a Heat/Cool Thermal Pad, the coaster can keep any drink at its ideal temperature. If my coffee is getting cold, it heats it up. If my iced tea is warming, it cools it down (I am thinking about using a specific material for the smart coaster to help cool the mug/glass over it to cool up, or I might just get rid of this idea, and just pursue into a idea that it just reminders the user via the app when their drink became the temperature they want). The coaster houses a battery and a microcontroller to manage all this. This microcontroller is crucial because it tracks consumption and transfers all that data to my app. I envision making this a unique coaster per user so the system is entirely personalized.

The coaster also has a visual reminder—a Reminder Light. This light tells me two things: whether I’m actively consuming the drink, and when the drink is running low. I also included a simple Adjust function to quickly change the set temperature.


The Software: The Mobile Health App


The mobile app is the brain and the dashboard. It shows me the real-time status of my drink.

Crucially, it handles the two-way communication:

  • Temperature Alert: It can give me prompts like, “Your drink is on optimum heat (YOU CAN START DRINKING), do you want me to adjust the temp?”

  • Consumption Tracking: It records my Consumption and uses a Predictive Recommender(for a specific diet that the user wants) to give me advice.


The Intelligence: The AI Model


This is where the “Health Assistant” part truly shines. I plan to train an AI Model specifically to personalize my health goals. I will input what I want to achieve—whether that’s to get fit, lose weight, or just maintain a healthy life.

Based on my goal and my current consumption habits, the AI will:

  • Adjust the Ideal: Automatically adjust the recommended temperature for my drink and tweak the ideal daily consumption amount.

  • Give Direct Advice: The app will then tell me exactly what I need to do to meet my goal, delivering highly specific alerts like, “You should drink two more cups of water, 2L to go, etc.; or you drank a lot, you’re above the 2L limit etc.”

Ultimately, the Smart Health Assistant Coaster is a holistic system that ensures my hydration is optimized for both enjoyment and health, acting as a constant, intelligent coach right on my desk.


My Final Project Idea: The Commercial Smart Coaster


After developing my initial idea of a Smart Health Assistant Coaster, I decided to pivot into a more commercial and entrepreneurial direction.

Instead of focusing only on personal health tracking, I redesigned the concept into a Commercial Smart Coaster System that can be used in restaurants, cafes, and chains.

The main idea is simple:

A smart coaster with a display, LED, buzzer, and button system that can receive messages and show advertisements while also acting as an interactive notification device.

This allows businesses to:

  • Display advertisements directly on tables

  • Create a new revenue stream through ad partnerships

  • Improve customer interaction and service signaling

At the same time, the system remains simple, scalable, and practical for real-world use


The Hardware: Commercial Smart Coaster


The coaster is the physical interface between the system and the user (customer).

I redesigned the coaster to be:

  • Circular (better aesthetic for restaurants)

  • Compact and durable

  • Capable of housing electronics cleanly

Inside the coaster, I use a microcontroller-based system that controls all inputs and outputs.

The coaster includes:

Core Features

  1. Display Screen (OLED)
  • Shows advertisements, messages, or status info

  • Can later be upgraded to a round TFT display

  1. LED Indicator
  • Provides quick visual alerts

  • Example: blinking when a message arrives

  1. Buzzer
  • Provides audio notification

  • Used together with LED for attention

  1. Push Button
  • Allows user interaction

  • Used to acknowledge or stop alerts

3D Design of the Coaster


Alright, now that I’ve leveled up my CAD skills and gained some real experience, I’m going to pull a ‘reincarnation anime’ move: I’m heading back to the beginning of the grind and restarting the entire design from scratch to achieve the perfect final version of this smart coaster. But, this time I will make it step by step, so that you can follow up in the process. I wanted to do this because after messing with Gemini for my probable design of the final project (like after I sent my initial draft design), it gave out a great result of the final design that I can use. It was also looking great and covering every other feature that I didn’t include before: the buttons, ventilations, USB-C slots, and more… Besides, this designed also matched with what I was expecting of my final project.

Final Project Design with Gemini

So, I wanted to create an coaster with a simple design.

These below are my parameters. I calculated them properly in order for them to fit.

Parameters

After that I first drawed the sketches of the top and the bottom parts with my parameters.

Top Bottom Sketches

Later, I drawed the sketch of the walls on the side.

Wall Sketch

I then extruded all of them based on their parameters.

Extrude All

I also opened a hole for the Type C Cable of the ESP32-S3.

Type C Hole

My final bodies looked like this below.

Final Bodies

I then combined the top body with the wall body, and I will print them separately, so that I will nail the bottom part.

Combine

I went back to sketches, and I wanted to add nail stopers to hold the PCB in the middle inside the coaster.

I first redefined new parameters.

New Parameters

I added nail stoper sketches to both top and bottom plate inside the old nail place.

New Holes

I removed the nail holes inside the wall.

And this was my final sketch.

Final Sketch

I decombine the old parts.

I extruded the new nail stoper holders.

Extrude

And, I again combined the new parts together.

This is the final look of the coaster.

Final Look

As a final change, I just increased the nail_stoper variable to 4mm from 3mm.

And, I filleted the top of the coaster and the electronics holes. But, I didn’t fillet inside of the coaster.

Fillet

I also rotated the Type C Hole behind the OLED Screen.


Electronics Setup


Microcontroller


XIAO SEEED ESP32-S3


ESP Photo

For this, I first installed Arduino IDE from here:

(Download Arduino IDE From Here)

After that, in File → Preferences.

In Additional Boards Manager URLs, I added this url in order download all packages for my ESP: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

Then, in Tools → Board → Boards Manager

I searched esp32 and installed esp32 by Espressif Systems.

After installation, I went Tools → Board → esp32 → XIAO_ESP32S3.

I booted the ESP, and then connected the board with USB-C to my laptop.

Then I went to:

Tools → Port

I selected the new port that appeared, which was COM3

Now, my ESP was connected on COM3, and I could see it on the right below corner of Arduino IDE.

After that, I uploaded a simple Serial test first to check if the ESP is working.

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("XIAO ESP32S3 connected");
}

void loop() {
  Serial.println("Smart coaster running...");
  delay(1000);
}

After uploading, I clicked on the REST button on the ESP.

And, my ESP was working:

Code With ESP


Inputs and Outputs


Inputs

  1. Button (D6)
  • User presses it to respond to a notification

  • Acts as a confirmation or “acknowledge” input

Outputs

  1. OLED Display (D4, D5)

Displays:

  • Advertisements

  • Messages (e.g., “Order Ready”, “Waiter Coming”)

  • Branding / logos

  1. LED (D2)
  • Blinks when a new message or alert arrives
  1. Buzzer (D3)
  • Sounds when attention is required

System Behavior

The system works like this:

Message arrives →
LED starts blinking →
Buzzer starts buzzing →
Display shows message →

User presses button →
LED stops →
Buzzer stops →
System returns to idle

This creates a very clear event-response system, which is ideal for real-world environments like restaurants.


1.3 Inch Oled Screen: XFP1116-07AY


Oled Screen

For the Oled Screen,

Tools → Manage Libraries

I searched U8g2, and installed U8g2 by oliver.

After that, I replaced my code with the one below:

#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>

#define OLED_SDA D4
#define OLED_SCL D5

U8G2_SH1106_128X64_NONAME_F_HW_I2C display(
  U8G2_R0,
  U8X8_PIN_NONE
);

void setup() {
  Serial.begin(115200);
  delay(1000);

  Serial.println("Starting display test...");

  Wire.begin(OLED_SDA, OLED_SCL);

  display.begin();
  display.clearBuffer();

  display.setFont(u8g2_font_6x12_tf);
  display.drawStr(0, 12, "Smart Coaster");
  display.drawStr(0, 28, "XIAO ESP32S3");
  display.drawStr(0, 44, "Display Test");
  display.drawStr(0, 60, "OK");

  display.sendBuffer();

  Serial.println("Display test sent");
}

void loop() {
}

Make sure that your board is Board: XIAO_ESP32S3 and Port: COM3.

After this, I started with my wiring.

I wired Oled Screen to XIAO ESP32S3 as written below:

Display VCC → XIAO 3V3
Display GND → XIAO GND
Display SDA → XIAO D4 / SDA
Display SCL → XIAO D5 / SCL

Reminder: Keep VCC on 3.3V, not 5V.

I also shared an image below to share my wiring:

Wiring the Oled Screen to ESP

I uploaded the script to the ESP.

And, the display showed this:

Smart Coaster
XIAO ESP32S3
Display Test
OK

Oled Screen Output Through ESP


LED


Wiring the Oled Screen to ESP

I now wanted to test a led.

For the safety I used a 230 Ohm resistor on this one.

LED has two legs:

Long leg  = positive/anode
Short leg = negative/cathode

I wired it like this below:

XIAO D2  → resistor → LED long leg
LED short leg → XIAO GND

Wiring the Oled Screen to ESP

Later, I opened Arduino IDE and wrote this script:

#define LED_PIN D2

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);  // LED on
  delay(500);

  digitalWrite(LED_PIN, LOW);   // LED off
  delay(500);
}

I clicked on upload.

After upload, the LED blinked like below:

ON  0.5 second
OFF 0.5 second
ON  0.5 second
OFF 0.5 second

You can also see it through the video.

Led Blink Video

If it does not blink, first reverse the LED legs. The LED direction matters.


Buzzer


Buzzer

Now, I will test out a buzzer.

I will again use a 230 Ohm resistor with this one too.

I used D3 for the buzzer.

I wired my buzzer as below:

XIAO D3  → buzzer +
XIAO GND → buzzer -

Buzzer Wiring

And, I kept my LED as it is.

I wrote the script below:

#define LED_PIN    D2
#define BUZZER_PIN D3

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  digitalWrite(BUZZER_PIN, HIGH);
  delay(300);

  digitalWrite(LED_PIN, LOW);
  digitalWrite(BUZZER_PIN, LOW);
  delay(700);
}

I uploaded it to my ESP.

You can see how the buzzer and LED combination worked in the video below:

Buzzer Video With Resistor

I realized that the sound of the was too low because of the resistor. And, since I needed a louder sound, I removed the resistor as thinking the buzzer wouldn’t consume that much of a voltage, and it would sound less when I add more stuff to the ground.

New buzzer sound video below:

Buzzer Video Without Resistor


Button


I also wanted to use a button to close the led and the buzzer.

Button

So, on this one you can wire in to ways:

Pin 1 → D6
Pin 3 → GND

or

Pin 2 → D6
Pin 4 → GND

But make sure that the pins are opposite of each other.

Here is my wiring photo:

Button Wiring

Here is the code that I used to test the button:

#define LED_PIN    D2

#define BUZZER_PIN D3

#define BUTTON_PIN D6
 
bool alarm_active = true;   // for now we start as if a message arrived
 
bool last_button_state = HIGH;

unsigned long last_button_time = 0;

const unsigned long debounce_delay = 50;
 
unsigned long last_blink_time = 0;

bool led_state = false;
 
void stop_alarm() {

  alarm_active = false;
 
  digitalWrite(LED_PIN, LOW);

  digitalWrite(BUZZER_PIN, LOW);

  noTone(BUZZER_PIN);

}
 
void setup() {

  pinMode(LED_PIN, OUTPUT);

  pinMode(BUZZER_PIN, OUTPUT);

  pinMode(BUTTON_PIN, INPUT_PULLUP);
 
  digitalWrite(LED_PIN, LOW);

  digitalWrite(BUZZER_PIN, LOW);

  noTone(BUZZER_PIN);

}
 
void loop() {

  // Read button

  bool current_button_state = digitalRead(BUTTON_PIN);
 
  // Detect button press: HIGH -> LOW

  if (last_button_state == HIGH && current_button_state == LOW) {

    if (millis() - last_button_time > debounce_delay) {

      stop_alarm();

      last_button_time = millis();

    }

  }
 
  last_button_state = current_button_state;
 
  // If muted/stopped, keep everything off

  if (!alarm_active) {

    digitalWrite(LED_PIN, LOW);

    digitalWrite(BUZZER_PIN, LOW);

    noTone(BUZZER_PIN);

    return;

  }
 
  // Alarm active: LED blinks, buzzer buzzes

  tone(BUZZER_PIN, 2000);
 
  if (millis() - last_blink_time >= 500) {

    led_state = !led_state;

    digitalWrite(LED_PIN, led_state ? HIGH : LOW);

    last_blink_time = millis();

  }

}

You can watch how it worked from the video below:

Buzzer Video Without Resistor


PCB Design


© Fab Academy Site 2026