from machine import Pin, I2C, PWM
import utime
import onewire
import ds18x20
from sh1106 import SH1106_I2C
# ======================================
# SMARTMED GUARDIAN V4
# ======================================
# ------------ OLED ------------
i2c = I2C(
0,
scl=Pin(1),
sda=Pin(0),
freq=400000
)
oled = SH1106_I2C(128, 64, i2c)
oled.flip(True)
# ------------ SENSOR ------------
ow = onewire.OneWire(Pin(15))
sensor = ds18x20.DS18X20(ow)
roms = sensor.scan()
if len(roms) == 0:
oled.fill(0)
oled.text("ERROR", 40, 12)
oled.text("DS18B20", 25, 30)
oled.text("No detectado", 10, 50)
oled.show()
while True:
utime.sleep(1)
# ------------ LED RGB ------------
led_rojo = Pin(5, Pin.OUT)
led_verde = Pin(3, Pin.OUT)
led_azul = Pin(2, Pin.OUT)
# ------------ BUZZER ------------
buzzer = PWM(Pin(6))
buzzer.duty_u16(0)
# ------------ BOTON ------------
boton = Pin(7, Pin.IN, Pin.PULL_UP)
def silenciar(pin):
global alarma_silenciada
alarma_silenciada = True
buzzer.duty_u16(0)
boton.irq(trigger=Pin.IRQ_FALLING, handler=silenciar)
# ------------ VARIABLES ------------
alarma_silenciada = False
estado_anterior = "OK"
# ======================================
# FUNCIONES RGB
# ======================================
def apagar_rgb():
led_rojo.off()
led_verde.off()
led_azul.off()
def verde():
apagar_rgb()
led_verde.on()
def amarillo():
apagar_rgb()
led_verde.on()
led_rojo.on()
def rojo():
apagar_rgb()
led_rojo.on()
def azul():
apagar_rgb()
led_azul.on()
# ======================================
# BUZZER
# ======================================
def beep(tiempo=120):
if alarma_silenciada:
buzzer.duty_u16(0)
return
buzzer.freq(2500)
buzzer.duty_u16(25000)
utime.sleep_ms(tiempo)
buzzer.duty_u16(0)
# ======================================
# BARRA DE TEMPERATURA
# ======================================
def barra(temp):
if temp < 0:
ancho = 0
elif temp > 12:
ancho = 120
else:
ancho = int((temp / 12) * 120)
oled.rect(4, 32, 120, 8, 1)
oled.fill_rect(4, 32, ancho, 8, 1)
# ======================================
# PANTALLA DE INICIO
# ======================================
azul()
oled.fill(0)
oled.text("SMARTMED",20,8)
oled.text("Guardian",22,24)
oled.text("Iniciando...",14,50)
oled.show()
beep(80)
utime.sleep(2)
# ======================================
# BUCLE PRINCIPAL
# ======================================
while True:
# Leer temperatura
sensor.convert_temp()
utime.sleep_ms(750)
temperatura = sensor.read_temp(roms[0])
# Si vuelve al rango seguro,
# permitir que la alarma vuelva a activarse
if 2 <= temperatura <= 8:
alarma_silenciada = False
oled.fill(0)
oled.text("SMARTMED", 20, 0)
oled.text("Temp:", 0, 14)
oled.text("{:.1f} C".format(temperatura), 50, 14)
barra(temperatura)
# =============================
# ESTADO SEGURO
# =============================
if 2 <= temperatura <= 8:
verde()
buzzer.duty_u16(0)
estado = "OK"
oled.text("Estado:", 0, 46)
oled.text("SEGURO", 55, 46)
# =============================
# ADVERTENCIA
# =============================
elif 8 < temperatura <= 10:
amarillo()
estado = "WARN"
oled.text("Estado:", 0, 46)
oled.text("ADVERTENCIA", 0, 56)
if not alarma_silenciada:
beep(100)
# =============================
# ALARMA
# =============================
else:
rojo()
estado = "ALARM"
oled.text("Estado:", 0, 46)
oled.text("ALARMA", 55, 46)
if alarma_silenciada:
oled.text("Silenciada", 5, 56)
buzzer.duty_u16(0)
else:
beep(150)
utime.sleep_ms(120)
beep(150)
estado_anterior = estado
oled.show()
utime.sleep_ms(150)