/* Esse código é um exemplo para uso de MultiThread
A primeira Thread ficará analisando uma chave e se ela estivar ativada o Led pisca, se não o Led ficará desligada
A segunda Thread será responsável por manter um Led piscando independente do que aconteça em outras partes do código, se tiver delay....
*/
//Definição de pinos
const int led1 = 22;
const int led2 = 17;
const int chave = 13;
// Em caso de valores que não mudarão, ultilizamos const int para melhorar desempenho.
/*
TaskHandle_t tarefa1;
TaskHandle_t tarefa2;
//são ponteiros, podem ser ultilizados para controlar as threads
//Nesse caso não são necessários,poderiam ser utilizados para ativar/desativar a thread
//ou deleta-la.... várias ultilidades
/* Exemplos de uso:
Suspende a tarefa
vTaskSuspend(tarefa1);
// volta a utilização da tarefa
vTaskResume(tarefa1);
// deleta a tarefa
vTaskDelete(tarefa1);
*/
void setup() {
//definição de pinos de entrada e saída
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(chave, INPUT);
//comando para criar função multitreading
//1° parâmetro nome que chamará a função
//2° parâmetro nome da task
//3° parâmetro memória alocada para função, escolhi 512 pois é um programa muito simples
//4° parâmetro dados que a função pode receber
//5° parâmetro prioridade da tarefa
//6° ponteiros para controlar função (play ou pause, ou deleta-la)
//7° parâmetro núcleo utilizado
xTaskCreatePinnedToCore(LeBotao, "LeituraSinal", 512, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(Pisca, "pisca", 512, NULL, 1, NULL, 0);
}
// Função da primeira Thread
void LeBotao(void*){
// ultilizamos um for infinito para funcionar a todo momento
for(;;){
//testamos a chave para O Led piscará a cada segundos se ela
// estiver ativada, se não estiver, ficará desligada
if(digitalRead(chave)==0){
digitalWrite(led2, LOW);
}
else{
digitalWrite(led2, HIGH);
delay(2000);
//ultilizamos o delay para travar o código,
//isso prova que ambos os nucleos estão funcionando em paralelo
//ou seja, ao mesmo tempo
digitalWrite(led2, LOW);
delay(2000);
}
}
}
// Função da 2° Thread
// Essa função apenas fica piscando um led infinitamente a cada 1 segundo
void Pisca(void*){
for(;;){
digitalWrite(led1, HIGH);
delay(1000);
digitalWrite(led1, LOW);
delay(1000);
}
}
void loop() {
}