import machine
import onewire
import ds18x20
import time
import binascii
from ssd1306 import SSD1306_I2C
from machine import Pin, I2C
import framebuf
# Configuración
UMBRAL_ALERTA = 30.0 # Temperatura para activar alerta
INTERVALO = 2 # Segundos entre lecturas
# Hardware
## Sensor interno
adc = machine.ADC(4) # Sensor de temperatura interno
## Sensor DS18B20
ds_pin = machine.Pin(26)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
sensores = ds_sensor.scan()
## OLED
i2c = machine.I2C(0, scl=machine.Pin(5), sda=machine.Pin(4))
oled = SSD1306_I2C(128, 64, i2c)
print("Dispositivos I2C detectados:", [hex(addr) for addr in i2c.scan()])
OLED_ADDR = 0x3C
WIDTH = 128
HEIGHT = 64
try:
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=OLED_ADDR)
print("Pantalla OLED inicializada correctamente")
except Exception as e:
print("Error al inicializar la pantalla:", e)
imagen_bytes = bytearray([
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xf0, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0xff,
0xf0, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x3f, 0x7a, 0x4c, 0x71, 0xbb, 0x3b, 0xff,
0xf3, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x1f, 0x0d, 0xb7, 0xb6, 0xba, 0xdb, 0xff,
0xf3, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x0f, 0x7f, 0xf6, 0x36, 0xba, 0x1b, 0xff,
0xf3, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x0f, 0x7b, 0xf5, 0xb6, 0xba, 0xfb, 0xff,
0xf0, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x07, 0x7b, 0xf5, 0xb6, 0xd2, 0xfb, 0xff,
0xf0, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x01, 0x7b, 0xff, 0xff, 0xfb, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x33, 0xff, 0xff, 0xfb, 0xff, 0xff,
0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3b, 0x18, 0x63, 0x8a, 0x73, 0xff,
0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6a, 0xeb, 0x7d, 0x7b, 0xed, 0xff,
0xf1, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x4a, 0x0b, 0xe1, 0x7b, 0xed, 0xff,
0xf1, 0xf1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x5a, 0xfb, 0xfd, 0x7b, 0xed, 0xff,
0xf0, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x7b, 0x0b, 0x61, 0x8b, 0xe1, 0xff,
0xf0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf2, 0x49, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf2, 0x49, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf2, 0x09, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0x19, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0x19, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x6d, 0x64, 0xb5, 0xd6, 0x5f, 0xff,
0xf3, 0xf9, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x1b, 0xad, 0xfe, 0xfa, 0xdf, 0xff,
0xf3, 0xf9, 0x80, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0x6b, 0xad, 0xf6, 0xfa, 0xff, 0xff,
0xf3, 0xf9, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x6f, 0xad, 0xfe, 0xfa, 0xdf, 0xff,
0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x74, 0x6d, 0xf0, 0xfb, 0x3f, 0xff,
0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0x8f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0x8f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf0, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0x8f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xcf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xc7, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xe7, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf3, 0xe3, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
])
def mostrar_imagen():
try:
fb = framebuf.FrameBuffer(imagen_bytes, WIDTH, HEIGHT, framebuf.MONO_HLSB)
oled.fill(0)
oled.blit(fb, 0, 0)
oled.show()
print("Imagen mostrada correctamente")
except Exception as e:
print(f"Error al mostrar la imagen: {e}")
oled.fill(0)
oled.text("Error imagen", 10, HEIGHT//2 - 8)
oled.show()
def mostrar_contador(valor):
oled.fill(0)
texto = "{:04d}".format(valor)
x = (WIDTH - len(texto) * 8) // 2
y = (HEIGHT - 8) // 2
oled.text(texto, x, y)
oled.show()
contador = 0
print("Mostrando imagen en la pantalla...")
mostrar_imagen()
print("Iniciando bucle principal")
print("Mostrando imagen en la pantalla...")
mostrar_imagen()
time.sleep(4)
def leer_temperatura_interna():
lectura = adc.read_u16()
voltaje = lectura * (3.3 / 65535)
return 27 - (voltaje - 0.706) / 0.001721
def leer_ds18b20():
temps = {}
if sensores:
ds_sensor.convert_temp()
time.sleep_ms(750)
for sensor in sensores:
addr = binascii.hexlify(sensor).decode('ascii')[:8] # Primeros 8 chars
temps[addr] = ds_sensor.read_temp(sensor)
return temps
# Bucle principal
while True:
oled.fill(0)
try:
# Lecturas
temp_interna = leer_temperatura_interna()
temps_ds = leer_ds18b20()
# Determinar estado general
max_temp = max([temp_interna] + list(temps_ds.values())) if temps_ds else temp_interna
alerta = max_temp >= UMBRAL_ALERTA
# Mostrar en OLED
if alerta:
oled.text("ALERTA!", 0, 0)
oled.text("Alta Temp.",0,15)
#oled.text(f"Max: {max_temp:.1f}C", 0, 15)
else:
oled.text("Temperatura: ", 0, 0)
oled.text("Normal",0,15)
#oled.text(f"Max: {max_temp:.1f}C", 0, 15)
# Detalles de temperatura
oled.text(f"Interna: {temp_interna:.1f}C", 0, 30)
if temps_ds:
for i, (addr, temp) in enumerate(temps_ds.items()):
oled.text(f"DS{addr}: {temp:.1f}C", 0, 45 + i*10)
# Debug en consola
print(f"Interna: {temp_interna:.1f}C | DS18B20: {temps_ds}")
except Exception as e:
oled.text("Error lectura", 0, 10)
oled.text(str(e)[:20], 0, 30)
oled.show()
time.sleep(INTERVALO)