0% acharam este documento útil (0 voto)
4 visualizações3 páginas

Simulação de Threads no Arduino

O documento explica o conceito de threads e sua aplicação no Arduino, que não possui suporte nativo a multithreading. Ele apresenta um código que simula a execução paralela de duas tarefas, piscando LEDs em intervalos diferentes, utilizando controle de tempo com a função millis(). O funcionamento é ativado por um botão que alterna o estado de ativação dos LEDs.

Enviado por

Andre Rodrigues
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações3 páginas

Simulação de Threads no Arduino

O documento explica o conceito de threads e sua aplicação no Arduino, que não possui suporte nativo a multithreading. Ele apresenta um código que simula a execução paralela de duas tarefas, piscando LEDs em intervalos diferentes, utilizando controle de tempo com a função millis(). O funcionamento é ativado por um botão que alterna o estado de ativação dos LEDs.

Enviado por

Andre Rodrigues
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Uso de Threads - Arduino

O que são Threads?

Threads são unidades menores de execução dentro de um processo. Elas permitem que
diferentes partes de um programa sejam executadas concorretemente (em paralelo ou
intercaladas) no mesmo programa. Em sistemas com suporte a multitarefa real, como
computadores ou sistemas operacionais complexos, o uso de multithreading permite:

Executar tarefas simultâneas (como leitura de sensores e atualização de tela), melhor


aproveitamento de processadores com múltiplos núcleos, melhor responsividade.

O Arduino UNO não possui suporte nativo a threads, pois roda um único programa linear e
sequencial, dentro de um loop infinito. Para simular múltiplas tarefas "simultâneas", usamos
controle de tempo com millis() ou interrupções, permitindo alternar entre tarefas sem
bloquear o fluxo principal com funções como delay().

Realizamos a modelagem de um sistema que utiliza o conceito de threads em arduino


int LED_VERMELHO = 13;​
int LED_AMARELO = 12;​
int BUTTON = 2;​

int led_velho_timer = 500;​
int last_exec_vermelho = 0;​

int led_amarelo_timer = 300;​
int last_exec_amarelo = 0;​

bool ativa_led = false;​

void setup()​
{​
pinMode(LED_VERMELHO, OUTPUT);​
pinMode(LED_AMARELO, OUTPUT);​

pinMode(BUTTON, INPUT); ​
}​

void piscaLedVermelho() {​
digitalWrite(LED_VERMELHO, !digitalRead(LED_VERMELHO));​
}​

void piscaLedAmarelo() {​
digitalWrite(LED_AMARELO, !digitalRead(LED_AMARELO));​
}​

void loop()​
{​

if (digitalRead(BUTTON) == HIGH){​
ativa_led = !ativa_led;​
}​

if (ativa_led && ((millis() - last_exec_vermelho) >= 500)){​
piscaLedVermelho();​
last_exec_vermelho = millis();​
}​

if (ativa_led && ((millis() - last_exec_amarelo) >=
led_amarelo_timer)){​
piscaLedAmarelo();​
last_exec_amarelo = millis();​
}​
}
Explicação do código: ​
O código simula uma execução paralela de duas tarefas: piscar dois LEDs em tempos
diferentes, ativados por um botão. Isso é feito sem delay(), usando controle de tempo
com millis() — uma abordagem semelhante à multitarefa cooperativa.

void piscaLedVermelho() {​
digitalWrite(LED_VERMELHO, !digitalRead(LED_VERMELHO));​
}​
void piscaLedAmarelo() {​
digitalWrite(LED_AMARELO, !digitalRead(LED_AMARELO));​
}

Cada função inverte o estado atual do LED correspondente. Ou seja, se estiver ligado,
apaga; se estiver apagado, liga.

No loop()

if (digitalRead(BUTTON) == HIGH){​
ativa_led = !ativa_led;​
}

Quando o botão é pressionado, inverte o estado da variável ativa_led, ativando ou


desativando o funcionamento dos LEDs.

if (ativa_led && ((millis() - last_exec_vermelho) >= 500)){​


piscaLedVermelho();​
last_exec_vermelho = millis();​
}

Se o LED estiver ativado e já se passaram 500 ms desde a última vez que o LED vermelho
piscou, ele pisca de novo e atualiza o tempo.

if (ativa_led && ((millis() - last_exec_amarelo) >= led_amarelo_timer)){​


piscaLedAmarelo();​
last_exec_amarelo = millis();​
}

Mesma lógica para o LED amarelo, com intervalo de 300 ms.

Você também pode gostar