Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
97f9f96
Update README.md
wendyju Sep 12, 2020
11d656a
Update readme.md
wendyju Sep 24, 2020
9a6a373
Create README.md
wendyju Feb 22, 2021
8b4aa22
Create README.md
wendyju Mar 12, 2021
6e3fef7
Create README.md
wendyju Sep 30, 2021
2383195
Add files via upload
rei039474 Nov 9, 2021
edb7822
Update README.md
JessicaDJ0807 Aug 27, 2025
8532807
Describe heart rate indicator device and its functionality
JessicaDJ0807 Aug 27, 2025
2e9c13f
Lab 1: update readme & upload resource
JessicaDJ0807 Sep 1, 2025
5625718
Lab 1: update video links to use google drive
JessicaDJ0807 Sep 1, 2025
072667b
Lab 1: fix format
JessicaDJ0807 Sep 1, 2025
d3e6807
Lab 1: add table title in part F
JessicaDJ0807 Sep 1, 2025
b21ecb6
rename resource folder to assets
JessicaDJ0807 Sep 7, 2025
5e662e3
refactor assets folder
JessicaDJ0807 Sep 7, 2025
e2e1241
Lab 1, Part 2: update readme & upload assets
JessicaDJ0807 Sep 7, 2025
36e3341
Lab 1, Part 2: improve formatting of Part F
JessicaDJ0807 Sep 7, 2025
b5c1e67
refactor assets folder
JessicaDJ0807 Sep 7, 2025
72c4f7d
Lab 2: finish Part 1D
JessicaDJ0807 Sep 14, 2025
e34e567
Lab 2: modify readme part G
JessicaDJ0807 Sep 15, 2025
8ad1332
implement hotpot_timer.py
JessicaDJ0807 Sep 22, 2025
47f1ec2
Lab 2: add video link for part F
JessicaDJ0807 Sep 22, 2025
28d6b78
Lab 2: enhance README with project details for dining device
JessicaDJ0807 Sep 22, 2025
4cbf546
Lab 3: finish Lab 3 Part 1
JessicaDJ0807 Sep 29, 2025
fbe6a5b
Merge branch 'IRL-CT:Fall2025' into Fall2025
JessicaDJ0807 Oct 4, 2025
594bc32
Lab 3: implement fairy mate
JessicaDJ0807 Oct 6, 2025
d5e6946
Lab 3: add demo video
JessicaDJ0807 Oct 6, 2025
3bb8eb4
Lab 3: update readme & upload storyboard
JessicaDJ0807 Oct 6, 2025
375fa4e
Lab 3: update readme
JessicaDJ0807 Oct 9, 2025
9cc6ad6
Lab 4: link lab 4 folder
JessicaDJ0807 Oct 13, 2025
7d6491e
Lab 4: finish lab 4 part 1
JessicaDJ0807 Oct 13, 2025
b55a910
Lab 4: modify image sizes in readme
JessicaDJ0807 Oct 14, 2025
8f25268
Merge branch 'IRL-CT:Fall2025' into Fall2025
JessicaDJ0807 Oct 20, 2025
3683199
Lab 4: testing traffic light application
JessicaDJ0807 Oct 21, 2025
65b6479
Lab 4: implement 2 qwiic buttons
JessicaDJ0807 Oct 21, 2025
1a4ff13
Lab 4: implement Eye Wellness Assistant demo
JessicaDJ0807 Oct 21, 2025
0e4f024
Lab 4: finish lab 4 part 2
JessicaDJ0807 Oct 21, 2025
7d943f8
Merge branch 'Fall2025' into Fall2025
JessicaDJ0807 Oct 25, 2025
27d37d4
link lab 5 in README
JessicaDJ0807 Oct 26, 2025
a63c0de
Lab 5: implement smile together
JessicaDJ0807 Nov 3, 2025
8a228d1
Lab 5: finish readme for Lab 5a & Lab 5b
JessicaDJ0807 Nov 3, 2025
ee56f4d
Merge branch 'IRL-CT:Fall2025' into Fall2025
JessicaDJ0807 Nov 9, 2025
d4c7112
Lab 6: implement color hunter
JessicaDJ0807 Nov 10, 2025
617cbbf
Lab 6: update readme and uplaod images
JessicaDJ0807 Nov 10, 2025
3e8c265
Project: add 4 genres of music from 1950s-2020s
JessicaDJ0807 Dec 4, 2025
f17d8af
update .gitignore for LumiTune + clean tracked files
JessicaDJ0807 Dec 5, 2025
80136ab
add MQTT-driven music playback engine (genre, decade, volume support)
JessicaDJ0807 Dec 5, 2025
97728e5
add LumiTune-webpage React frontend with MQTT WebSocket controller
JessicaDJ0807 Dec 5, 2025
ed0aa77
create backend folder with sensor and MQTT modules
JessicaDJ0807 Dec 5, 2025
6fa62bd
update project readme with project info
JessicaDJ0807 Dec 7, 2025
1f9b889
Update Final Project link in README
JessicaDJ0807 Dec 7, 2025
625472e
update lighting rules and rotary encoder mode
JessicaDJ0807 Dec 7, 2025
e835ea4
integrate sensor + MQTT pipelines, refactor backend, and archive lega…
JessicaDJ0807 Dec 7, 2025
1c745e4
add display_controller module and integrate into main_musicbox
JessicaDJ0807 Dec 8, 2025
3220d62
refactor archived files
JessicaDJ0807 Dec 12, 2025
d6370ba
update readme and add device photos & demo video
JessicaDJ0807 Dec 12, 2025
af08590
Fix link formatting for Online Repository
JessicaDJ0807 Dec 12, 2025
02c9f34
update readme and add storyboard
JessicaDJ0807 Dec 15, 2025
3d51904
update readme with reflection and team contribution
JessicaDJ0807 Dec 23, 2025
22b26dc
Add final project demo video reference
JessicaDJ0807 Dec 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 50 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,54 @@
venv
venv*
__*
ollama_venv/
.venv*
.venv/
.venv

