from machine import Pin, I2C, ADC, PWM
import utime
import math
# --- Donanım Tanımları ---
i2c = I2C(0, scl=Pin(1), sda=Pin(0)) # RTC DS1307 için I2C
rtc_address = 0x68
led = Pin(3, Pin.OUT)
buzzer = PWM(Pin(4)) # PWM kullanarak ses çıkarabiliriz
button = Pin(2, Pin.IN, Pin.PULL_UP)
pot = ADC(Pin(26))
alarm_hour = 0
alarm_minute = 0
alarm_active = False
alarm_triggered = False
# Mario müziği için notalar ve frekanslar
NOTES = [
392, 392, 392, 311, 466, 392, 311, 466, 392,
587, 587, 587, 622, 466, 369, 311, 466, 392,
392, 392, 392, 311, 466, 392, 311, 466, 392,
784, 392, 392, 784, 740, 698, 659, 622, 659,
415, 554, 523, 493, 466, 440, 466,
392, 466, 440, 466, 392, 392, 392, 392
]
DURATIONS = [
300, 300, 300, 150, 150, 300, 150, 150, 600,
300, 300, 300, 150, 150, 300, 150, 150, 600,
300, 300, 300, 150, 150, 300, 150, 150, 600,
150, 300, 150, 150, 150, 150, 150, 150, 300,
150, 150, 150, 150, 150, 150, 300,
150, 150, 150, 150, 150, 150, 150, 600
]
# --- Yardımcı Fonksiyonlar ---
def bcd2dec(bcd):
return (bcd // 16) * 10 + (bcd % 16)
def read_time():
try:
data = i2c.readfrom_mem(rtc_address, 0x00, 7)
second = bcd2dec(data[0] & 0x7F)
minute = bcd2dec(data[1])
hour = bcd2dec(data[2])
weekday = bcd2dec(data[3])
day = bcd2dec(data[4])
month = bcd2dec(data[5])
year = bcd2dec(data[6]) + 2000
return (year, month, day, weekday, hour, minute, second, 0)
except Exception as e:
print("RTC okunamadı:", e)
return (2000, 1, 1, 0, 0, 0, 0, 0)
def read_alarm_from_pot():
global alarm_hour, alarm_minute
val = pot.read_u16()
total_minutes = int((val / 65535) * 1439) # 24*60-1 = 1439
alarm_hour = total_minutes // 60
alarm_minute = total_minutes % 60
def check_alarm(now):
global alarm_active, alarm_triggered
year, month, day, weekday, hour, minute, second, _ = now
if hour == alarm_hour and minute == alarm_minute and second == 0:
if not alarm_triggered: # Alarm yeni tetiklendi
alarm_active = True
alarm_triggered = True
elif alarm_triggered and (hour != alarm_hour or minute != alarm_minute):
alarm_triggered = False # Alarm zamanı geçti, resetle
def play_song():
for i in range(len(NOTES)):
if not alarm_active: # Alarm durdurulduysa çalmayı kes
break
if NOTES[i] == 0:
buzzer.duty_u16(0) # Sesi kapat
else:
buzzer.freq(NOTES[i])
buzzer.duty_u16(32767) # %50 duty cycle
utime.sleep_ms(DURATIONS[i])
buzzer.duty_u16(0) # Sesi kapat
def trigger_alarm():
global alarm_active
led.on()
play_song() # Mario müziğini çal
# Eğer alarm hala aktifse (butona basılmadıysa) tekrar çal
if alarm_active:
utime.sleep(0.1)
trigger_alarm()
def stop_alarm(pin):
global alarm_active
alarm_active = False
led.off()
buzzer.duty_u16(0) # Sesi kapat
button.irq(trigger=Pin.IRQ_FALLING, handler=stop_alarm)
# --- E-Paper Display Fonksiyonları ---
def update_display(now, alarm_set, alarm_status):
# Bu fonksiyon e-paper display güncellemesi yapacak
# Wokwi'de print ile simüle ediyoruz
year, month, day, weekday, hour, minute, second, _ = now
print("\n" + "="*20)
print(f"Şu anki zaman: {hour:02}:{minute:02}:{second:02}")
print(f"Alarm Zamanı: {alarm_set[0]:02}:{alarm_set[1]:02}")
print(f"Durum: {alarm_status}")
print("="*20 + "\n")
# --- Ana Döngü ---
while True:
now = read_time()
read_alarm_from_pot()
check_alarm(now)
# Display güncelleme
if alarm_active:
update_display(now, (alarm_hour, alarm_minute), "ALARM ÇALIYOR!")
else:
if alarm_triggered:
update_display(now, (alarm_hour, alarm_minute), "Alarm Durduruldu")
else:
update_display(now, (alarm_hour, alarm_minute), "Beklemede")
if alarm_active:
trigger_alarm()
utime.sleep(0.1) # Daha hassas kontrol için bekleme süresini kısalttıkLoading
epaper-2in9
epaper-2in9