Para projetos mais avançados, você precisa alterar os valores e ler os dados em tempo real, o que não é possível com a função de atraso padrão no Arduino. Portanto, uma solução diferente é necessária. Felizmente, HeliOS pode ajudar.
As limitações do Arduino
Conforme mencionado na introdução, a linguagem padrão de um Arduino pode ser aplicada de várias maneiras. No entanto, há um problema: o Arduino não pode realizar multitarefa. Por exemplo, você não pode definir três LEDs diferentes para piscar em intervalos independentes. Esta tarefa não pode ser realizada porque, se você usar o retardo, o LED com o maior retardo bloqueará o piscar dos outros LEDs enquanto espera para alternar os estados.
A votação padrão também é problemática, pois verificar o estado de um botão requer que uma ação seja executada. Em um Arduino padrão, você deve configurar uma função para pesquisar o estado de um switch ou qualquer outro estado.
Embora existam soluções para resolver esses problemas (e.g., interrupções de hardware, a função millis, a implementação do FreeRTOS), mas essas soluções também têm limitações. Para superar os problemas dessas soluções, Mannie Peterson inventou HeliOS. HeliOS é pequeno e eficiente, e pode até ser executado em controladores de 8 bits.
Considere o código abaixo, que não é confiável na melhor das hipóteses porque a instrução de atraso impedirá que o botão seja verificado.
botãoPin int = 2; // o número do pino do botãoint ledPin = 4; // o número do pino LED
// as variáveis mudarão:
int buttonState = 0; // variável para ler o status do botão de pressão
void setup ()
// inicializa o pino do LED como uma saída:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// inicializa o pino do botão de pressão como uma entrada:
pinMode (buttonPin, INPUT);
void loop ()
// leia o estado do valor do botão:
buttonState = digitalRead (buttonPin);
// verifique se o botão está pressionado. Se for, o buttonState é HIGH:
if (buttonState == HIGH)
digitalWrite (ledPin, HIGH); // liga o LED
senão
digitalWrite (ledPin, LOW); // desliga o LED
digitalWrite (LED_BUILTIN, HIGH); // liga o LED (HIGH é o nível de tensão)
atraso (1000); // espere um segundo
digitalWrite (LED_BUILTIN, LOW); // desligue o LED tornando a tensão BAIXA
atraso (1000); // espere um segundo
Ao executar este código, você verá que o 'ledPin' piscará normalmente. No entanto, quando você pressiona o botão, ele não acende ou, se acender, atrasa a sequência de piscadas. Para fazer este programa funcionar, você pode alternar para outros métodos de atraso; no entanto, HeliOS oferece uma alternativa.
Linux incorporado no Arduino (HeliOS)
Apesar do “SO” em seu nome, HeliOS não é um sistema operacional: é uma biblioteca de funções multitarefa. No entanto, ele implementa 21 chamadas de função que podem simplificar tarefas de controle complexas. Para tarefas em tempo real, o sistema deve lidar com as informações externas à medida que são recebidas. Para fazer isso, o sistema deve ser capaz de multitarefa.
Várias estratégias podem ser usadas para lidar com tarefas em tempo real: estratégias orientadas a eventos, estratégias balanceadas em tempo de execução e estratégias de notificação de tarefas. Com HeliOS, você pode empregar qualquer uma dessas estratégias com chamadas de função.
Como o FreeRTOS, o HeliOS aprimora os recursos de multitarefa dos controladores. No entanto, os desenvolvedores que estão planejando um projeto complexo de importância crítica precisam usar o FreeRTOS ou algo semelhante, porque o HeliOS se destina ao uso por entusiastas e hobistas que desejam explorar o poder da multitarefa.
Instalando HeliOS
Ao usar as bibliotecas do Arduino, novas bibliotecas podem ser instaladas com o IDE. Para as versões 1.3.5 e acima, você escolhe usar o Gerenciador de Biblioteca.
Como alternativa, você pode baixar um arquivo zip da página da web e usar esse arquivo para instalar o HeliOS.
Observe que você precisa incluir HeliOS em seu código antes de começar a usá-lo.
Exemplo
O código abaixo pode ser usado para fazer um LED piscar uma vez por segundo. Embora tenhamos adicionado o código HeliOS, o efeito final é o mesmo do tutorial introdutório.
A principal diferença aqui é que você deve criar uma tarefa. Esta tarefa é colocada em um estado de espera e um cronômetro é definido para dizer à tarefa quando ela deve ser executada. Além disso, o loop contém apenas uma instrução: xHeliOSLoop (). Este loop executa todo o código definido na configuração () do código. Ao planejar seu código, você precisa definir todos os pinos, constantes e funções na configuração superior.
#incluir// Usado para armazenar o estado do LED
volátil int ledState = 0;
volátil int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Definir uma tarefa de piscar
void taskBlink (xTaskId id_)
if (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
senão
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;
// Definir uma tarefa de leitura de botão
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// verifique se o botão está pressionado. Se for, o buttonState é HIGH:
if (buttonState == HIGH)
// liga o LED:
digitalWrite (ledPin, HIGH);
senão
// desligue o LED:
digitalWrite (ledPin, LOW);
void setup ()
// id mantém o controle das tarefas
xTaskId id = 0;
// Isso inicializa as estruturas de dados Helios
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// inicializa o pino do botão de pressão como uma entrada:
pinMode (buttonPin, INPUT);
// Adicione e faça o taskBlink esperar
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Intervalo do cronômetro para 'id'
xTaskSetTimer (id, 1000000);
id = xTaskAdd ("BUTTON", & buttonRead);
xTaskStart (id);
void loop ()
// Isso, e apenas isso, está sempre em loop ao usar Helios
xHeliosLoop ();
Com este código, você pode programar o LED para piscar a qualquer momento sem ter que se preocupar com o atraso do Arduino.
Conclusão
Este projeto é ótimo para pessoas que são novas no Arduino, pois permite que você use o código regular do Arduino para lidar com tarefas em tempo real. No entanto, o método descrito neste artigo é apenas para amadores e pesquisadores. Para projetos mais sérios, outros métodos são necessários.