# main.py
from machine import Pin, SPI
import utime
# Kullanacağınız pcd8544_fb.py dosyasından PCD8544_FB sınıfını import ediyoruz
from pcd8544_fb import PCD8544_FB
# --- Pin Tanımlamaları ---
S0_PIN = 0
S1_PIN = 1
S2_PIN = 2
S3_PIN = 3
MUX_SIG_PIN = 28
s0 = Pin(S0_PIN, Pin.OUT)
s1 = Pin(S1_PIN, Pin.OUT)
s2 = Pin(S2_PIN, Pin.OUT)
s3 = Pin(S3_PIN, Pin.OUT)
mux_signal = Pin(MUX_SIG_PIN, Pin.IN)
LED_PIN = 15
led = Pin(LED_PIN, Pin.OUT)
BUZZER_PIN = 14
buzzer = Pin(BUZZER_PIN, Pin.OUT)
BUTTON_PIN = 13
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
spi = SPI(0, baudrate=2000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
dc_pin = Pin(16, Pin.OUT)
rst_pin = Pin(20, Pin.OUT)
cs_pin = Pin(17, Pin.OUT)
lcd = PCD8544_FB(spi, cs=cs_pin, dc=dc_pin, rst=rst_pin)
# Gerekirse kontrastı ayarlayın: lcd.contrast(contrast=0x3C)
# --- Global Değişkenler ---
system_armed = False
alarm_triggered = False
# --- Buton Durum Değişkenleri (Debounce ve Kenar Algılama için) ---
button_physical_state_previous = button.value() # Butonun fiziksel durumunun bir önceki hali
button_debounced_value = button_physical_state_previous # Butonun kararlı (debounced) değeri
button_last_change_time = utime.ticks_ms() # Son durum değişikliğinin zamanı
DEBOUNCE_DELAY_MS = 50 # Debounce için milisaniye (daha önce 250ms idi, kısalttım)
# --- Fonksiyonlar ---
def select_mux_channel(channel):
s0.value((channel >> 0) & 1)
s1.value((channel >> 1) & 1)
s2.value((channel >> 2) & 1)
s3.value((channel >> 3) & 1)
utime.sleep_us(50)
def update_lcd():
lcd.fill(0)
if alarm_triggered:
lcd.text("HAREKET!", 0, 0, 1)
lcd.text("Bolge: 1", 0, 10, 1)
lcd.text("Kapat: BAS", 0, 20, 1)
elif system_armed:
lcd.text("SISTEM KURULU", 0, 0, 1) # Max 14 karakter (5px font) veya 10 karakter (8px font)
lcd.text("Bolge 1 Gozleniyor", 0, 10, 1) # Bu hala biraz uzun, "B1 Gozleniyor" olabilir
# Örnek kısaltılmış:
# lcd.text("KURULU", 0, 0, 1)
# lcd.text("B1 GOZLENIYOR", 0, 10, 1)
# lcd.text("KAPAT: BAS", 0, 20, 1)
lcd.text("Kapat: BAS", 0, 20, 1) # Daha kısa
else: # Sistem devredışı
lcd.text("DEVRE DISI", 0, 0, 1)
lcd.text("Kur: BAS", 0, 10, 1)
lcd.show()
def process_button_event():
global system_armed, alarm_triggered
# Buton olayı algılandı (düşen kenar: 1 -> 0)
print("Buton basildi!") # DEBUG
if alarm_triggered:
alarm_triggered = False
system_armed = False # Alarmı kapatırken sistemi de devredışı bırak
elif system_armed:
system_armed = False
else: # system_armed is False
system_armed = True
# Buton aksiyonundan sonra LED/Buzzer durumlarını hemen ayarla
if not system_armed:
led.off()
buzzer.off()
else: # system_armed == True (yeni kuruldu veya zaten kuruluydu)
if not alarm_triggered: # Sadece kurulduysa, alarm yoksa
led.on() # Sistemi kurunca LED yansın
buzzer.off() # Buzzer kapalı kalsın
update_lcd()
# --- Ana Kurulum ---
led.off()
buzzer.off()
select_mux_channel(0)
# button_last_change_time zaten global tanımlamada ayarlandı.
# İlk LCD güncellemesi
update_lcd()
# --- Ana Döngü ---
print("Alarm Sistemi Calisiyor...")
while True:
print(f"Buton Ham Değeri: {button.value()}")
# --- Buton Okuma ve Debounce ---
current_button_physical_state = button.value()
current_time = utime.ticks_ms()
if current_button_physical_state != button_physical_state_previous:
# Butonun fiziksel durumu değişti, debounce zamanlayıcısını sıfırla
button_last_change_time = current_time
button_physical_state_previous = current_button_physical_state # Bir sonraki döngü için sakla
if utime.ticks_diff(current_time, button_last_change_time) > DEBOUNCE_DELAY_MS:
# Butonun fiziksel durumu DEBOUNCE_DELAY_MS süresince değişmedi (kararlı)
if current_button_physical_state != button_debounced_value:
# Kararlı durum değişti
button_debounced_value = current_button_physical_state
if button_debounced_value == 0: # Buton basıldı (düşen kenar algılandı)
process_button_event()
# --- Buton Okuma Sonu ---
if system_armed:
if not alarm_triggered:
led.on() # Sistem kurulu ve alarm yoksa LED yanık
select_mux_channel(0)
motion_detected_flag = mux_signal.value() == 1
if motion_detected_flag:
print(f"PIR HAREKET ALGILADI! MUX Sinyali: {mux_signal.value()}") # DEBUG
alarm_triggered = True
buzzer.on()
update_lcd()
# else: # DEBUG
# print(f"PIR Hareketsiz. MUX Sinyali: {mux_signal.value()}")
# else: (alarm tetiklendiğinde)
# LED ve Buzzer zaten açık olmalı, işlem yok
pass
else: # Sistem kurulu değil (system_armed == False)
if not alarm_triggered : # Alarm da yoksa (genelde butonla kapatılmıştır)
led.off()
buzzer.off()
# update_lcd() zaten buton olayıyla çağrılıyor, burada sürekli çağırmaya gerek yok.
utime.sleep_ms(20) # Döngü sıklığını ayarla