# 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ı ---
# CD74HC4067 MUX Pinleri
S0_PIN = 0
S1_PIN = 1
S2_PIN = 2
S3_PIN = 3
MUX_SIG_PIN = 28 # PIR sensör çıkışı MUX üzerinden bu pine bağlı
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 Pini
LED_PIN = 15
led = Pin(LED_PIN, Pin.OUT)
# Buzzer Pini
BUZZER_PIN = 14
buzzer = Pin(BUZZER_PIN, Pin.OUT)
# Buton Pini
BUTTON_PIN = 13
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP) # Dahili pull-up direnci aktif
# Nokia 5110 LCD Pinleri (SPI0)
spi = SPI(0, baudrate=2000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
dc_pin = Pin(16, Pin.OUT) # Data/Command pini
rst_pin = Pin(20, Pin.OUT) # Reset pini
cs_pin = Pin(17, Pin.OUT) # Chip Select pini
lcd = PCD8544_FB(spi, cs=cs_pin, dc=dc_pin, rst=rst_pin)
# --- Global Değişkenler ---
system_armed = False
alarm_triggered = False
pir_ready = False
startup_time = utime.ticks_ms()
debug_mode = True # Debug çıktıları için
# --- Buton Durum Değişkenleri ---
button_physical_state_previous = button.value()
button_debounced_value = button_physical_state_previous
button_last_change_time = utime.ticks_ms()
DEBOUNCE_DELAY_MS = 50
# PIR Kalibrasyon süresi (5 saniye - test için kısa)
PIR_CALIBRATION_TIME_MS = 5000
# PIR okuma sayacı (sürekli izleme için)
pir_read_counter = 0
# --- Fonksiyonlar ---
def select_mux_channel(channel):
"""Verilen kanalı MUX üzerinde seçer."""
s0.value((channel >> 0) & 1)
s1.value((channel >> 1) & 1)
s2.value((channel >> 2) & 1)
s3.value((channel >> 3) & 1)
utime.sleep_us(100) # MUX'ın pine yerleşmesi için bekleme
def update_lcd():
"""LCD ekranını mevcut duruma göre günceller."""
lcd.fill(0)
current_time = utime.ticks_ms()
elapsed_time = utime.ticks_diff(current_time, startup_time)
if not pir_ready:
# PIR kalibrasyon durumu
remaining_seconds = (PIR_CALIBRATION_TIME_MS - elapsed_time) // 1000
lcd.text("PIR HAZIR.", 0, 0, 1)
lcd.text(f"BEKLE: {max(0, remaining_seconds)}s", 0, 10, 1)
lcd.text("LUTFEN BEKLE", 0, 20, 1)
elif alarm_triggered:
lcd.text("*** ALARM ***", 0, 0, 1)
lcd.text("HAREKET VAR!", 0, 10, 1)
lcd.text("KAPAT: BUTON", 0, 20, 1)
elif system_armed:
lcd.text("SISTEM AKTIF", 0, 0, 1)
lcd.text("PIR IZLIYOR", 0, 10, 1)
lcd.text("KAPAT: BUTON", 0, 20, 1)
else: # Sistem devredışı
lcd.text("DEVRE DISI", 0, 0, 1)
lcd.text("AKTIF: BUTON", 0, 10, 1)
if pir_ready:
lcd.text("PIR HAZIR", 0, 20, 1)
lcd.show()
def process_button_event():
""" Buton olayı algılandığında çağrılır """
global system_armed, alarm_triggered
print("BUTON BASILDI!")
# PIR hazır değilse sadece mesaj ver
if not pir_ready:
print("PIR henuz hazir degil!")
return
if alarm_triggered:
alarm_triggered = False
system_armed = False
print("ALARM KAPATILDI")
elif system_armed:
system_armed = False
print("SISTEM DEVRE DISI")
else:
system_armed = True
print("SISTEM AKTIF")
# LED ve buzzer durumunu ayarla
led.off()
buzzer.off()
if system_armed and not alarm_triggered:
led.on() # Sistem aktifken LED yanar
update_lcd()
def test_pir_direct():
"""PIR sensörünü doğrudan test et (MUX olmadan)"""
# Kanal 0'ı seç
select_mux_channel(0)
utime.sleep_ms(10)
pir_value = mux_signal.value()
return pir_value
def check_pir_sensor():
"""PIR sensörünü kontrol eder"""
global alarm_triggered, pir_read_counter
pir_read_counter += 1
# PIR sensörünü oku
pir_value = test_pir_direct()
# Her 20 okumada bir debug bilgisi yazdır
if debug_mode and (pir_read_counter % 20 == 0):
print(f"PIR Okuma #{pir_read_counter}: {pir_value}")
# Hareket algılandı mı?
if pir_value == 1:
print(f"*** HAREKET ALGILANDI! *** PIR Degeri: {pir_value}")
alarm_triggered = True
led.on()
buzzer.on()
update_lcd()
return True
return False
def test_mux_channels():
"""Tüm MUX kanallarını test et"""
print("MUX Kanal Testi Baslatiliyor...")
for channel in range(16):
select_mux_channel(channel)
value = mux_signal.value()
print(f"Kanal {channel}: {value}")
utime.sleep_ms(100)
# --- Ana Kurulum ---
print("=== ALARM SISTEMI BASLATILIYOR ===")
led.off()
buzzer.off()
# MUX test
print("MUX Testi yapiliyor...")
test_mux_channels()
# PIR kanalını seç
select_mux_channel(0)
print("PIR Kanal 0 secildi")
update_lcd()
print("PIR sensör kalibrasyonu bekleniyor...")
# --- Ana Döngü ---
loop_counter = 0
while True:
loop_counter += 1
current_time = utime.ticks_ms()
elapsed_time = utime.ticks_diff(current_time, startup_time)
# PIR hazır olma kontrolü
if not pir_ready and elapsed_time >= PIR_CALIBRATION_TIME_MS:
pir_ready = True
print("*** PIR SENSÖR HAZIR! ***")
update_lcd()
# Her 100 döngüde bir durum bilgisi yazdır
if debug_mode and (loop_counter % 100 == 0):
print(f"Dongu #{loop_counter} - Sistem: {'AKTIF' if system_armed else 'PASIF'}, PIR: {'HAZIR' if pir_ready else 'BEKLIYOR'}, Alarm: {'VAR' if alarm_triggered else 'YOK'}")
# --- Buton Okuma ve Debounce ---
current_button_physical_state = button.value()
if current_button_physical_state != button_physical_state_previous:
button_last_change_time = current_time
button_physical_state_previous = current_button_physical_state
if utime.ticks_diff(current_time, button_last_change_time) > DEBOUNCE_DELAY_MS:
if current_button_physical_state != button_debounced_value:
button_debounced_value = current_button_physical_state
if button_debounced_value == 0: # Buton basıldı (düşen kenar)
process_button_event()
# --- Buton Okuma Sonu ---
# --- PIR Sensör Kontrolü ---
if system_armed and pir_ready and not alarm_triggered:
led.on() # Sistem aktifken LED yanar
# PIR sensörünü kontrol et
check_pir_sensor()
elif not system_armed and not alarm_triggered:
led.off()
buzzer.off()
# LCD'yi periyodik olarak güncelle
if not pir_ready and (loop_counter % 10 == 0):
update_lcd()
utime.sleep_ms(50) # Ana döngü gecikmesi