Skip to main content

Xiao ESP32C3 ESPHome Termostato Inteligente

pir

Esta wiki te guiará paso a paso sobre cómo hacer un Termostato Inteligente con Xiao ESP32C3 y ESPHome. ¡Comencemos!

Preparación del Hardware

Si deseas seguir este tutorial por completo, necesitarás preparar lo siguiente:

Seeed Studio XIAO ESP32C3Seeed Studio Expansion BoardHome Assistant Devices
e.g. Seeed Studio Home assistant Yellow

Grove Sensors

Sensor de Temperatura y Humedad Grove - Pro (DHT22/AM2302)Relé SPDT de 2 canales GroveRelé de alta corriente Grove - 5V/10APantalla OLED Grove - 0.96" (SSD1315)Botones momentáneos (cualquier tipo servirá)

pir

pir

pir

pir

pir

Preparación del Software

Instalar Home Assistant

Asegúrate de que ya tienes Home Assistant instalado y en funcionamiento. Existen múltiples guías en la wiki que explican cómo flashear Home Assistant en diferentes productos. En este caso, estoy usando Home Assistant Yellow, que funciona con Raspberry Pi CM4, por lo que puedo utilizar directamente la opción oficial para flashear el sistema operativo en Home Assistant Yellow.

Instalar ESPHome en Home Assistant

ESPHome está disponible como un complemento de Home Assistant y se puede instalar fácilmente desde la tienda de complementos.

pir

  • Paso 1. Click en INSTALL
  • Paso 2. Habilita las opciones y da click en START

A continuación verás la siguiente ventana si ESPHome cargó exitosamente

Empezando

Una vez que el software y el hardware estén listos, podremos comenzar.

1. Agrega tu XIAO ESP32C3 a ESPHome

  • Paso 1. Haz click en + NEW DEVICE
  • Paso 2. Haz click en CONTINUE
  • Paso 3. Ingresa un Nombre para el dispositivo y proporciona las credenciales de WiFi, como el Nombre de la red y la Contraseña. Luego, haz clic en NEXT.
  • Paso 4. Selecciona ESP32-C3 y da click.
  • Paso 5. Haz clic en SKIP, ya que configuraremos esta placa manualmente.

2. Crea y sube el archivo YAML Config

  • Paso 1. Haz clic en EDIT debajo de la placa recién creada.
  • Paso 7. Crear y subir la configuración YAML

    Explicación del código a continuación:

    • Nombre: "thermostat"

    • Configuración de la placa:

      Modo de flasheo configurado en DIO.

      Placa especificada como "seeed_xiao_esp32c3" con el framework de Arduino.

    • Acciones al iniciar:

      Muestra un mensaje en el registro: "Booting thermostat."

      Apaga tres relés: calefacción, refrigeración y ventilador.

      Espera 500 milisegundos.

      Ejecuta un script llamado "boot_beep".

    • Configuración del script:

      Script de arranque (Boot Beep):

      Activa un buzzer, establece su frecuencia para emitir un pitido y lo apaga después de 300 milisegundos.

    • Configuración de API y OTA:

      API:

      Clave de encriptación especificada.

      OTA:

      Contraseña establecida en "13371337" para actualizaciones inalámbricas (over-the-air).

    • Configuración del buzzer:

      Configurado usando la plataforma LEDC con el pin 5.

    • Configuración de Wi-Fi:

      Especifica el SSID y la contraseña para la conexión Wi-Fi.

      Configura un hotspot de respaldo (captive portal) con SSID "Xiao-Esp32C3" y contraseña "13371337".

    • Configuración de I2C:

      Configura la comunicación I2C con SDA en el pin 6 y SCL en el pin 7.

    • Configuración de fuentes:

      Define dos fuentes tipográficas para la pantalla con diferentes tamaños.

    • Configuración de la pantalla:

      Utiliza una pantalla I2C SSD1315 con una función lambda para formatear y mostrar información.

      Muestra temperatura en Fahrenheit, humedad, intensidad de la señal Wi-Fi y dirección IP.

    • Configuración de sensores:

      Utiliza un sensor DHT22 para lecturas de temperatura y humedad con un intervalo de actualización de 10 segundos.

      Incluye un sensor de señal Wi-Fi con un intervalo de actualización de 20 segundos.

    • Configuración de sensores de texto:

      Muestra la dirección IP del termostato y la versión de ESPHome.

    • Configuración de interruptores:

      Configura tres interruptores GPIO para relay_heat, relay_cooling y relay_fan.

    • Configuración de sensores binarios:

      Configura un sensor binario para el botón del ventilador de circulación.

      Al presionarlo, controla el modo de ventilador del sistema de climatización.

    • Configuración de climatización:

      Implementa un control de termostato usando el sensor de temperatura especificado.

      Define acciones para calefacción, refrigeración, modo ventilador e inactividad.

      Establece límites de temperatura, tamaños de paso y ajustes predefinidos.

    Copia y pega esta configuración en el archivo YAML de configuración de tu dispositivo ESPHome. También puedes descargar el archivo completo .yaml aquí.

