#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "freertos/timers.h"
#define pin_clock 25
#define pin_date 26
TimerHandle_t clockTimer; // Timer para o sinal de clock
TimerHandle_t dataTimer; // Timer para enviar dados sincronizados com o clock
int intervalClock = 1000; // Intervalo para o clock, em ms
int intervalData = 500; // Intervalo para o segundo timer, em ms
bool state_pin_clock = true;
bool state_pin_date = true;
void vClockCallback(TimerHandle_t xTimer); // Callback do timer do clock
void vDataCallback(TimerHandle_t xTimer); // Callback do segundo timer
void configPin();
void set_timers();
void app_main() {
configPin();
set_timers();
while (1) {
vTaskDelay(100 / portTICK_PERIOD_MS); // Reduz o uso da CPU
}
}
// Função que configura os pinos
void configPin() {
gpio_set_direction(pin_clock, GPIO_MODE_OUTPUT);
gpio_set_direction(pin_date, GPIO_MODE_OUTPUT);
}
// Callback do timer de clock
void vClockCallback(TimerHandle_t xTimer) {
state_pin_clock = !state_pin_clock;
gpio_set_level(pin_clock, state_pin_clock);
// Sincroniza o segundo timer com o evento do clock
if (xTimerStart(dataTimer, 0) != pdPASS) {
printf("O segundo timer não pôde ser iniciado.\n");
}
}
// Callback do segundo timer
void vDataCallback(TimerHandle_t xTimer) {
// Lógica para o segundo evento sincronizado com o clock
state_pin_date = !state_pin_date;
gpio_set_level(pin_date, state_pin_date); // Inverte o estado do pino para simular um dado
}
// Função que configura os timers
void set_timers() {
printf("Configuração dos timers iniciada\n");
// Cria o primeiro timer de clock
clockTimer = xTimerCreate(
"Clock Timer",
pdMS_TO_TICKS(intervalClock),
pdTRUE,
NULL,
vClockCallback
);
// Cria o segundo timer para dados
dataTimer = xTimerCreate(
"Data Timer",
pdMS_TO_TICKS(intervalData),
pdFALSE, // Executa apenas uma vez ao ser iniciado pelo primeiro timer
NULL,
vDataCallback
);
if (clockTimer == NULL || dataTimer == NULL) {
printf("Um dos timers não foi criado.\n");
} else {
if (xTimerStart(clockTimer, 0) != pdPASS) {
printf("O timer de clock não pôde ser iniciado.\n");
}
}
}