# =========================================
# Node / Vite (LumiTune-webpage)
# =========================================

# Ignore ALL node_modules folders in repo
node_modules/

# Vite build output
dist/

# Local configuration (contains Pi IP)
Project/LumiTune-webpage/public/config.js

# npm / yarn / pnpm lockfiles (optional)
package-lock.json
pnpm-lock.yaml
yarn.lock

# =========================================
# Python caches (all labs + project)
# =========================================
__pycache__/
*.pyc
*.pyo
*.pyd

# =========================================
# Logs
# =========================================
*.log
logs/

# =========================================
# Editor / OS junk
# =========================================
Thumbs.db
.vscode/
.idea/
*~

# =========================================
# Audio / ML Artifacts (optional)
# Comment these out if you want to commit them
# =========================================
# *.tflite
# *.onnx

180 changes: 179 additions & 1 deletion Lab 1/README.md

Large diffs are not rendered by default.

Binary file added Lab 1/assets/Lab_1a/IDD_Lab1_partB.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1a/IDD_Lab1_partD.mov
Binary file not shown.
Binary file added Lab 1/assets/Lab_1a/IDD_Lab1_partD_photo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1a/IDD_Lab1_partF_design1.mp4
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1a/IDD_Lab1_partF_design2.mp4
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1a/IDD_Lab1_partF_design3.mp4
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1b/PartA_storyboard.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1b/PartE_sketch1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Lab 1/assets/Lab_1b/PartE_sketch2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
43 changes: 42 additions & 1 deletion Lab 2/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Interactive Prototyping: The Clock of Pi
**NAMES OF COLLABORATORS HERE**

Jessica Hsiao (dh779), Irene Wu (yw2785)

---
Does it feel like time is moving strangely during this semester?