esphome:
name: ecostat
platformio_options:
board_build.flash_mode: dio
on_boot:
priority: 750
then:
- logger.log: "Booting EcoStat"
- delay: 500ms
- lambda: |-
id(relay_heat).turn_off();
id(relay_cooling).turn_off();
id(relay_fan).turn_off();
id(ecostat_control_heat).mode = CLIMATE_MODE_OFF;
id(ecostat_control_cooling).mode = CLIMATE_MODE_OFF;
- script.execute: boot_beep

esp32:
board: seeed_xiao_esp32c3
variant: esp32c3
framework:
type: arduino
platform_version: 5.4.0

#logger:
# level: VERY_VERBOSE

api:
encryption:
key: "YOURKEYHERE"

ota:
password: "13371337"

script:
- id: boot_beep
then:
# First ^E
- output.turn_on: buzzer
- output.ledc.set_frequency:
id: buzzer
frequency: 659.25Hz # E
- output.set_level:
id: buzzer
level: "50%"
- delay: 150ms
- output.turn_off: buzzer
- output.turn_on: buzzer
- output.ledc.set_frequency:
id: buzzer
frequency: 1000Hz
- output.set_level:
id: buzzer
level: "50%"
- delay: 150ms
- output.turn_off: buzzer
output:
- platform: ledc
pin: 5
id: buzzer

wifi:
ssid: YOURWIFINAME
password: YOURWIFIPASS

# Habilita un hotspot de respaldo (captive portal) en caso de que la conexión Wi-Fi falle.
ap:
ssid: "Xiao-Esp32C3 Fallback Hotspot"
password: "13371337"

i2c:
sda: 6
scl: 7
scan: False

font:
# gfonts://family[@weight]
- file: "gfonts://Roboto"
id: roboto
size: 20

- file: "gfonts://Poppins@700"
id: inter
size: 10

display:
- platform: SSD1315_i2c
id: oled
model: "SSD1315 128x64"
address: 0x3C
lambda: |-
float temp_celsius = id(temp).state;
float temp_fahrenheit = (temp_celsius * 9.0 / 5.0) + 32.0;
char temp_str[6]; // Buffer for temperature string
dtostrf(temp_celsius, 4, 1, temp_str); // Convert Celsius to string with 1 decimal place

it.print(28, 0, id(inter), id(ip_address).state.c_str());
it.printf(0, 18, id(roboto), "T: %.1f ", temp_fahrenheit);
it.printf(70, 18, id(roboto), "H: %d", int(id(humidity).state));
it.printf(31, 45, id(inter), "RSSI: %d", int(id(rssi).state));

climate:
- platform: thermostat
name: "EcoStat Heating"
id: ecostat_control_heat
sensor: temp
heat_deadband: 2 °F
heat_overrun: 0
min_heating_run_time: 60s
min_heating_off_time: 120s
min_idle_time: 3min
visual:
min_temperature: 60 °F
max_temperature: 80 °F
temperature_step:
current_temperature: 0.1
target_temperature: 1.0
target_temperature_low: 65 °F
heat_action:
- switch.turn_on: relay_heat
idle_action:
- switch.turn_off: relay_heat
default_preset: Normal
preset:
- name: Normal
default_target_temperature_low: 65 °F


