Monday, February 7, 2011

Event-Based Library - Biblioteca de eventos para Arduino

Depois de feito meus primeiros programas para o Arduino, talvez por ter trabalhado durante um tempo em linguagens como Java e C#, tenho achado a sua programação um pouco antiquada. Tarefas como gerenciar apertos de botões ou fazer um LED acender suavimente atrávés de PWM, apesar de serem simples de se compreender, requer um volume razoável de código para ficarem consistentes, ainda mais quando é necessário que vários componentes funcionem simultâneamente.

English version of this article: Event-Based Library for Arduino.

Por sofrer com essa dificuldade eu resolvi transformar todas as minhas dificuldades de programação com o Arduino em uma coleção de classes que facilitam a vida do programador. Atualmente essa coleção conta com os seguintes componentes:

AnalogEvent

Gerenciador de eventos para portas analogicas que pode ser usado para ler potenciômetros ou outros sensores. Implementa o evento onChange.

Nesse exemplo nós configuramos a porta analógica do pino 1 para ler valores de um potenciometro com uma histerese de 3:

#include <AnalogEvent.h>

void setup() {
  AnalogEvent.addAnalogPort(1,        //potentiometer pin
                            onChange, //onChange event function
                            3);       //hysteresis
  
  Serial.begin(9600);
}

void loop() {
  AnalogEvent.loop();
}

void onChange(AnalogPortInformation* Sender) {
  Serial.print("Analog (pin:");
  Serial.print(Sender->pin);
  Serial.print(") changed to: ");
  Serial.print(Sender->value);
  Serial.println("!");
}

ButtonEvent

Gerenciador de eventos para botões conectados em portas digitais. Implementa os eventos onUp, onDown, onHold e onDouble.

Nesse exemplo nós configuramos um botão no pino 12 com todos os seus eventos ativados:

#include <ButtonEvent.h>

void setup() {
  ButtonEvent.addButton(12,       //button pin
                        onDown,   //onDown event function
                        onUp,     //onUp event function
                        onHold,   //onHold event function
                        1000,     //hold time in milliseconds
                        onDouble, //double event function
                        200);     //double time interval

  Serial.begin(9600);
}

void loop() {
  ButtonEvent.loop();
}

void onDown(ButtonInformation* Sender) {
  Serial.print("Button (pin:");
  Serial.print(Sender->pin);
  Serial.println(") down!");
}

void onUp(ButtonInformation* Sender) {
  Serial.print("Button (pin:");
  Serial.print(Sender->pin);
  Serial.println(") up!");
}

void onHold(ButtonInformation* Sender) {
  Serial.print("Button (pin:");
  Serial.print(Sender->pin);
  Serial.print(") hold for ");
  Serial.print(Sender->holdMillis);
  Serial.println("ms!");
}

void onDouble(ButtonInformation* Sender) {
  Serial.print("Button (pin:");
  Serial.print(Sender->pin);
  Serial.print(") double click in ");
  Serial.print(Sender->doubleMillis);
  Serial.println("ms!");
}

LedControl

Classe que implementa funções simples para controlar LEDs com alguns recursos assíncronos.

Nesse exemplo dois LEDs piscam juntos de duas maneiras diferentes. O LED no pino 9 está configurado um efeito fade in/out de duração de 500ms e com intervalo de 1s, enquanto o LED do pino 8 é um pisca simples de intervalo 200ms:

#include <LedControl.h>

void setup() {
  LedControl.startBlink(9,1000,500);
  LedControl.startBlink(8,200);
}

void loop() {
  LedControl.loop();
}

Esse projeto possui um repositório com maiores informações sobre as classes, instruções de uso e opções para download. O nome do projeto é ebl-arduino, que significa Event-Based Library for Arduino sua página pode ser acessada através da URL http://code.google.com/p/ebl-arduino/.

1 comment: