import machine
import time
import framebuf
# --- PCD8544 Nokia 5110 LCD Sürücüsü ---
PCD8544_FUNCTIONSET = 0x20
PCD8544_DISPLAYCONTROL = 0x08
PCD8544_DISPLAYNORMAL = 0x0C
PCD8544_SETYADDR = 0x40
PCD8544_SETXADDR = 0x80
PCD8544_EXTENDEDINSTRUCTION = 0x21
PCD8544_SETVOP = 0x80
PCD8544_SETBIAS = 0x10
class PCD8544(framebuf.FrameBuffer):
def __init__(self, spi, dc_pin_num, rst_pin_num, cs_pin_num, bl_pin_num=None, contrast=0x3F, bias=0x03):
self.spi = spi
self.dc = machine.Pin(dc_pin_num, machine.Pin.OUT)
self.rst = machine.Pin(rst_pin_num, machine.Pin.OUT)
self.cs = machine.Pin(cs_pin_num, machine.Pin.OUT)
if bl_pin_num is not None:
self.bl = machine.Pin(bl_pin_num, machine.Pin.OUT)
self.bl.on()
else:
self.bl = None
self.height = 48
self.width = 84
self.buffer = bytearray(self.height // 8 * self.width)
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
self.reset()
self.command(PCD8544_FUNCTIONSET | 0x01) # Extended instruction set
self.command(PCD8544_SETVOP | contrast)
self.command(PCD8544_SETBIAS | bias)
self.command(PCD8544_FUNCTIONSET) # Basic instruction set
self.command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL)
self.clear_screen()
def command(self, cmd):
self.dc.off()
self.cs.off()
self.spi.write(bytearray([cmd]))
self.cs.on()
def data(self, val):
self.dc.on()
self.cs.off()
self.spi.write(val)
self.cs.on()
def reset(self):
self.rst.on()
time.sleep_ms(10)
self.rst.off()
time.sleep_ms(10)
self.rst.on()
time.sleep_ms(10)
def show(self):
self.command(PCD8544_SETYADDR | 0)
self.command(PCD8544_SETXADDR | 0)
self.data(self.buffer)
def clear_screen(self):
self.fill(0)
self.show()
def display_text(self, text_lines):
self.fill(0)
y_offset = 0
for line in text_lines:
if y_offset < self.height - 7: # 8 piksel yükseklik, biraz boşluk
self.text(line, 0, y_offset, 1) # (metin, x, y, renk=1:piksel yanık)
y_offset += 9 # Satır aralığı
self.show()
# --- Pin Tanımlamaları ---
# LCD
LCD_SPI_SCK_PIN_NUM = 18
LCD_SPI_MOSI_PIN_NUM = 19
LCD_DC_PIN_NUM = 16
LCD_RST_PIN_NUM = 17
LCD_CS_PIN_NUM = 20
LCD_BL_PIN_NUM = 21
# Shift Register (LED için)
SR_SER_PIN_NUM = 10
SR_RCLK_PIN_NUM = 12
SR_SRCLK_PIN_NUM = 11
# Multiplexer (Butonlar için)
MUX_SIG_PIN_NUM = 26
MUX_S0_PIN_NUM = 13
MUX_S1_PIN_NUM = 14
# PIR Sensör
PIR_PIN_NUM = 27
# --- Donanım Başlatma ---
spi = machine.SPI(0, baudrate=2000000, polarity=0, phase=0,
sck=machine.Pin(LCD_SPI_SCK_PIN_NUM),
mosi=machine.Pin(LCD_SPI_MOSI_PIN_NUM))
lcd = PCD8544(spi, LCD_DC_PIN_NUM, LCD_RST_PIN_NUM, LCD_CS_PIN_NUM, LCD_BL_PIN_NUM)
ser_pin = machine.Pin(SR_SER_PIN_NUM, machine.Pin.OUT)
rclk_pin = machine.Pin(SR_RCLK_PIN_NUM, machine.Pin.OUT)
srclk_pin = machine.Pin(SR_SRCLK_PIN_NUM, machine.Pin.OUT)
mux_sig = machine.Pin(MUX_SIG_PIN_NUM, machine.Pin.IN, machine.Pin.PULL_UP)
mux_s0 = machine.Pin(MUX_S0_PIN_NUM, machine.Pin.OUT)
mux_s1 = machine.Pin(MUX_S1_PIN_NUM, machine.Pin.OUT)
pir = machine.Pin(PIR_PIN_NUM, machine.Pin.IN)
# --- Yardımcı Fonksiyonlar ---
def set_led_state_sr(state):
rclk_pin.value(0)
for i in range(8):
srclk_pin.value(0)
if i == 0:
ser_pin.value(1 if state else 0)
else:
ser_pin.value(0)
srclk_pin.value(1)
rclk_pin.value(1)
def select_mux_channel(channel):
if channel == 0: # MUX C0 (Eski BTN_ARM)
mux_s0.value(0)
mux_s1.value(0)
elif channel == 1: # MUX C1 (Eski BTN_ACK)
mux_s0.value(1)
mux_s1.value(0)
elif channel == 2: # MUX C2 (Sizin ilk butonunuz)
mux_s0.value(0)
mux_s1.value(1)
elif channel == 3: # MUX C3 (Sizin ikinci butonunuz)
mux_s0.value(1)
mux_s1.value(1)
def read_button(button_index):
select_mux_channel(button_index)
time.sleep_us(200)
value = mux_sig.value()
s0_val, s1_val = -1, -1
if button_index == 0: s0_val, s1_val = 0, 0
elif button_index == 1: s0_val, s1_val = 1, 0
elif button_index == 2: s0_val, s1_val = 0, 1
elif button_index == 3: s0_val, s1_val = 1, 1
print(f"Buton Indeksi: {button_index}, S0: {s0_val}, S1: {s1_val}, MUX Cikis (GP26): {value}, Basili Mi: {'EVET' if value == 0 else 'HAYIR'}")
return value
# --- Sistem Değişkenleri ---
# Bu değişkenler artık yeni butonlarınızla nasıl bir mantık kuracağınıza bağlı.
# Şimdilik varsayılan değerlerinde bırakıyorum.
system_armed = False
motion_detected_flag = False
led_on_motion = False # LED'in hareketle yanıp yanmayacağı
# Sadece iki butonunuz olduğu için indeksleri ve değişkenleri buna göre ayarlıyoruz.
# Bu butonları MUX kanalları C2 ve C3'e bağladığınızı varsayıyoruz.
BTN_1_INDEX = 2 # Sizin ilk butonunuz (önceki BTN_NEW1_INDEX)
BTN_2_INDEX = 3 # Sizin ikinci butonunuz (önceki BTN_NEW2_INDEX)
# Debounce Değişkenleri (Sadece mevcut 2 buton için)
btn_1_last_state = 1
btn_2_last_state = 1
btn_1_raw_previous_state = 1
btn_2_raw_previous_state = 1
btn_1_last_change_time = 0
btn_2_last_change_time = 0
DEBOUNCE_DELAY_MS = 200
# --- Ana Döngü ---
lcd.display_text(["Sistem Basliyor", "Lutfen Bekleyin.."])
time.sleep(1)
set_led_state_sr(False) # Başlangıçta LED sönük
print("Sistem Hazir.")
while True:
current_time = time.ticks_ms()
# --- SİZİN İLK BUTONUNUZ (BTN_1_INDEX üzerinden MUX Kanalı 2) ---
raw_btn_1_current_state = read_button(BTN_1_INDEX)
if raw_btn_1_current_state != btn_1_raw_previous_state:
btn_1_last_change_time = current_time
btn_1_raw_previous_state = raw_btn_1_current_state
if (current_time - btn_1_last_change_time) > DEBOUNCE_DELAY_MS:
if raw_btn_1_current_state != btn_1_last_state:
btn_1_last_state = raw_btn_1_current_state
if btn_1_last_state == 0: # Buton 1'e basıldıysa
print(f"BUTON 1 (Kanal {BTN_1_INDEX}) BASILDI!")
# BURAYA BUTON 1 İÇİN İSTEDİĞİNİZ İŞLEVİ EKLEYİN
# Örnek: system_armed = not system_armed
# lcd.display_text(["Buton 1 Aktif"])
# time.sleep_ms(300)
# --- SİZİN İKİNCİ BUTONUNUZ (BTN_2_INDEX üzerinden MUX Kanalı 3) ---
raw_btn_2_current_state = read_button(BTN_2_INDEX)
if raw_btn_2_current_state != btn_2_raw_previous_state:
btn_2_last_change_time = current_time
btn_2_raw_previous_state = raw_btn_2_current_state
if (current_time - btn_2_last_change_time) > DEBOUNCE_DELAY_MS:
if raw_btn_2_current_state != btn_2_last_state:
btn_2_last_state = raw_btn_2_current_state
if btn_2_last_state == 0: # Buton 2'ye basıldıysa
print(f"BUTON 2 (Kanal {BTN_2_INDEX}) BASILDI!")
# BURAYA BUTON 2 İÇİN İSTEDİĞİNİZ İŞLEVİ EKLEYİN
# Örnek: if system_armed and motion_detected_flag: motion_detected_flag = False
# lcd.display_text(["Buton 2 Aktif"])
# time.sleep_ms(300)
# --- PIR Sensör Okuma ---
# Bu kısım, system_armed değişkeninin durumuna göre çalışır.
# system_armed değişkenini yeni butonlarınızdan biriyle kontrol edebilirsiniz.
if pir.value() == 1:
if system_armed and not motion_detected_flag: # Sadece sistem kuruluysa ve daha önce hareket algılanmadıysa
motion_detected_flag = True
led_on_motion = True # Hareket algılandığında LED'i yakmak için bayrağı ayarla
print("HAREKET ALGILANDI!")
# lcd.display_text(["HAREKET VAR!", "Sistem Kurulu"]) # Örnek LCD mesajı
# time.sleep_ms(300)
# --- LED Kontrolü ---
# Bu kısım da system_armed ve led_on_motion değişkenlerine bağlı.
if system_armed and led_on_motion: # Sistem kuruluysa VE hareket sonrası LED yakma bayrağı aktifse
set_led_state_sr(True)
else:
set_led_state_sr(False)
# Eğer sistem kurulu değilse veya hareket onaylanmışsa (led_on_motion = False ise) LED'i kapat
# led_on_motion bayrağını sıfırlama işini butonlarınıza atayabilirsiniz.
# --- LCD Güncelleme ---
display_lines = []
if system_armed:
display_lines.append("Durum: Kurulu")
if motion_detected_flag:
display_lines.append("HAREKET VAR!")
else:
display_lines.append("Gozetleniyor...")
else:
display_lines.append("Durum: Devre Disi")
if motion_detected_flag: # Sistem kurulu olmasa bile son algılanan hareketi gösterebilirsiniz
display_lines.append("Son Hrk: Algilandi") # Opsiyonel
# motion_detected_flag = False # Ya da burada sıfırlayabilirsiniz veya bir butonla
# Butonların anlık durumunu LCD'de göstermek isterseniz:
# if btn_1_last_state == 0:
# display_lines.append("B1 Basili")
# if btn_2_last_state == 0:
# display_lines.append("B2 Basili")
lcd.display_text(display_lines[:5]) # En fazla 5 satır göster
time.sleep_ms(50)Loading
cd74hc4067
cd74hc4067