commit 17d0deec04dc4baa72d504324fd46b6e5b344c03
parent 6b003fa8228a725924e501e6d147a2be665d136b
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date: Sun, 7 Jun 2026 14:47:33 -0300
Agregar descripción de las tareas restantes
Diffstat:
| M | MEMORIA.md | | | 116 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- |
1 file changed, 107 insertions(+), 9 deletions(-)
diff --git a/MEMORIA.md b/MEMORIA.md
@@ -739,17 +739,21 @@ 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 Menu
+### 3.2.6 Tarea para el menu
-Esta tarea gestiona la actualización del display LCD 16x2 según el estado actual
-del sistema. Cada estado define su propio contenido de display. En modo idle se
-muestra:
+Esta 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.12 se
+muestran diferentes contenidos del display para diferentes estados del sistema.
-- Línea 1: Estado del calefactor ("On" + duty cycle % o "Idle").
-- Línea 2: Estado del timer ("[P]" si activo), temperatura actual y set point.
+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:
-La comunicación con el LCD es asíncrona: las operaciones se encolan y se
-procesan en el tick de la tarea mediante `display_i2c_async_tick()`.
+- 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.
<div align="center">
@@ -805,7 +809,101 @@ procesan en el tick de la tarea mediante `display_i2c_async_tick()`.
</table>
-<em>Figura 3.5: Interfaces mostradas en el display LCD 16x2.</em>
+<em>Figura 3.12: Interfaces mostradas en el display LCD 16x2.</em>
</div>
+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
+
+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.
+
+En particular, la sección de código que implementa el controlador PID se muestra
+a continuación.
+
+```c
+p_pid->error = temp_set_point - temp_sensor;
+p_pid->pid_p = error * Kp;
+p_pid->pid_i = (pid_i + (error * dt)) * Ki;
+p_pid->pid_d = ((error - prev_error) / dt) * Kd;
+output = clampf(pid_p + pid_i + pid_d, 0.0f, 100.0f);
+```
+
+Siendo las constantes proporcionales, integrales y derivativas, `Kp`, `Ki` y
+`Kd`, respectivamente, las que se muestran a continuación.
+
+- Kp = 40,0
+- Ki = 0,75
+- Kd = 0,01
+- dt = 250 ms
+
+La salida del controladora (0% a 100%) se asigna directamente al ciclo de
+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
+
+La tarea `task_temp_sensor` gestiona la lectura asíncrona del sensor DS18B20.
+Cada 1 segundo inicia una secuencia de comandos:
+
+1. Reset (cambio a 9600 baud + pulso de presencia).
+2. `SKIP_ROM` + `CONVERT_T` (inicia conversión).
+3. Espera 100 ms (tiempo de conversión aproximado para resolución de 9 bits).
+4. Reset + `SKIP_ROM` + `READ_SCRATCHPAD`.
+5. Lectura de bytes LSB y MSB.
+6. Conversion de los bytes leídos a temperatura real y almacenamiento en
+ estructura compartida `shared_data`.
+
+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
+
+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
+byte (caracteres 'A' a 'F') con parámetros adicionales según el comando.
+
+Comandos recibidos desde el ESP-01S:
+
+| Comando | Función | Respuesta |
+| :------ | :----------------------------------------- | :-------------------------------------------------------------------------------------- |
+| 'A' | Solicitar estado completo | 'A' + main_output + system_time + timer_status + timer_params(4B) + temp_now + temp_set |
+| 'B' | Toggle calefactor | 'B' |
+| 'C' | Toggle timer | 'C' |
+| 'D' | Set timer (start_h, start_m, end_h, end_m) | 'D' |
+| 'E' | Solicitar temperatura | 'E' + temp_now + temp_set |
+| 'F' | Set temperatura deseada | 'F' + temp_set_point |
+
+Comandos enviados al ESP-01S periódicamente cada 1 segundo:
+
+| Comando | Función | Datos |
+| :------ | :--------------------- | :------------------------ |
+| 'E' | Actualizar temperatura | 'E' + temp_now + temp_set |
+
+La recepción se realiza por interrupción (`HAL_UART_RxCpltCallback`) con
+encolado en un buffer circular. Cada vez que se recibe un byte se encola
+automáticamente, para luego ser procesado.
+
+La transmisión utiliza DMA para no bloquear el ejecutor cíclico, para esto se
+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
+
+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:
+
+- `WCET`: Peor tiempo de ejecución histórico (desde boot).
+- `WCET_interval`: Peor tiempo en un intervalo (últimos 10 segundos).
+- `runtime_us`: Tiempo total del ciclo actual.
+- `runtime_us_mean`: Promedio sobre 1000 muestras (1 segundo).
+Los resultados se pueden consultar mediante la consola de semi-hosting, lo que
+permite caracterizar temporalmente el sistema sin afectar los tiempos de
+ejecución.