from machine import Pin, I2C, UART
import ssd1306
import time
import json # Verileri paketlemek için gerekli kütüphane
# --- DONANIM VE AYARLAR ---
# OLED Ekran Kurulumu
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# RS485 (UART) Haberleşme Kurulumu
# TX = Pin 17, RX = Pin 16 (ESP32'nin UART2 donanımı)
rs485 = UART(2, baudrate=9600, tx=17, rx=16)
# Encoder Pinleri
clk_pin = Pin(34, Pin.IN, Pin.PULL_UP)
dt_pin = Pin(35, Pin.IN, Pin.PULL_UP)
sw_pin = Pin(32, Pin.IN, Pin.PULL_UP)
# Durum Tanımları
MOD_LISTE = 0
MOD_YUKLEME = 1
MOD_SIFRE = 2
MOD_SERVIS = 3
MOD_SERVIS_ALT = 4
su_an_ki_mod = MOD_LISTE
TIMEOUT_SURESI = 15000
son_islem_zamani = time.ticks_ms()
# --- VERİ TABANI ---
hatlar = [
{
"no": "23",
"ust_sabit": "C.HAST-BINEVLER",
"alt_liste": ["DULKADIROGLU", "SAKARYA-SUTCUIMAM", "PINARBASI-KISLA", "HASTANE-CEVRE YOLU"]
},
{
"no": "15B",
"ust_sabit": "KAMPUS-MERKEZ",
"alt_liste": ["BELEDIYE", "OTOGAR", "VALILIK"]
},
{
"no": "34A",
"ust_sabit": "EXPRES HAT",
"alt_liste": ["DURAKSIZ", "DIREK GIDIS"]
}
]
secili_hat = 0
servis_indeks = 0
alt_menu_degeri = 0
girilen_sifre = [0, 0, 0, 0]
sifre_hane = 0
gercek_sifre = [1, 2, 3, 4]
parlaklik_tabela = 80
parlaklik_oled = 100
versiyon = "v2.1.RS485"
son_clk = clk_pin.value()
basma_baslangic = 0
servis_scroll_x = 0
son_scroll_zamani = 0
secenekler = [
"1. P10 Tabela Parlakligi",
"2. OLED Ekran Kontrast",
"3. USB'den Hat Guncelle",
"4. Sistem Bilgileri",
"5. Ana Menuye Cikis"
]
# --- FONKSİYONLAR ---
def oled_yaz(text, x, y):
oled.text(text, x, y)
def marel_logo_ciz():
oled.fill(0)
oled.rect(0, 0, 128, 64, 1)
oled.rect(3, 3, 122, 58, 1)
oled_yaz("M A R E L", 30, 20)
oled_yaz("ELECTRONICS", 22, 35)
for i in range(10, 101, 15):
oled.fill_rect(14, 50, i, 5, 1)
oled.show()
time.sleep(0.1)
time.sleep(0.8)
def veriyi_panellere_gonder(hat_indeksi):
"""Seçilen hattı JSON paketine çevirir ve RS485 hattından otobüse fırlatır"""
secilen = hatlar[hat_indeksi]
oled.fill(0)
oled_yaz("VERI ILETILIYOR", 5, 25)
oled.show()
time.sleep(0.5)
# Veriyi Python sözlüğünden (Dictionary) alıp JSON formatına çeviriyoruz
# Sonuna eklediğimiz '\n' (Alt Satır) karakteri, alıcı panellerin mesajın bittiğini anlamasını sağlar.
veri_paketi = json.dumps({
"no": secilen["no"],
"ust": secilen["ust_sabit"],
"alt": secilen["alt_liste"]
}) + "\n"
# Veriyi RS485 (UART) üzerinden tüm otobüse gönder
rs485.write(veri_paketi.encode())
# Simülasyonda görebilmen için aynı paketi ekrana (Seri Porta) da yazdırıyoruz
print("\n[RS485 HATTI UZERINDEN GONDERILEN PAKET]:")
print(veri_paketi)
print("------------------------------------------\n")
oled.fill(0)
oled_yaz("BASARIYLA", 25, 20)
oled_yaz("YUKLENDI!", 25, 35)
oled.show()
time.sleep(1)
def ekran_ciz():
oled.fill(0)
if su_an_ki_mod == MOD_LISTE:
oled_yaz("--- HAT SECIN ---", 5, 0)
for i in range(len(hatlar)):
prefix = "> " if i == secili_hat else " "
oled_yaz(f"{prefix}{hatlar[i]['no']} {hatlar[i]['ust_sabit'][:11]}", 0, 15 + (i*12))
elif su_an_ki_mod == MOD_SIFRE:
oled_yaz("SERVIS SIFRESI", 10, 0)
ekran_sifre = ""
for i in range(4):
if i < sifre_hane: ekran_sifre += "* "
elif i == sifre_hane: ekran_sifre += f"[{girilen_sifre[i]}]"
else: ekran_sifre += " _ "
oled_yaz(ekran_sifre, 25, 30)
oled_yaz("Cevir ve Bas", 15, 50)
elif su_an_ki_mod == MOD_SERVIS:
oled_yaz("- SERVIS MENU -", 10, 0)
start = max(0, servis_indeks - 2)
for i in range(3):
idx = start + i
if idx < len(secenekler):
metin = secenekler[idx]
y_pos = 15 + (i * 15)
if idx == servis_indeks:
metin_piksel = len(metin) * 8
if metin_piksel > 115:
oled_yaz(">", 0, y_pos)
oled_yaz(metin, 15 - servis_scroll_x, y_pos)
else: oled_yaz(f"> {metin}", 0, y_pos)
else: oled_yaz(f" {metin[:14]}", 0, y_pos)
elif su_an_ki_mod == MOD_SERVIS_ALT:
baslik = "TABELA ISIGI" if servis_indeks == 0 else "EKRAN ISIGI"
oled_yaz(baslik, 10, 0)
oled_yaz(f"% {alt_menu_degeri}", 45, 30)
oled.rect(14, 50, 100, 10, 1)
oled.fill_rect(14, 50, alt_menu_degeri, 10, 1)
oled.show()
# --- SİSTEM BAŞLATMA ---
marel_logo_ciz()
ekran_ciz()
# --- ANA DONGU ---
while True:
su_an = time.ticks_ms()
if su_an_ki_mod != MOD_LISTE and su_an_ki_mod != MOD_YUKLEME:
if time.ticks_diff(su_an, son_islem_zamani) > TIMEOUT_SURESI:
su_an_ki_mod = MOD_LISTE
sifre_hane = 0
ekran_ciz()
if su_an_ki_mod == MOD_SERVIS:
if time.ticks_diff(su_an, son_scroll_zamani) > 100:
metin = secenekler[servis_indeks]
if len(metin) * 8 > 115:
servis_scroll_x += 4
if servis_scroll_x > (len(metin) * 8 + 20): servis_scroll_x = -110
else: servis_scroll_x = 0
son_scroll_zamani = su_an
ekran_ciz()
clk_durum = clk_pin.value()
if clk_durum != son_clk and clk_durum == 1:
if time.ticks_diff(su_an, son_islem_zamani) > 5:
son_islem_zamani = su_an
yon = 1 if dt_pin.value() != clk_durum else -1
if su_an_ki_mod == MOD_LISTE:
secili_hat = (secili_hat + yon) % len(hatlar)
elif su_an_ki_mod == MOD_SIFRE:
girilen_sifre[sifre_hane] = (girilen_sifre[sifre_hane] + yon) % 10
elif su_an_ki_mod == MOD_SERVIS:
servis_indeks = (servis_indeks + yon) % len(secenekler)
servis_scroll_x = 0
elif su_an_ki_mod == MOD_SERVIS_ALT:
alt_menu_degeri = max(0, min(100, alt_menu_degeri + (yon * 5)))
if servis_indeks == 1: oled.contrast(int((alt_menu_degeri / 100) * 255))
ekran_ciz()
son_clk = clk_durum
if sw_pin.value() == 0:
if basma_baslangic == 0: basma_baslangic = su_an
if time.ticks_diff(su_an, basma_baslangic) > 3000:
if su_an_ki_mod == MOD_LISTE:
son_islem_zamani = su_an
su_an_ki_mod = MOD_SIFRE
girilen_sifre = [0,0,0,0]; sifre_hane = 0
ekran_ciz()
time.sleep(0.5)
basma_baslangic = 0
else:
if basma_baslangic != 0:
son_islem_zamani = su_an
sure = time.ticks_diff(su_an, basma_baslangic)
basma_baslangic = 0
if sure < 1000:
if su_an_ki_mod == MOD_LISTE:
su_an_ki_mod = MOD_YUKLEME
veriyi_panellere_gonder(secili_hat)
su_an_ki_mod = MOD_LISTE
ekran_ciz()
elif su_an_ki_mod == MOD_SIFRE:
sifre_hane += 1
if sifre_hane > 3:
su_an_ki_mod = MOD_SERVIS if girilen_sifre == gercek_sifre else MOD_LISTE
servis_indeks = 0
ekran_ciz()
elif su_an_ki_mod == MOD_SERVIS:
if servis_indeks == 0:
su_an_ki_mod = MOD_SERVIS_ALT; alt_menu_degeri = parlaklik_tabela
elif servis_indeks == 1:
su_an_ki_mod = MOD_SERVIS_ALT; alt_menu_degeri = parlaklik_oled
elif servis_indeks == 3:
oled.fill(0)
oled_yaz(f"Ver: {versiyon}", 0, 0)
oled_yaz("P10 Durum: OK", 0, 15)
oled_yaz("Sistem: 24 C", 0, 30)
oled.show()
time.sleep(2.5)
ekran_ciz()
elif servis_indeks == 4: su_an_ki_mod = MOD_LISTE
ekran_ciz()
elif su_an_ki_mod == MOD_SERVIS_ALT:
if servis_indeks == 0: parlaklik_tabela = alt_menu_degeri
elif servis_indeks == 1: parlaklik_oled = alt_menu_degeri
su_an_ki_mod = MOD_SERVIS; ekran_ciz()
time.sleep(0.01)