DeskCal - Smart Desk Calendar
A smart desk calendar that displays weather, local sensor data, and Google Calendar events on a TFT screen, with animated LED ring alerts for upcoming meetings.
Author: BADEA Stefan-Vasile
GitHub Project Link: UPB-PMRust-Students/acs-project-2026-stefanbadea-sudo
Description
DeskCal is a smart desk calendar running on an STM32 Nucleo-U545RE-Q microcontroller. It receives weather data and Google Calendar events from a laptop via USB-UART, processed by a Python script. A BME280 sensor provides local temperature, humidity, and atmospheric pressure. A TFT color display shows four navigable pages: current clock and date, weather conditions, local sensor data with historical temperature graph, and upcoming calendar events. A WS2812B RGB LED ring displays animated color patterns indicating meeting proximity. A passive buzzer emits timed audio alerts before events. A physical button snoozes active reminders. The device is housed in a custom 3D-printed enclosure.
Motivation
As a student with a busy schedule of classes, lab sessions, and project deadlines, I often find myself missing meetings or losing track of environmental conditions in my workspace. I wanted to build a device that consolidates all this information in one place on my desk, without requiring me to constantly check my phone or laptop. The project also gave me the opportunity to explore embedded Rust development with embassy-rs, work with multiple hardware peripherals simultaneously, and design a complete end-to-end system from hardware to software to physical enclosure.
Architecture
The system is organized around four main components:
Host Python Script — runs on the laptop, fetches weather from OpenWeatherMap and events from Google Calendar, serializes to JSON and sends over USB-UART every 60 seconds.
STM32 Nucleo-U545RE-Q — main controller running embassy-rs async tasks: UART reception, BME280 reading, display rendering, LED ring and buzzer control.
Display Subsystem — ILI9341 2.8" TFT over SPI renders four pages selected via potentiometer (ADC).
Alert Subsystem — WS2812B LED ring (SPI) + passive buzzer (PWM) produce visual and audio alerts based on meeting proximity; tactile button handles snooze via GPIO interrupt.
Log
Week 5
Finalized project idea and had the theme approved by the lab coordinator.
Week 7
Ordered all hardware components from Optimus Digital and eMAG. Started reading embassy-rs documentation and experimenting with basic GPIO and UART on the Nucleo board. Started enclosure design in Fusion 360.
Week 8
Stating writing the documentation page.
Hardware
The project uses an STM32 Nucleo-U545RE-Q as the main microcontroller. A 2.8" ILI9341 TFT display connected via SPI renders the user interface across four pages. A BME280 sensor connected via I2C measures local temperature, humidity, and atmospheric pressure. A WS2812B 16-LED ring connected via SPI provides animated RGB visual alerts. A passive buzzer driven by PWM emits audio alerts. A 50kΩ potentiometer on an ADC pin handles page navigation. A tactile button on GPIO pins handle snooze and interaction. All components are housed in a custom 3D-printed PLA enclosure.
Schematics
- TODO: KiCad schematic to be added at Hardware Milestone (Week 11)
Bill of Materials
| Device | Usage | Price |
|---|---|---|
| STM32 Nucleo-U545RE-Q | Main microcontroller | Provided by faculty |
| ILI9341 2.8" SPI TFT Display | Displays clock, weather, sensor data and calendar pages | ~90 RON |
| BME280 Barometric Sensor Module | Measures local temperature, humidity and pressure | ~34 RON |
| WS2812B RGB LED Ring (16 LEDs) | Visual meeting alerts with animated color patterns | ~20 RON |
| Passive Buzzer 3.3V | Audio alerts before and during meetings | ~13 RON |
| Potentiometer Mono 50kΩ | Page navigation via ADC | ~7 RON |
| Tactile Button 6x6x6mm (x2) | Snooze reminder and UI interaction | ~3 RON |
| Jumper Wires M-F 40p 20cm | Component interconnections | ~10 RON |
| Jumper Wires F-F 10p 20cm (x2) | Component interconnections | ~10 RON |
| Breadboard 170 points | Prototyping connections | ~3 RON |
| 3D-printed PLA enclosure | Houses all components | TBD |
Software
- TODO: the rest will be added as I develop the code
| Library | Description | Usage |
|---|---|---|
| st7789 | Display driver for ST7789 | Used for the display for the Pico Explorer Base |
| embedded-graphics | 2D graphics library | Used for drawing to the display |