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:
| M | MEMORIA.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: