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 e837999a0d7f554cc16fa213a426fc8a3ea3bbcd
parent c76f1725b324afe97521f01477c5289f91bcb164
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Mon, 30 Mar 2026 21:24:35 -0300

Ciclo de trabajo proporcional al valor leído de temperatura

Diffstat:
Mfirmware/app/inc/app.h | 2+-
Mfirmware/app/src/task_menu.c | 16+++++++++++++---
Mfirmware/app/src/task_system.c | 5++++-
Mfirmware/app/src/task_temp_ctrl.c | 20++++++++++++++++++--
4 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/firmware/app/inc/app.h b/firmware/app/inc/app.h
@@ -19,7 +19,7 @@ extern uint32_t g_app_WCET_us;
 extern volatile uint32_t g_app_tick_cnt;
 
 typedef struct {
-    uint16_t temp_set_point;   // Desired temp
+    int16_t temp_set_point;   // Desired temp
     int16_t temp_sensor;       // Actual temp
     uint8_t temp_ctrl_pwm_dc;  // Duty cycle of output [0, 100]
     bool temp_ctrl_enabled;
diff --git a/firmware/app/src/task_menu.c b/firmware/app/src/task_menu.c
@@ -194,9 +194,19 @@ void task_menu_statechart(void *parameters)
                 g_display_update = false;
                 display_i2c_async_clear();
                 memset(menu_row_str, '\0', sizeof(menu_row_str));
-                snprintf(menu_row_str, 20, "Idle         %3s",
-                        p_shared_data->temp_ctrl_enabled ? "ON" : "");
-                display_i2c_async_write_string(menu_row_str);
+
+                if (p_shared_data->temp_ctrl_enabled)
+                {
+                    display_i2c_async_write_string("On");
+                    display_i2c_async_set_cursor_pos(10, 0);
+                    snprintf(menu_row_str, 20, "%5d%%", p_shared_data->temp_ctrl_pwm_dc);
+                    display_i2c_async_write_string(menu_row_str);
+                }
+                else
+                {
+                    snprintf(menu_row_str, 20, "Idle"); 
+                    display_i2c_async_write_string(menu_row_str);
+                }
 
                 display_i2c_async_set_cursor_pos(4, 1);
                 memset(menu_row_str, '\0', sizeof(menu_row_str));
diff --git a/firmware/app/src/task_system.c b/firmware/app/src/task_system.c
@@ -242,18 +242,21 @@ void task_system_statechart(void *parameters)
                 p_task_system_dta->event_flag = false;
                 switch (p_task_system_dta->event)
                 {
+                    case EV_SYS_BTN_B_ACTIVE:
+                    break;
+
                     case EV_SYS_BTN_C_ACTIVE:
                         p_shared_data->temp_ctrl_enabled = !p_shared_data->temp_ctrl_enabled;
                         task_menu_interface_put_event(EV_MEN_DISPLAY_UPDATE);
                     break;
                     case EV_SYS_BTN_A_ACTIVE:
-                    case EV_SYS_BTN_B_ACTIVE:
                     case EV_SYS_BTN_D_ACTIVE:
                         p_task_system_dta->state = ST_SYS_CLOCK_SET;
                         task_menu_interface_put_event(EV_MEN_ST_CLOCK_SET);
                         task_leds_interface_put_event(EV_LED_XX_BLINK, ID_LED_A);
                         task_leds_interface_put_event(EV_LED_XX_BLINK, ID_LED_B);
                     break;
+
                     default: break;
                 }
             }
diff --git a/firmware/app/src/task_temp_ctrl.c b/firmware/app/src/task_temp_ctrl.c
@@ -61,9 +61,25 @@ void task_temp_ctrl_update(void *parameters)
         }
         __asm("CPSIE i");
 
-        if (p_shared_data->temp_ctrl_pwm_dc != TIM1->CCR1)
+        int16_t dtemp = (p_shared_data->temp_set_point - p_shared_data->temp_sensor);
+        if (dtemp > 0)
         {
-            TIM1->CCR1 = p_shared_data->temp_ctrl_pwm_dc;
+            p_shared_data->temp_ctrl_pwm_dc = dtemp;
+        }
+        else {
+            p_shared_data->temp_ctrl_pwm_dc = 0;
+        }
+
+        if (true == p_shared_data->temp_ctrl_enabled)
+        {
+            if (p_shared_data->temp_ctrl_pwm_dc != TIM1->CCR1)
+            {
+                TIM1->CCR1 = p_shared_data->temp_ctrl_pwm_dc;
+            }
+        }
+        else
+        {
+            TIM1->CCR1 = 0;
         }
     }
 }