from machine import ADC, Pin, I2C
import utime
import math
import ssd1306
import neopixel
# Inicialización de los pines ADC para el sensor y el setpoint
AnalogIn = ADC(0) # gp26 Entrada del sensor TMP36 o LM35.
SetPoint = ADC(1) # gp27 Entrada voltaje de ajuste del setpoint de temperatura (Pot 5 ó 10 kOhm).
# Configuración del I2C para la pantalla OLED
i2c = I2C(0, scl=Pin(5), sda=Pin(4)) # Ajusta estos pines a los que conectes la pantalla OLED
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # Pantalla OLED 128x64 con controlador SSD1306
# Configuración del LED, relé y NeoPixel
LED = Pin(15, Pin.OUT)
Relay = Pin(16, Pin.OUT)
NUM_PIXELS = 16 # Cambia esto al número de LEDs en tu anillo NeoPixel
np = neopixel.NeoPixel(Pin(17), NUM_PIXELS) # Configura el NeoPixel en el pin GP17
LED.value(0)
Relay.value(0)
# Constantes de conversión
Conv = 3300 / 65535 # Conversión de lectura ADC a voltaje
Conv1 = 80 / 3300 # Conversión adicional para ajustar el setpoint
# Cálculo de la temperatura con la ecuación Steinhart-Hart
def Temperature(RawValue):
c1 = 0.001129148
c2 = 0.000234125
c3 = 0.0000000876741
R1 = 10000.0
ADC_Res = 65535.0
if RawValue == 0: # Evitar división por 0
return None
R2 = R1 / ((ADC_Res / RawValue) - 1)
T = math.log(R2)
Tmp = 1.0 / (c1 + (c2 + (c3 * T * T)) * T)
Temp = Tmp - 273.15
return Temp
# Función para mostrar la temperatura y el setpoint en la pantalla OLED
def display_oled(room_temp, set_temp):
oled.fill(0) # Limpiar la pantalla
oled.text("Temp Actual:", 0, 0) # Texto para la temperatura actual
oled.text("{:.2f} C".format(room_temp), 0, 10) # Muestra la temperatura
oled.text("Setpoint:", 0, 30) # Texto para el setpoint
oled.text("{:.2f} C".format(set_temp), 0, 40) # Muestra el setpoint
oled.show() # Actualiza la pantalla
# Función para actualizar el color de todo el anillo NeoPixel según la temperatura
def update_neopixel(temp):
if 30 <= temp < 35:
color = (0, 255, 0) # Verde
elif 35 <= temp < 37:
color = (255, 165, 0) # Naranja
elif temp >= 37:
color = (255, 0, 0) # Rojo
else:
color = (0, 0, 0) # Apagado si no está en los rangos
# Aplica el color a todos los LEDs del anillo
for i in range(NUM_PIXELS):
np[i] = color
np.write() # Actualiza el NeoPixel
# Bucle principal
while True:
# Leer el valor del potenciómetro (setpoint)
ValorPot = SetPoint.read_u16() # Lectura del ADC
TempSP = Conv * ValorPot # Convierte el valor ADC a voltaje
SetTemp = 0 + TempSP * Conv1 # Ajusta el setpoint a grados Celsius
# Leer la temperatura de la habitación (sensor de temperatura)
V = AnalogIn.read_u16() # Lectura del sensor de temperatura
RoomTemp = Temperature(V) # Conversión a grados Celsius
if RoomTemp is not None:
# Muestra la temperatura y el setpoint en la pantalla OLED
display_oled(RoomTemp, SetTemp)
# Control del relé y el LED según la temperatura y el setpoint
if RoomTemp < SetTemp:
Relay.value(1) # Activa el relé
LED.value(1) # Enciende el LED
else:
Relay.value(0) # Apaga el relé
LED.value(0) # Apaga el LED
# Actualiza el color de todo el anillo NeoPixel según la temperatura
update_neopixel(RoomTemp)
utime.sleep(1) # Espera 1 segundo antes de la siguiente lectura