- platform: thermostat
name: "EcoStat Cooling"
id: ecostat_control_cooling
sensor: temp
cool_deadband: 2 °F
cool_overrun: 0
min_cooling_off_time: 20s
min_cooling_run_time: 60s
min_idle_time: 3min
visual:
min_temperature: 60 °F
max_temperature: 80 °F
temperature_step:
current_temperature: 0.1
target_temperature: 1.0
target_temperature_low: 70 °F
cool_action:
- switch.turn_on: relay_cooling
idle_action:
- switch.turn_off: relay_cooling
min_fan_mode_switching_time: 20s
fan_mode_on_action:
- switch.turn_on: relay_fan
fan_mode_off_action:
- switch.turn_off: relay_fan
default_preset: Normal
preset:
- name: Normal
default_target_temperature_high: 70 °F

sensor:
- platform: dht
pin: 20
model: DHT22
update_interval: 10s
temperature:
name: "EcoStat Temperature"
id: temp
humidity:
name: "EcoStat Humidity"
id: humidity
- platform: wifi_signal
name: "Wi-Fi Signal Strength"
id: rssi
update_interval: 20s

text_sensor:
- platform: wifi_info
ip_address:
name: "EcoStat IP Address"
id: ip_address
- platform: version
name: "EcoStat ESPHome Version"

switch:
- platform: gpio
id: relay_heat
pin:
number: 10
mode: OUTPUT
- platform: gpio
id: relay_cooling
pin:
number: 9
mode: OUTPUT
- platform: gpio
id: relay_fan
pin:
number: 21
mode: OUTPUT

binary_sensor:
- platform: gpio
id: tempup
pin:
number: 8
mode: INPUT_PULLUP
filters:
- delayed_on: 50ms
- delayed_off: 50ms
on_press:
then:
- lambda: |-
if (id(ecostat_control_heat).mode == esphome::climate::CLIMATE_MODE_HEAT) {
auto current_target_temp = id(ecostat_control_heat).target_temperature_low;
id(ecostat_control_heat).target_temperature_low = current_target_temp + 0.56;
auto current_target_temp_high = id(ecostat_control_heat).target_temperature_high;
id(ecostat_control_heat).target_temperature_high = current_target_temp_high + 0.56;
} else if (id(ecostat_control_cooling).mode == esphome::climate::CLIMATE_MODE_COOL) {
auto current_target_temp = id(ecostat_control_cooling).target_temperature_low;
id(ecostat_control_cooling).target_temperature_low = current_target_temp + 0.56;
auto current_target_temp_high = id(ecostat_control_cooling).target_temperature_high;
id(ecostat_control_cooling).target_temperature_high = current_target_temp_high + 0.56;
}

- platform: gpio
id: tempdown
pin:
number: 2
mode: INPUT_PULLUP
filters:
- delayed_on: 50ms
- delayed_off: 50ms
on_press:
then:
- lambda: |-
if (id(ecostat_control_heat).mode == esphome::climate::CLIMATE_MODE_HEAT) {
auto current_target_temp = id(ecostat_control_heat).target_temperature_low;
id(ecostat_control_heat).target_temperature_low = current_target_temp - 0.56;
auto current_target_temp_high = id(ecostat_control_heat).target_temperature_high;
id(ecostat_control_heat).target_temperature_high = current_target_temp_high - 0.56;
} else if (id(ecostat_control_cooling).mode == esphome::climate::CLIMATE_MODE_COOL) {
auto current_target_temp = id(ecostat_control_cooling).target_temperature_low;
id(ecostat_control_cooling).target_temperature_low = current_target_temp - 0.56;
auto current_target_temp_high = id(ecostat_control_cooling).target_temperature_high;
id(ecostat_control_cooling).target_temperature_high = current_target_temp_high - 0.56;
}

