import machine
import time
from machine import Pin, ADC, PWM, I2C
# Hazırladığımız harici kütüphaneleri çağırıyoruz
from i2c_lcd import I2cLcd
from bmp180 import BMP180 # Wokwi'de dahili yüklü olan sensör kütüphanesi
# --- 1. DONANIM BAŞLATMA ---
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
# Ekran ve Sensör Tanımlamaları
lcd = I2cLcd(i2c, 0x27, 2, 16)
bmp = BMP180(i2c)
# Girişler
pot = ADC(Pin(26))
joy_x = ADC(Pin(27))
joy_y = ADC(Pin(28))
joy_sw = Pin(16, Pin.IN, Pin.PULL_UP)
mod_btn = Pin(17, Pin.IN, Pin.PULL_UP)
# Çıkışlar
led_yesil = Pin(14, Pin.OUT)
led_kirmizi = Pin(13, Pin.OUT)
# 360 Derece Servo Motor (PWM frekansı 50Hz)
servo = PWM(Pin(15))
servo.freq(50)
# Kontrol Sabitleri
SERVO_DUR = 4900
SICAKLIK_ESIK = 28.0
sistem_modu = "MANUEL"
ekran_sayfasi = 0
# --- 2. AÇILIŞ EKRANI ---
lcd.clear()
lcd.putstr("Sistem Yuklendi\nHazir!")
led_yesil.value(1)
led_kirmizi.value(1)
time.sleep(1.5)
led_yesil.value(0)
led_kirmizi.value(0)
lcd.clear()
# --- 3. ANA DÖNGÜ ---
while True:
# Verileri oku
try:
sicaklik = bmp.temperature
basinc = bmp.pressure / 100
except:
sicaklik = 24.5
basinc = 1013.0
# Joystick Butonu -> Mod Değişimi
if joy_sw.value() == 0:
time.sleep(0.2)
if sistem_modu == "MANUEL":
sistem_modu = "OTOMATIK"
else:
sistem_modu = "MANUEL"
lcd.clear()
lcd.putstr(f"Mod: {sistem_modu}")
time.sleep(0.8)
lcd.clear()
# Harici Buton -> Ekran Sayfası Değişimi
if mod_btn.value() == 0:
time.sleep(0.2)
ekran_sayfasi = 1 - ekran_sayfasi
lcd.clear()
# --- SİSTEM MANTIĞI ---
if sistem_modu == "MANUEL":
led_yesil.value(1)
led_kirmizi.value(0)
# Potansiyometre ile hız sınırlama
pot_deger = pot.read_u16()
hiz = int((pot_deger / 65535) * 2000)
# Joystick X ekseni yön kontrolü
x_val = joy_x.read_u16()
if x_val > 45000:
servo.duty_u16(SERVO_DUR + hiz) # Sağa sürekli dönüş
elif x_val < 20000:
servo.duty_u16(SERVO_DUR - hiz) # Sola sürekli dönüş
else:
servo.duty_u16(SERVO_DUR) # Durma konumu
elif sistem_modu == "OTOMATIK":
if sicaklik > SICAKLIK_ESIK:
led_yesil.value(0)
led_kirmizi.value(not led_kirmizi.value()) # Flaşör alarmı
servo.duty_u16(SERVO_DUR + 2000) # Tam gaz acil soğutma fanı
lcd.move_to(0, 0)
lcd.putstr("TEHLIKE! SICAK ")
lcd.move_to(0, 1)
lcd.putstr(f"Temp: {sicaklik}C Fan:MAX")
else:
led_kirmizi.value(0)
led_yesil.value(not led_yesil.value()) # Normal durum yeşil flaşör
servo.duty_u16(SERVO_DUR) # Fan durdurma
# Ekran Güncellemesi (Eğer alarm durumunda değilsek)
if not (sistem_modu == "OTOMATIK" and sicaklik > SICAKLIK_ESIK):
lcd.move_to(0, 0)
lcd.putstr(f"Mod: {sistem_modu} ")
lcd.move_to(0, 1)
if ekran_sayfasi == 0:
lcd.putstr(f"Sicaklik: {sicaklik:.1f}C ")
else:
lcd.putstr(f"Basinc: {basinc:.0f}hPa ")
time.sleep(0.1)