from machine import I2C, Pin, PWM
from time import sleep
import i2c_lcd
# Inisialisasi LCD I2C
i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400000)
addr = i2c.scan()[0] if i2c.scan() else 0x27
lcd = i2c_lcd.I2cLcd(i2c, addr, 2, 16)
# Inisialisasi Buzzer
buzzer = PWM(Pin(18))
buzzer.duty(512)
# Nada (Hz)
notes = {
'1': 261, # C
'2': 294, # D
'3': 329, # E
'4': 349, # F
'5': 392, # G
'6': 440, # A
'7': 494, # B
' ': 0
}
# Lirik dan melodi per baris
lyrics = [
"Happy Birthday"
"to You",
"Happy Birthday"
"to You",
"Happy Birthday"
"dear Zakki",
"Happy Birthday"
"to You"
]
melodies = [
['5','5','6','5','1','7'], # Baris 1
['5','5','6','5','2','1'], # Baris 2
['5','5','8','5','3','2','1'], # Baris 3
['6','6','5','3','4','3'] # Baris 4
]
beats = [
[4,4,2,2,2,4],
[4,4,2,2,2,4],
[4,4,2,2,2,2,4],
[4,4,2,2,2,4]
]
def play_line(line, melody, beat):
lcd.clear()
lcd.putstr(line)
for i, note in enumerate(melody):
freq = notes.get(note, 0)
dur = beat[i]
if freq > 0:
buzzer.freq(freq)
buzzer.duty(512)
else:
buzzer.duty(0)
sleep(0.4 * (4/dur))
buzzer.duty(0)
sleep(0.05)
sleep(1)
# Main program
while True:
for i in range(len(lyrics)):
play_line(lyrics[i], melodies[i], beats[i])
lcd.clear()
lcd.putstr("Selesai :)")
sleep(2)