import machine
import time
from machine import Pin, I2C, PWM
import ssd1306
# 1. Initialize Servo (Mochi's Arm)
servo = PWM(Pin(15))
servo.freq(50)
# 2. Initialize OLED Screen (Mochi's Face)
i2c = I2C(1, sda=Pin(2), scl=Pin(3), freq=100000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# 3. Initialize Microphone Simulation (Slide Switch on GP12)
mic_switch = Pin(12, Pin.IN, Pin.PULL_UP)
# 4. Initialize Speaker Simulation (Buzzer on GP20)
speaker = PWM(Pin(20))
speaker.deinit()
def set_servo_angle(angle):
duty = int((angle / 180 * 2 + 0.5) / 20 * 65535)
servo.duty_u16(duty)
def update_screen(status, subtext=""):
try:
oled.fill(0)
oled.text("--- MOCHI AI ---", 0, 0)
oled.text(status, 0, 24)
if subtext:
oled.text(subtext, 0, 44)
oled.show()
except Exception as e:
print("Screen display error:", e)
def mochi_speak(text, tone_freq=600):
print(f"Mochi says: '{text}'")
update_screen("Speaking...", f"'{text}'")
speaker.init()
speaker.freq(tone_freq)
speaker.duty_u16(32768)
set_servo_angle(60)
time.sleep(0.2)
speaker.freq(tone_freq + 100)
set_servo_angle(120)
time.sleep(0.2)
speaker.deinit()
set_servo_angle(90)
# --- START UP ---
set_servo_angle(90)
time.sleep(0.5)
update_screen("System Online", "Flip switch to talk")
print("Mochi Smart Home Assistant Ready.")
while True:
if mic_switch.value() == 0:
update_screen("Listening...", "Saying: 'Hey Mochi'")
time.sleep(1.5)
update_screen("Thinking...", "Processing Voice...")
time.sleep(1.5)
mochi_speak("Hello! I am Mochi.", 523)
time.sleep(1)
mochi_speak("How can I help?", 587)
time.sleep(1)
update_screen("Ready & Waiting", "Flip switch again")
print("\nWaiting for you to flip the switch again...")
while mic_switch.value() == 0:
time.sleep(0.1)
time.sleep(0.1)