Construindo IoT com Java ME 8 no Raspberry Pi: Parte 1 – Integração de Sensores GPIO
Descubra como conectar e controlar sensores em um Raspberry Pi usando Java ME 8, desbloqueando poderosas capacidades IoT.
Publicado em setembro de 2014
A versão mais recente do Java ME 8 introduz uma robusta API Device I/O que simplifica o controle de LEDs, relés, LCDs, sensores, motores e interruptores.
Este artigo inicia uma série de três partes sobre integração de sensores eletrônicos com o Raspberry Pi Model B via GPIO, I²C, SPI ou interfaces UART.
Ao aproveitar o Java ME 8 para acionar dispositivos através dessas interfaces, você pode construir um ecossistema IoT totalmente funcional.
Nesta parte, focamos em GPIO e fornecemos classes Java ME 8 prontas para uso para:
- Detectar chama com sensor de chama DFRobot DFR0076
- Detectar movimento com sensor PIR HC-SR501
- Medir distância com módulo ultrassônico HC-SR04
Nota: O projeto completo NetBeans IDE 8.0, incluindo todos os arquivos fonte, pode ser baixado aqui.
Visão Geral da API Device I/O
A especificação da API Device I/O define uma interface genérica de I/O periférico para aplicações Java em plataformas embarcadas. Ela cobre dispositivos comuns como:
- GPIO, I²C, SPI, UART
- ADC e DAC
- I/O mapeado em memória
- Módulos de comando AT
- Timers watchdog e contadores de pulso
- Geradores PWM e dispositivos genéricos
Considerações Principais do Circuito
Todos os pinos GPIO do Raspberry Pi operam a 3.3 V. Antes de conectar um sensor, verifique seus requisitos de tensão. Se um dispositivo espera 5 V, use um conversor de nível lógico (ex: shifter baseado em MOSFET BSS138) para traduzir sinais com segurança.
Conectando o Detector de Chama
O sensor de chama DFR0076 detecta comprimentos de onda de luz entre ~760 nm e 1100 nm, com alcance de detecção de 20–100 cm. Quando chama está presente, seu pino de sinal puxa para alto.
Conecte o sensor ao 3.3 V, GND e GPIO 22 do Pi conforme ilustrado na Figura 3, então crie uma classe Java ME 8 para controlá-lo.
Listagem 1 – Classe DFR0076Device
public class DFR0076Device {
private GPIOPin pin = null; // Pino para controle do sensor de chama
}
Listagem 2 – Inicializando o pino GPIO
public DFR0076Device(int pinGPIO) {
pin = (GPIOPin) DeviceManager.open(new GPIOPinConfig(
0, pinGPIO, GPIOPinConfig.DIR_INPUT_ONLY,
GPIOPinConfig.MODE_INPUT_PULL_UP,
GPIOPinConfig.TRIGGER_RISING_EDGE, false));
}
Listagem 3 – Registro de listener
public void setListener(PinListener flameListener) {
if (pin != null) {
pin.setInputListener(flameListener);
}
}
Listagem 4 – Limpeza de recursos
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Listagem 5 – MIDlet que usa o sensor de chama
public class TestSensors extends MIDlet {
private DFR0076Device flame;
private static final int FLAME_DETECTOR_PIN = 22;
public void startApp() {
flame = new DFR0076Device(FLAME_DETECTOR_PIN);
flame.setListener(new FlameSensor());
}
public void destroyApp(boolean unconditional) {
flame.close();
}
private static int waitNext = 1;
private class FlameSensor implements PinListener {
public void valueChanged(PinEvent event) {
if (event.getValue() && --waitNext == 0) {
System.out.println("AVISO Chama detectada!!!");
waitNext = 10;
}
}
}
}
Conectando o Detector de Movimento
Integre o sensor PIR HC-SR501, que produz um pulso de 3.3 V quando movimento é detectado. Os três pinos do sensor são GND, VCC (3–5 V) e saída digital.
Ajuste a sensibilidade e atraso do PIR via seus potenciômetros, e defina o jumper para "L" para gatilhos únicos ou "H" para gatilhos repetíveis.
Conecte o PIR a 5 V, GND e GPIO 24, então estenda o MIDlet com uma classe dedicada HCSR501Device.
Listagem 6 – Classe HCSR501Device
public class HCSR501Device {
private GPIOPin pin = null;
}
Listagem 7 – Inicialização do pino com atraso de 3 segundos
public HCSR501Device(int pinGPIO) {
pin = (GPIOPin) DeviceManager.open(new GPIOPinConfig(
0, pinGPIO, GPIOPinConfig.DIR_INPUT_ONLY,
GPIOPinConfig.MODE_INPUT_PULL_DOWN,
GPIOPinConfig.TRIGGER_RISING_EDGE, false));
I2CUtils.I2Cdelay(3000); // Aguarda estabilização do sensor
}
Listagem 8 – Registrando listener de movimento
public void setListener(PinListener pirListener) {
if (pin != null) {
pin.setInputListener(pirListener);
}
}
Listagem 9 – Limpeza
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Estenda o MIDlet TestSensors para lidar com eventos de movimento:
Listagem 10 – MIDlet com suporte PIR
// Inicializa sensor PIR
private HCSR501Device pir;
private static final int MOTION_DETECTOR_PIN = 24;
@Override
public void startApp() {
pir = new HCSR501Device(MOTION_DETECTOR_PIN);
pir.setListener(new PirSensor());
}
@Override
public void destroyApp(boolean unconditional) {
pir.close();
}
private class PirSensor implements PinListener {
public void valueChanged(PinEvent event) {
if (event.getValue()) {
System.out.println("AVISO Movimento detectado!!!");
}
}
}
Para um mergulho mais profundo, leia a série completa: Java ME 8 + Raspberry Pi + Sensores = IoT World (Parte 1).
Processo de manufatura
- Java Hello World: Seu Primeiro Programa
- Construindo um Registrador de Dados Multicanal com Raspberry Pi – Parte 1: Requisitos e Arquitetura
- Tutorial IoT Iniciante: Streaming de Dados de Temperatura de um Raspberry Pi
- Medindo Sensores Analógicos no Raspberry Pi com um Único Pino GPIO
- Meça Sensores Analógicos no Raspberry Pi sem ADC Nativo
- Como Conectar um Termômetro Digital DS18B20 One-Wire ao Raspberry Pi – Guia Passo a Passo
- Construindo IoT com Java ME 8 no Raspberry Pi: Parte 1 – Integração de Sensores GPIO
- Leitura de Sensor Hall Linear com Raspberry Pi: Guia Java e Insights ADC0832
- Dominando Sensores no Raspberry Pi: Guia Prático de Eletrônica e Protocolos de Comunicação
- Monitore a Temperatura da Sua Casa com Dashboard no Raspberry Pi