tdse-tf_3-02

Controlador PID para derretidor de miel con control local via botones y remoto via WiFi
Index Commits Files Refs Submodules README
commit 1d522c58beeca8486219091416a913a9dbe2a186
parent 40f4f65bffa1d9f996bd8791551ffe250db01b16
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Mon,  8 Jun 2026 11:02:04 -0300

Corregir el estilo de algunos titulos para que sea consistente

Diffstat:
MMEMORIA.md | 134+++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 66 insertions(+), 68 deletions(-)
diff --git a/MEMORIA.md b/MEMORIA.md
@@ -44,36 +44,36 @@ pruebas realizadas.
   - [1.1. Alcance](#11-alcance)
   - [1.2. Trabajos similares y alternativas](#12-trabajos-similares-y-alternativas)
 - [2. Introducción específica](#2-introducción-específica)
-  - [2.1 Requisitos](#21-requisitos)
-  - [2.2 Casos de uso](#22-casos-de-uso)
-  - [2.3 Descripción de módulos principales](#23-descripción-de-módulos-principales)
-    - [2.3.1 Control principal](#231-control-principal)
-    - [2.3.2 Módulo remoto](#232-módulo-remoto)
-    - [2.3.3 Sensor de temperatura](#233-sensor-de-temperatura)
-    - [2.3.4 Control de temperatura](#234-control-de-temperatura)
-    - [2.3.5 Display y adaptador paralelo a serie I2C](#235-display-y-adaptador-paralelo-a-serie-i2c)
-    - [2.3.6 Cable y conector IDC](#234-cable-y-conector-idc)
-- [3: Diseño e implementación](#3-diseño-e-implementación)
-  - [3.1 Hardware del sistema](#31-hardware-del-sistema)
-    - [3.1.1 Placa NUCLEO](#311-placa-nucleo)
-    - [3.1.2 Sensor DS18B20](#312-sensor-ds18b20)
-    - [3.1.3 Módulo ESP-01S](#313-modulo-esp-01s)
-    - [3.1.4 Display LCD 16x2 I2C](#314-display-lcd-16x2-i2c)
-    - [3.1.5 Control de temperatura](#315-control-de-temperatura)
-    - [3.1.6 Luces indicadoras](#316-luces-indicadoras)
-    - [3.1.7 Buzzer](#317-buzzer)
-    - [3.1.8 Botones](#318-botones)
-  - [3.2 Firmware del sistema](#32-firmware-del-sistema)
-    - [3.2.1 Ejecutor cíclico](#321-ejecutor-cíclico)
-    - [3.2.2 Tarea central](#322-tarea-central)
-    - [3.2.3 Tarea para botones](#323-tarea-para-botones)
-    - [3.2.4 Tarea para el buzzer](#324-tarea-para-el-buzzer)
-    - [3.2.5 Tarea para luces indicadoras](#325-tarea-para-luces-indicadoras)
-    - [3.2.6 Tarea para el menu](#326-tarea-para-el-menu)
-    - [3.2.7 Tarea para control de temperatura](#327-tarea-para-control-de-temperatura)
-    - [3.2.8 Tarea para sensor de temperatura](#328-tarea-para-sensor-de-temperatura)
-    - [3.2.9 Tarea para módulo remoto](#329-tarea-para-modulo-remoto)
-    - [3.2.10 Medición de tiempo de ejecución](#3210-medicion-de-tiempo-de-ejecucion)
+  - [2.1. Requisitos](#21-requisitos)
+  - [2.2. Casos de uso](#22-casos-de-uso)
+  - [2.3. Descripción de módulos principales](#23-descripción-de-módulos-principales)
+    - [2.3.1. Control principal](#231-control-principal)
+    - [2.3.2. Módulo remoto](#232-módulo-remoto)
+    - [2.3.3. Sensor de temperatura](#233-sensor-de-temperatura)
+    - [2.3.4. Control de temperatura](#234-control-de-temperatura)
+    - [2.3.5. Display y adaptador paralelo a serie I2C](#235-display-y-adaptador-paralelo-a-serie-i2c)
+    - [2.3.6. Cable y conector IDC](#234-cable-y-conector-idc)
+- [3. Diseño e implementación](#3-diseño-e-implementación)
+  - [3.1. Hardware del sistema](#31-hardware-del-sistema)
+    - [3.1.1. Placa NUCLEO](#311-placa-nucleo)
+    - [3.1.2. Sensor DS18B20](#312-sensor-ds18b20)
+    - [3.1.3. Módulo ESP-01S](#313-modulo-esp-01s)
+    - [3.1.4. Display LCD 16x2 I2C](#314-display-lcd-16x2-i2c)
+    - [3.1.5. Control de temperatura](#315-control-de-temperatura)
+    - [3.1.6. Luces indicadoras](#316-luces-indicadoras)
+    - [3.1.7. Buzzer](#317-buzzer)
+    - [3.1.8. Botones](#318-botones)
+  - [3.2. Firmware del sistema](#32-firmware-del-sistema)
+    - [3.2.1. Ejecutor cíclico](#321-ejecutor-cíclico)
+    - [3.2.2. Tarea central](#322-tarea-central)
+    - [3.2.3. Tarea para botones](#323-tarea-para-botones)
+    - [3.2.4. Tarea para el buzzer](#324-tarea-para-el-buzzer)
+    - [3.2.5. Tarea para luces indicadoras](#325-tarea-para-luces-indicadoras)
+    - [3.2.6. Tarea para el menu](#326-tarea-para-el-menu)
+    - [3.2.7. Tarea para control de temperatura](#327-tarea-para-control-de-temperatura)
+    - [3.2.8. Tarea para sensor de temperatura](#328-tarea-para-sensor-de-temperatura)
+    - [3.2.9. Tarea para módulo remoto](#329-tarea-para-modulo-remoto)
+    - [3.2.10. Medición de tiempo de ejecución](#3210-medicion-de-tiempo-de-ejecucion)
 
 # 1. Introducción general
 
@@ -336,7 +336,7 @@ módulo central y luego todos los demás módulos se conectan a este.
     <p><em>Figura 3.1: Diagrama en bloques del sistema.</em></p>
 </div>
 
-## 3.1 Hardware del sistema
+## 3.1. Hardware del sistema
 
 El trabajo se divide en dos placas perforadas experimentales. Estas placas
 perforadas se utilizan para unir los módulos, evitando utilizar cables. Las
@@ -368,7 +368,7 @@ placa y al conector IDC.
     <p><em>Figura 3.4: Placa perforada principal.</em></p>
 </div>
 
-### 3.1.1 Placa NUCLEO
+### 3.1.1. Placa NUCLEO
 
 Como bien se mencionó, el trabajo se desarrolló utilizando la placa NUCLEO, esta
 placa utiliza el procesador STM32F103RBT6 configurado para operar a 64 MHz, ya
@@ -421,7 +421,7 @@ la Tabla 8 del manual de usuario de la placa.[^1]
 [^1]: STMicroelectronics, "UM1724 User manual - STM32 Nucleo-64 boards (MB1136)"
     Rev. 17, 2025. [En linea]. Disponible en: https://www.st.com/resource/en/user_manual/um1724-stm32-nucleo64-boards-mb1136-stmicroelectronics.pdf
 
-### 3.1.2 Sensor DS18B20
+### 3.1.2. Sensor DS18B20
 
 El sensor DS18B20 se conectó al USART1 de la placa NUCLEO en modo half-duplex,
 es decir, utilizando una sola linea del par TX/RX. De esta forma se puede
@@ -475,7 +475,7 @@ reduce aun más el tiempo de bloqueo del ejecutor cíclico y de uso de la CPU.
     Thermometer," Rev. 6, ago. 2019. [En linea]. Disponible en:
     https://www.analog.com/media/en/technical-documentation/data-sheets/ds18b20.pdf
 
-### 3.1.3 Módulo ESP-01S
+### 3.1.3. Módulo ESP-01S
 
 El módulo Wi-Fi ESP-01S se conecta con la placa NUCLEO a través del periférico
 USART3 a una tasa de transmisión de 115200 baud.
@@ -498,7 +498,7 @@ cumpla las siguientes funciones:
   constantemente para actualizar la información.
 - Sistema de archivos LittleFS.
 
-### 3.1.4 Display LCD 16x2 I2C
+### 3.1.4. Display LCD 16x2 I2C
 
 El display LCD se conecta al bus I2C1 a través del adaptador paralelo a serie
 mencionado previamente. Si bien es posible conectar el display directamente a la
@@ -507,7 +507,7 @@ por esto que se optó por el uso del adaptador I2C. Además al utilizar el
 periférico I2C se puede utilizar DMA, reduciendo el tiempo de bloqueo del
 ejecutor cíclico y for consiguiente el uso de la CPU.
 
-### 3.1.5 Control de temperatura
+### 3.1.5. Control de temperatura
 
 La etapa de control de temperatura consiste en un MOSFET IRFZ44N de canal N, el
 IRFZ44N, controlado por la señal PWM del TIM1_CH1 (PA8). Dado que el MOSFET es
@@ -539,7 +539,7 @@ El calefactor del derretidor de miel se modeló como una carga resistiva pura,
 por lo que se utilizó un resistor de alta potencia de 12 V y 48 W para las
 pruebas de laboratorio.
 
-### 3.1.6 Luces indicadoras
+### 3.1.6. Luces indicadoras
 
 Para la luz indicadora, se utilizó un diodo emisor de luz (Light Emitting Diode,
 LED) de 5 mm de color verde. Este tipo de LEDs requieren de aproximadamente 20
@@ -564,7 +564,7 @@ $$RC=\frac{12\text{ V} - 2.2\text{ V}}{45\text{ mA}} \approx 220\ \Omega$$
 
 <!-- El LED 2 LEDs (PA5, PB10) con modos ON, OFF, BLINK (500 ms) y PULSE (250 ms). -->
 
-### 3.1.7 Buzzer
+### 3.1.7. Buzzer
 
 Para el buzzer o parlante se utilizó un zumbador piezoeléctrico pasivo de 12 V.
 El termino pasivo implica que se debe suministrar una señal PWM para que este
@@ -574,7 +574,7 @@ MOSFET.
 
 <!-- (TIM3_CH1, 1 kHz) con eventos de beep corto (35 ms) y largo (500 ms). -->
 
-### 3.1.8 Botones
+### 3.1.8. Botones
 
 Para los botones, se utilizaron 3 tact switch en la placa perforada principal
 con los resistores de pull-up internos de la placa NUCLEO.
@@ -584,7 +584,7 @@ con los resistores de pull-up internos de la placa NUCLEO.
 de estados en firmware (50 ms de filtro).
 -->
 
-## 3.2 Firmware del sistema
+## 3.2. Firmware del sistema
 
 El firmware de la placa NUCLEO se compone de una aplicación que implementa un
 ejecutor cíclico con 8 tareas asociadas. Estas tareas se organizan de acuerdo al
@@ -604,7 +604,7 @@ eventos o mediante la estructura global compartida `shared_data`.
 Esta aplicacion tiene como principal caracteristica ser no bloqueante.
 -->
 
-### 3.2.1 Ejecutor cíclico
+### 3.2.1. Ejecutor cíclico
 
 El ejecutor cíclico se implementa en el archivo `app.c`. Este ejecutor ciclico
 posee un tick de 1 ms generado por el timer SysTick propio del microcontrolador.
@@ -646,7 +646,7 @@ puede observar en la figura 3.9, en la cual las flechas con lineas punteadas
 indican el mecanismo de acceso a la variable compartida y las flechas con lineas
 continuas indican el mecanismo de eventos.
 
-### 3.2.2 Tarea central
+### 3.2.2. Tarea central
 
 La tarea central, `task_system`, gestiona la lógica del sistema y la máquina de
 estados principal. A continuación en la figura 3.10 se muestra un diagrama de
@@ -678,12 +678,12 @@ Además en esta tarea se gestiona:
   dirección `0x0801FC00` como emulación EEPROM. Los valores se escriben en
   direcciones contiguas para reducir el desgaste, borrando la página solo cuando
   está llena (512 escrituras).
-- Temporizador programable: Cada segundo compara la hora actual del RTC con los
-  límites configurados. Si `end_hour > start_hour` (mismo día) o `end_hour <
-  start_hour` (cruce de medianoche), activa o desactiva el calefactor
-  automáticamente.
+- Temporizador programable: Si el timer está activo, en cada segundo se compara
+  la hora actual del RTC con los límites configurados. Si `end_hour > start_hour`
+  (mismo día) o `end_hour < start_hour` (cruce de medianoche) se activa o
+  desactiva el calefactor automáticamente.
 
-### 3.2.3 Tarea para botones
+### 3.2.3. Tarea para botones
 
 En la tarea `task_buttons` se implementa una máquina de estados de anti-rebote
 para cada uno de los botones. En la figura 3.11 a continuación se muestra un
@@ -701,7 +701,7 @@ presionar el botón se active el buzzer, sin interactuar con la tarea central
 `task_system`. Esto se observa también en el diagrama de bloques del firmware de
 la figura 3.9.
 
-### 3.2.4 Tarea para el buzzer
+### 3.2.4. Tarea para el buzzer
 
 En la tarea `task_buzzer` se controla el buzzer generando una señal PWM de 1
 kHz. Esta tarea recibe eventos para generar beeps cortos (de 35 ms para
@@ -717,8 +717,7 @@ observa en la figura 3.12 a continuación.
     <p><em>Figura 3.12: Diagrama de estados de buzzer.</em></p>
 </div>
 
-
-### 3.2.5 Tarea para luces indicadoras
+### 3.2.5. Tarea para luces indicadoras
 
 En la tarea `task_leds` se controlan las luces indicadoras o LEDs (LD2, LD3)
 permitiendo los modos: encendido, apagado, intermitente y un único pulso. Para
@@ -739,21 +738,20 @@ El modo intermitente se utiliza para cuando el calefactor está activo, indicand
 visualmente el estado de operación. Cuando el calefactor esta inactivo las luces
 permaneces apagadas.
 
-### 3.2.6 Tarea para el menu
+### 3.2.6. Tarea para el menú
 
-Esta tarea `task_menu`, gestiona la actualización del display LCD 16x2 según el
+La tarea `task_menu`, gestiona la actualización del display LCD 16x2 según el
 estado actual del sistema. Se implementa también una maquina de estados similar
 a la implementada para el sistema, con estados similares, de manera tal que cada
-estado del sistema define su propio contenido de display. En la figura 3.14 se
-muestran diferentes contenidos del display para diferentes estados del sistema.
-
-Por ejemplo en estado reposo (estado del sistema `ST_SYS_IDLE`), con el
-calefactor inactivo y un timer programado, como se muestra en la figura 3.12(b)
-en el display se muestra:
+estado del sistema tiene su correspondiente estado del menú y cada estado del
+menú define su contenido del display. En la figura 3.14 se muestran diferentes
+contenidos del display para diferentes estados.
 
-- Línea 1: Estado del calefactor ("Idle").
-- Línea 2: Estado del timer ("[P]" si activo, "   ", si no), temperatura actual,
-  temperatura deseada dentro de paréntesis y unidad de la temperatura.
+Por ejemplo en estado reposo (estado del sistema `ST_SYS_IDLE`) con el
+calefactor inactivo y un timer programado, como se muestra en la figura 3.14(b),
+en la primer linea se muestra el estado del calefactor ("Idle"), y en la segunda
+linea el estado del timer ("[P]" si activo, "   ", si no), la temperatura
+actual, la temperatura deseada (entre paréntesis) y la unidad de la temperatura.
 
 <div align="center">
 
@@ -815,12 +813,12 @@ en el display se muestra:
 La comunicación con el LCD es asíncrona: las operaciones se encolan y se
 procesan en cada tick de la tarea mediante `display_i2c_async_tick()`.
 
-### 3.2.7 Tarea para control de temperatura
+### 3.2.7. Tarea para control de temperatura
 
 En la tarea `task_temp_ctrl` se implementa un controlador proporcional, integral
-y derivativo (PID) discreto para regular la temperatura. Se toma como señal de
-referencia el punto de temperatura deseada y la señal de error la temperatura
-actual leída por el sensor.
+y derivativo (PID) para regular la temperatura. Se toma como señal de referencia
+el punto de temperatura deseada, y como señal de error la diferencia entre la
+señal de referencia y la temperatura actual leída por el sensor.
 
 En particular, la sección de código que implementa el controlador PID se muestra
 a continuación.
@@ -846,7 +844,7 @@ trabajo del PWM que controla el calefactor a través de la variable compartida
 por las tareas `shared_data`. Si el calefactor está deshabilitado, se fuerza el
 ciclo de trabajo a 0%.
 
-### 3.2.8 Tarea para sensor de temperatura
+### 3.2.8. Tarea para sensor de temperatura
 
 La tarea `task_temp_sensor` gestiona la lectura asíncrona del sensor DS18B20.
 Cada 1 segundo inicia una secuencia de comandos:
@@ -862,7 +860,7 @@ Cada 1 segundo inicia una secuencia de comandos:
 Todas las operaciones se encolan y ejecutan mediante DMA, con callbacks que
 indican la finalización de transmisión/recepción.
 
-### 3.2.9 Tarea para módulo remoto
+### 3.2.9. Tarea para módulo remoto
 
 En la tarea `task_remote` se administra la comunicación con el módulo ESP-01S a
 través de USART3. Se implementa un protocolo propio basado en comandos de un
@@ -894,7 +892,7 @@ implementa un buffer circular similar al de recepción. En este buffer circular
 se encolan los bytes que se desean enviar y mientras la cola no esté vacía, y
 siempre que DMA haya terminado, se enviando los bytes.
 
-### 3.2.10 Medición de tiempo de ejecución
+### 3.2.10. Medición de tiempo de ejecución
 
 En el ejecutor cíclico se mide el tiempo de ejecución de cada tarea y del ciclo
 completo mediante el contador de ciclos del DWT. Por cada tarea se mide: