Oi pessoal, boa tarde.
Em várias oportunidades tenho ajudado, amigos no LdG, que precisam que o a arduino faça mais que uma tarefa
simultaneamente. Por exemplo; ler um valor em um sensor e girar um servo motor.
Isto recebe o nome de multi processamento ou multitarefa (Multitasking).
Como o arduino só tem um núcleo, isto é impossível.
Mas existe um recurso que simula o multitasking no arduino. É a biblioteca " Threads ". É um multitasking virtual.
Esta biblioteca trabalha assim:
São definidos tempos para que cada tarefa seja executada:
Ex: define que a tarefa de ler o valor do sensor será de 20ms e a tarefa de girar o servo motor será de 30ms.
Estes valores são definidos no momento de configuração no setup e será mantido durante toda a execução.
Após configurar os parâmetros para serem usados com a biblioteca threads, teremos a seguinte situação:
Durante 20ms o programa executa a atividade de ler o sensor, aí ele para, e salva todas informações pertinentes ao que estava fazendo,
e começa a a tarefa de girar o servo motor durante 30 ms.
Durante 30ms, o programa executa a atividade de girar o servo, aí ele para, e salva todas informações pertinentes ao que estava fazendo,
restaura as informações referentes à leitura do sensor e durante 20ms continua fazendo a tarefa de ler um valor no sensor.
E assim fica fazendo: 20ms lendo sensor, 30ms girando servo.
Como a velocidade de troca de tarefa é muito rápida, as paradas de cada tarefa passam despercebidas, parecendo que o arduino
está fazendo as tarefas ao mesmo tempo.
Por "default" você pode selecionar até 15 tarefas "simultâneas" .
Eu montei dois codes para testar o uso da biblioteca " Threads ".
Um usa delay entre acender e pagar LED,
2 threads 1o. thread 10ms Acende LED A a e após 500milis() apaga LED A
2o. thread 10ms Acende LED B a e após 500milis() acende LED B
e o outro usa millis() para manter o LED aceso ou apagado.
2 threads 1o. thread 10ms Acende LED A a e após 500ms de delay apaga LED A
2o. thread 10ms Acende LED B a e após 500ms de delay acende LED B
O que eu esperava que ocorresse:
Ao iniciar o LED A deveria acender e após 10 ms o LED B acender.
Após 500ms o LED A deveria apagar e 10 ms após o LED B deveria apagar.
No code onde usei millis(), isto ocorreu como esperado.
No code onde usei o delay, isto não aconteceu, o LED B só acendeu depois de algum tempo que deu para perceber
E o LED A só acendeu depois que o LED B apagou. (500 ms).
Daí imaginei que a função delay afeta o multtasking.
Codes em anexo.
Rui