- platform: gpio
id: modeswitch
pin:
number: 3
mode: INPUT_PULLUP
filters:
- delayed_on: 50ms
- delayed_off: 50ms
on_press:
then:
- lambda: |-
auto current_mode = id(ecostat_control_heat).mode;
if (current_mode == esphome::climate::CLIMATE_MODE_OFF) {
id(ecostat_control_heat).mode = esphome::climate::CLIMATE_MODE_HEAT;
} else if (current_mode == esphome::climate::CLIMATE_MODE_HEAT) {
id(ecostat_control_heat).mode = esphome::climate::CLIMATE_MODE_COOL;
} else if (current_mode == esphome::climate::CLIMATE_MODE_COOL) {
id(ecostat_control_heat).mode = esphome::climate::CLIMATE_MODE_OFF;
}

- platform: gpio
id: momentaryswitch0
pin:
number: 4
mode: INPUT_PULLUP
filters:
- delayed_on: 50ms
- delayed_off: 50ms
on_press:
then:
- if:
condition:
switch.is_off: relay_fan
then:
- climate.control:
id: ecostat_control_cooling
fan_mode: "on"
else:
- climate.control:
id: ecostat_control_cooling
fan_mode: "off"

3. Ensambla la carcasa de tu elección (Opcional).

Aquí están los archivos STL para la carcasa que utilicé en este proyecto:

Siéntete libre de usarlos o modificarlos como desees. Si no tienes una impresora 3D, hay muchos servicios en línea que pueden imprimir estos archivos en el material que prefieras.

pir

4. Instalar los componentes

Paso 1: Instalar todos los componentes en la carcasa

Usando tornillos M2x4 y M2x6, fija todos los componentes mencionados previamente en sus respectivos lugares dentro de la carcasa.

(El sensor DHT22 entra a presión en su lugar).

pir

Paso 2: Conectar todos los sensores y periféricos a sus pines correspondientes según el YAML mencionado

Aquí está el método que utilicé durante el proceso de conexión:

  • DHT22/SSD1315 - usar conector JST: Desolda y voltea los conectores del DHT22 y SSD1315 al otro lado de sus PCB para que encajen correctamente.
  • Dos tipos de relé - usar conector JST/DuPont: Para los relés, utilicé conectores JST en un lado y conectores DuPont en el otro para conectarlos a los pines GPIO de la placa de expansión.

  • Conexión de la batería: También conecté una celda de litio de 3.7V al puerto de batería de la placa de expansión para usarla como batería de respaldo en caso de pérdida de energía de la fuente principal..

pir

Paso 3. Conectar los botones al frente interno de la carcasa

Logré esto colocando los botones con un poco de pegamento caliente. Luego, soldé los cables a los pines opuestos diagonalmente de los botones momentáneos, y coloqué conectores DuPont en el otro extremo de los cables para conectarlos a los pines GPIO correctos en la placa de expansión.

pir

Paso 4. Ensamblar la pantalla en la parte trasera de la cubierta frontal

Coloca la pantalla en la parte trasera de la cubierta frontal y fíjala con una pequeña cantidad de pegamento caliente. Luego, asegura la cubierta frontal a la carcasa utilizando 3 tornillos M4x6, como se muestra a continuación.

pir

5. Conectar los cables a los relés correspondientes en EcoStat

¡Termostato inteligente completo! Simplemente retira el termostato existente de tu hogar y usa la imagen a continuación para conectar los cables correctos a los relés correspondientes en EcoStat.

pir

✨ Proyecto de Contribuidor

  • Este proyecto es apoyado por el proyecto de contribuidor de Seeed Studio Contributor Project.
  • Gracias por tus esfuerzos Chris, tu trabajo será exhibido aquí.

Soporte Técnico y Discusión de Productos

¡Gracias por elegir nuestros productos! Estamos aquí para ofrecerte diferentes tipos de soporte y asegurarnos de que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a diferentes preferencias y necesidades.

Loading Comments...