# https://wokwi.com/projects/447013801714465793
from machine import Pin, PWM, I2C
import utime
from ssd1306 import SSD1306_I2C
from nec import NEC_8
# ---------- SERVO ----------
servo = PWM(Pin(15))
servo.freq(50)
def mover_servo(angulo):
min_duty = 1638 # ≈0.5 ms
max_duty = 8192 # ≈2.5 ms
duty = int(min_duty + (angulo / 180) * (max_duty - min_duty))
servo.duty_u16(duty)
utime.sleep(0.5)
# ---------- OLED ----------
i2c = I2C(0, scl=Pin(17), sda=Pin(16))
oled = SSD1306_I2C(128, 64, i2c)
def mostrar_mensaje(texto):
oled.fill(0)
lines = texto.split("\n")
for i, line in enumerate(lines):
oled.text(line, 0, i*10 + 20)
oled.show()
# ---------- IR RECEIVER ----------
ir = Pin(14, Pin.IN)
# ---------- Códigos NEC para + y – (ajustados a Wokwi) ----------
CODIGO_MAS = 0x40 # botón +
CODIGO_MENOS = 0x19 # botón –
# ---------- Estado ventana ----------
ventana_abierta = False
def actualizar_estado():
if ventana_abierta:
mover_servo(90)
mostrar_mensaje("Open Window")
print("Open Window")
else:
mover_servo(0)
mostrar_mensaje("Window Closed")
print("Window Closed")
# ---------- Callback NEC ----------
def callback(codigo, addr, ext):
global ventana_abierta
if codigo == CODIGO_MAS:
ventana_abierta = True
actualizar_estado()
elif codigo == CODIGO_MENOS:
ventana_abierta = False
actualizar_estado()
else:
print("Unrecognized code:", hex(codigo))
# ---------- Inicialización NEC ----------
decoder = NEC_8(ir, callback)
# ---------- Mensaje inicial ----------
mostrar_mensaje("System started\nutime.sleep(1) -")
utime.sleep(1)
# ---------- Estado inicial de la ventana ----------
ventana_abierta = False
actualizar_estado()
print("System initialized. Window closed.")
# ---------- Bucle principal ----------
while True:
decoder.process() # NEC procesa la señal
utime.sleep(0.05)