from machine import Timer, Pin, PWM, I2C
from array import array
import onewire, ds18x20, ssd1306
import utime
# ----- IR Decoder Sınıfı -----
class IR_RX():
# Komutlar
PLUS_CODE = 0xFF02FD # + tuşu
MINUS_CODE = 0xFF9867 # - tuşu
def __init__(self, pin, nedges, tblock, callback):
self._pin = pin
self._nedges = nedges
self._tblock = tblock
self.callback = callback
self._times = array('i', (0 for _ in range(nedges + 1)))
self.edge = 0
self.toggle = True
self.sim_mode = True # IR olmadan test için
pin.irq(handler=self._cb_pin, trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING)
self.tim = Timer(-1)
def _cb_pin(self, pin):
t = utime.ticks_us()
if self.edge <= self._nedges:
if self.edge == 0:
self.tim.init(period=self._tblock, mode=Timer.ONE_SHOT, callback=self._decode)
self._times[self.edge] = t
self.edge += 1
def _decode(self, t):
# Simülasyon: + ve - tuşlarını sırayla gönder
if self.sim_mode:
if self.toggle:
cmd = self.PLUS_CODE
else:
cmd = self.MINUS_CODE
self.toggle = not self.toggle
self.callback(cmd, 0, 0)
self.edge = 0
def close(self):
self._pin.irq(handler=None)
self.tim.deinit()
# ----- Sıcaklık Sensörü (DS18B20) -----
ds_pin = Pin(17)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
# ----- OLED Ekran -----
i2c = I2C(0, scl=Pin(1), sda=Pin(0))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# ----- Servo -----
servo = PWM(Pin(15))
servo.freq(50)
def set_servo_angle(angle):
duty = int(1638 + (angle / 180) * (8192 - 1638))
servo.duty_u16(duty)
# ----- Sıcaklık Eşiği Ayarları -----
TEMP_THRESHOLD = 10
MIN_THRESHOLD = 5
MAX_THRESHOLD = 30
current_threshold = TEMP_THRESHOLD
# ----- IR Callback -----
last_ir_time = 0
DEBOUNCE_TIME_MS = 300
def ir_callback(cmd, addr, ext):
global current_threshold, last_ir_time
now = utime.ticks_ms()
if utime.ticks_diff(now, last_ir_time) < DEBOUNCE_TIME_MS:
return
last_ir_time = now
print("IR komut alındı: 0x{:06X}".format(cmd))
if cmd == IR_RX.PLUS_CODE and current_threshold < MAX_THRESHOLD:
current_threshold += 1
print("Eşik ARTTI:", current_threshold)
elif cmd == IR_RX.MINUS_CODE and current_threshold > MIN_THRESHOLD:
current_threshold -= 1
print("Eşik AZALDI:", current_threshold)
# ----- IR Başlat -----
ir_pin = Pin(14, Pin.IN)
decoder = IR_RX(ir_pin, 100, 120, ir_callback)
# ----- Ana Döngü -----
while True:
ds_sensor.convert_temp()
utime.sleep_ms(750)
temp = ds_sensor.read_temp(roms[0])
if temp >= current_threshold:
servo_status = "Servo Donuyor!"
set_servo_angle(0)
else:
servo_status = "Servo Durdu"
set_servo_angle(90)
oled.fill(0)
oled.text("Sicaklik: {:.1f} C".format(temp), 0, 0)
oled.text("Esik: {}".format(current_threshold), 0, 20)
oled.text(servo_status, 0, 40)
oled.show()
print("Sicaklik: {:.1f} C | Esik: {} | {}".format(temp, current_threshold, servo_status))
utime.sleep(0.2)