For our first Pi project, we will pay homage to the [timekeeping devices of old](https://en.wikipedia.org/wiki/History_of_timekeeping_devices) by making simple clocks.
Expand Down Expand Up @@ -190,7 +193,15 @@ Pro Tip: Using tools like [code-server](https://coder.com/docs/code-server/lates

## Part G.
## Sketch and brainstorm further interactions and features you would like for your clock for Part 2.
A shared social dining tool that helps hotpot eaters time their food (like meat or veggies) without pulling out phones. → The goal is convenience, fun, and better-timed food.

Features
- The device would show a countdown of minutes/seconds.
- When the remaining time is less than 30 seconds, the device's screen would turn yellow to red to notify users.
- Users could push a button to reset the timer.
- Users could also change the countdown time by clicking the button several times.

![IDD_Lab2a_interaction](./demo_pic/interaction.png)

# Prep for Part 2

Expand All @@ -212,15 +223,45 @@ Please sketch/diagram your clock idea. (Try using a [Verplank diagram](https://c

**We strongly discourage and will reject the results of literal digital or analog clock display.**


\*\*\***A copy of your code should be in your Lab 2 Github repo.**\*\*\*

---

### Overview

A **shared dining device** designed to make hotpot or barbecue experiences more **convenient, fun, and perfectly timed**. The tool helps diners know exactly when their ingredients, like meat, seafood, or vegetables, are ready without needing to check their phones or guess.

### Scenario

Imagine sitting at a hotpot or Korean barbecue restaurant with friends. Instead of constantly asking “Is this ready yet?” or pulling out your phone timer, you simply select your ingredient on the device, and it takes care of the timing for you.

### Target Users

- **Casual diners** who don’t know the proper cooking times for different ingredients.
- **Groups of friends or families** who want to focus on conversation instead of managing timers.

### Key Functions

- **Menu Page** – Users scroll through ingredient options (beef, shrimp, vegetables, etc.).
- **Button A**: Scroll through the menu to choose the ingredient.
- **Button B**: Confirm selection and move to the countdown page.
- **Countdown Page** – Displays a timer specific to the selected ingredient’s ideal cooking time.
- **Exit Countdown Mode** – Press buttons A + B simultaneously to stop the timer and return to the menu.
- **Notification** – At the end of the countdown, the device displays a clear message indicating the food is ready to eat.

### Goal

- **Convenience** – No need for phones or manual timing.
- **Fun** – Adds a playful, interactive element to the dining experience.
- **Better-Timed Food** – Reduces overcooking or undercooking, leading to a tastier meal.

## Assignment that was formerly Part F.
## Make a short video of your modified barebones PiClock

\*\*\***Take a video of your PiClock.**\*\*\*

https://github.com/user-attachments/assets/2a973db1-5ccc-49a2-b3e1-7ada9772d3f3

After you edit and work on the scripts for Lab 2, the files should be upload back to your own GitHub repo! You can push to your personal github repo by adding the files here, commiting and pushing.

```
Expand Down
Binary file added Lab 2/demo_pic/interaction.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
178 changes: 178 additions & 0 deletions Lab 2/hotpot_timer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# rpi5_minipitft_st7789.py
# Works on Raspberry Pi 5 with Adafruit Blinka backend (lgpio) and SPI enabled.
# Wiring change: connect the display's CS to GPIO5 (pin 29), not CE0.

import time
import digitalio
import board
from PIL import Image, ImageDraw, ImageFont
import adafruit_rgb_display.st7789 as st7789
import webcolors


# ---------------------------
# SPI + Display configuration
# ---------------------------
# Use a FREE GPIO for CS to avoid conflicts with the SPI driver owning CE0/CE1.
cs_pin = digitalio.DigitalInOut(board.D5) # GPIO5 (PIN 29) <-- wire display CS here
dc_pin = digitalio.DigitalInOut(board.D25) # GPIO25 (PIN 22)
reset_pin = None

# Safer baudrate for stability; you can try 64_000_000 if your wiring is short/clean.
BAUDRATE = 64000000

# Create SPI object on SPI0 (spidev0.* must exist; enable SPI in raspi-config).
spi = board.SPI()

# For Adafruit mini PiTFT 1.14" (240x135) ST7789 use width=135, height=240, x/y offsets below.
# If you actually have a 240x240 panel, set width=240, height=240 and x_offset=y_offset=0.
# Keep the “native” portrait dims for this board
DISPLAY_WIDTH = 135
DISPLAY_HEIGHT = 240

display = st7789.ST7789(
spi,
cs=cs_pin,
dc=dc_pin,
rst=reset_pin,
baudrate=BAUDRATE,
width=DISPLAY_WIDTH,
height=DISPLAY_HEIGHT,
x_offset=53,
y_offset=40,
)

# ---------------------------
# Backlight + Buttons
# ---------------------------
backlight = digitalio.DigitalInOut(board.D22)
backlight.switch_to_output(value=True)

buttonA = digitalio.DigitalInOut(board.D23)
buttonB = digitalio.DigitalInOut(board.D24)
buttonA.switch_to_input(pull=digitalio.Pull.UP)
buttonB.switch_to_input(pull=digitalio.Pull.UP)

# ---------------------------
# Menu items
# ---------------------------
menu_items = {
"Beef": "0:15", # 15 seconds
"Pork": "0:30", # 30 seconds
"Chicken": "1:00", # 1 minute
"Lamb": "1:30", # 1 minute 30 sec
"Fish": "0:10", # 10 sec
"Vegetarian": "0:05", # 5 sec
"Vegan": "2:00" # 2 minutes
}

# ---------------------------
# Global Variables
# ---------------------------
mode = 0 # 0 for menu, 1 for timer
selected_index = 0

image = Image.new("RGB", (display.width, display.height))
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 20)

# ---------------------------
# Functions
# ---------------------------
def draw_menu():
global mode, selected_index
mode = 0
draw.rectangle((0, 0, image.width, image.height), fill=0)

y = 10
for i, (item, _) in enumerate(menu_items.items()):
prefix = "> " if i == selected_index else " "
color = (255, 255, 0) if i == selected_index else (255, 255, 255)
draw.text((10, y), prefix + item, font=font, fill=color)
y += 30
display.image(image)

def select_item():
global mode, selected_index
global buttonA, buttonB
keys = list(menu_items.keys())
selected_key = keys[selected_index]

# --- Convert stored "M:S" string to total seconds ---
value = menu_items[selected_key]
if isinstance(value, str): # e.g. "1:30"
min_str, sec_str = value.split(":")
countdown = int(min_str) * 60 + int(sec_str)
else: # fallback if already stored as seconds
countdown = int(value)

while countdown >= 0:
# check if both buttons are pressed, exit the countdown
a_pressed = not buttonA.value
b_pressed = not buttonB.value

# if both pressed → exit countdown
if a_pressed and b_pressed:
mode = 0
selected_index = 0
draw_menu()
return # exit function immediately

draw.rectangle((0, 0, image.width, image.height), fill=0)

# Format as MM:SS
minutes, seconds = divmod(countdown, 60)
time_string = f"{minutes:02}:{seconds:02}"

draw.text((10, 10), f"{selected_key} Timer", font=font, fill="#FFFFFF")
draw.text((10, 40), time_string, font=font, fill="#00FF00")

display.image(image)
time.sleep(1)

countdown -= 1

# Final message when countdown is done
draw.rectangle((0, 0, image.width, image.height), fill=0)
draw.text((10, 10), f"{selected_key} Ready!", font=font, fill="#FF0000")
display.image(image)

# ---------------------------
# Main loop
# ---------------------------
print("Display size:", display.width, "x", display.height)
print("Press A for previous item, B for next item, both to exit.")

draw_menu()

while True:
a_pressed = (buttonA.value == False)
b_pressed = (buttonB.value == False)

if a_pressed and b_pressed:
draw.rectangle((0, 0, display.width, display.height), outline=0, fill=0)
draw.text((10, 100), "Goodbye!", font=font, fill=(255, 0, 0))
display.image(image)
time.sleep(1)
break

if a_pressed:
if mode == 0:
selected_index = (selected_index + 1) % len(menu_items)
draw_menu()
time.sleep(0.3) # debounce delay
else:
selected_index = 0
draw_menu()
time.sleep(0.3) # debounce delay

if b_pressed:
if mode == 0:
mode = 1
select_item()
time.sleep(0.3) # debounce delay
else:
mode = 0
selected_index = 0
draw_menu()
time.sleep(0.3) # debounce delay
1 change: 1 addition & 0 deletions Lab 2/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
disp.image(image)

image = Image.open("red.jpg")
image = image.rotate(90, expand=True)
backlight = digitalio.DigitalInOut(board.D22)
backlight.switch_to_output()
backlight.value = True
Expand Down
6 changes: 4 additions & 2 deletions Lab 2/screen_clock.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
# Alternatively load a TTF font. Make sure the .ttf font file is in the
# same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 18)
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 30)

# Turn on the backlight
backlight = digitalio.DigitalInOut(board.D22)
Expand All @@ -62,9 +62,11 @@

while True:
# Draw a black filled box to clear the image.
draw.rectangle((0, 0, width, height), outline=0, fill=400)
draw.rectangle((0, 0, width, height), outline=0, fill=0)

#TODO: Lab 2 part D work should be filled in here. You should be able to look in cli_clock.py and stats.py
current_time = time.strftime("%m/%d/%Y\n%H:%M:%S")
draw.text((0, 0), current_time, font=font, fill="#FFFFFF")

# Display image.
disp.image(image, rotation)
Expand Down
Loading