Dos tips utiles por si a alguien le hacen falta:
-
Guardar el archivo en vcode cada vez que hacemos cambios o antes de compilar.
-
Para salir del modo monitor presionar ctrl +]
Introducción
Introducción a los microcontroladores
La importancia de la industria IoT
Tipos de computadoras
Cómo escoger un microcontrolador
Hardware
Características del ESP32
ESP-IDF
Documentación oficial del ESP-IDF
Instalación del ESP-IDF en Windows
Instalación del ESP-IDF en Mac
Instalación del ESP-IDF en Linux
Lista de materiales
Proyectos con ESP-IDF
Primer proyecto
API Core
Hola mundo con ESP-IDF
Sistemas Operativos en Tiempo Real
FreeRTOS con ESP32
Ciclo de vida de las tareas con FreeRTOS
Almacenamiento con ESP32
Peripherals API
Salida Digital con ESP32
Entrada Digital con ESP32
Entrada Analógica con ESP32
Modulación de Ancho de Pulsos
Control PWM con ESP32 y LEDC
Servidor Web
Redes y protocolos de Internet
Redes WiFi
Loop de eventos
Conexión WiFi con ESP32
Servidor HTTP básico con ESP32
Smart Light
Dimmer LED via HTTP con ESP32
Aplicación Web con ESP32
Despedida
Tu primer proyecto de IoT con ESP32
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Diana Martínez
Aportes 11
Preguntas 1
Dos tips utiles por si a alguien le hacen falta:
Guardar el archivo en vcode cada vez que hacemos cambios o antes de compilar.
Para salir del modo monitor presionar ctrl +]
Les comparto mi código, hice una modificación para que se ejecute la tarea solo durante un minuto
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
TaskHandle_t taskHandle1 = NULL;
void task1(void *args) {
int count = 0;
time_t start, current;
double elapsed ; // Tiempo transcurrido en segundos
int duration = 60; // Duración total de la tarea en segundos
// Obtiene el tiempo de inicio
time(&start);
while(1) {
time(¤t);
// Calcula el tiempo transcurrido
elapsed = difftime(current, start);
count++;
if (elapsed >= duration) {
printf("End task1... bye\n");
vTaskDelete(NULL);
}
// Muestra el tiempo restante cada 10 segundos
if ((int)elapsed % 10 == 0) {
printf("Tiempo restante: %d segundos\n", duration - (int)elapsed);
printf("Ejecuciones: %d veces\n", count);
}
}
}
void app_main(void)
{
xTaskCreate(task1, "Task1", 4096, NULL, 10, &taskHandle1);
}
Este código en lenguaje C utiliza las librerías FreeRTOS para crear una tarea llamada “task1” que se ejecutará en un microcontrolador o microprocesador que tenga soporte para FreeRTOS.
La función “task1” es una tarea que incrementa una variable “count” en cada iteración de un bucle while infinito, e imprime el valor de esa variable en la consola utilizando la función “printf” de la librería estándar de C. Después, verifica si la variable “count” ha superado un valor de 5 y en ese caso, elimina la tarea actual utilizando la función “vTaskDelete”.
La función “app_main” es la función principal del programa y es donde se crea la tarea “task1” utilizando la función “xTaskCreate”. Esta función toma como argumentos el nombre de la tarea, el tamaño de la pila de la tarea (en este caso 4096 bytes), el argumento que se pasará a la tarea (en este caso NULL), la prioridad de la tarea (en este caso 10), y un puntero a una variable “TaskHandle_t” que se utilizará para hacer referencia a la tarea creada.
En resumen, este código crea una tarea “task1” que se ejecutará indefinidamente, incrementando una variable “count” y mostrando su valor en la consola hasta que esa variable supera un valor de 5. La tarea se elimina en ese momento y el programa termina.
Tengo la v5.0.2 del ESP IDF y cuándo escribía idf.py build
mostraba que tenía un error en el archivo CMakeLists.txt
. Esto era porque escribía el comando dentro de la carpeta main
, Procuren ejectutar sus comandos de compilación dentro de la carpeta del proyecto ya que ambas carpetas tienen archivos de configuración CMake, uno para el proyecto y otro para el código.
Comarto mi codigo:
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
TaskHandle_t taskHandle1 = NULL;
void task1(void *args) {
int count = 0;
while(1){
count++;
printf("Task 1, count %d \n", count);
if (count > 5){
vTaskDelete(NULL);
}
}
}
void app_main(void)
{
xTaskCreate(task1, "Task1", 4096, NULL, 10, &taskHandle1);
}
Agregue un vTaskDelay de 500 milisegundos
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "time.h"
TaskHandle_t taskHandle_1;
const TickType_t taskDelay = 500 / portTICK_PERIOD_MS;
time_t elapsed_time;
int counter = 0;
void task_1(void *args)
{
while (true)
{
time(&elapsed_time);
printf("Task 1 counter: %d seconds: %lld\n", counter, elapsed_time);
counter++;
vTaskDelay(taskDelay);
if (counter > 50)
{
printf("Finalizando la tarea");
vTaskDelete(taskHandle_1);
}
}
}
void app_main(void)
{
xTaskCreate(
task_1, //Nombre de la funcion que implementa la tarea
"Tarea_1", //Nombre descriptivo de la tarea con fines de debugging
4096, //El tamaño del task stack en bytes
NULL, //pointer a un parametro cuando la tarea esta siendo creada
10, //Prioridad de la tarea un numero
&taskHandle_1 //apuntador para referenciar la tarea.
);
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?