Создание IoT с Java ME 8 на Raspberry Pi: Часть 1 — интеграция GPIO-датчиков
Узнайте, как подключать и управлять датчиками на Raspberry Pi с помощью Java ME 8, раскрывая мощные возможности IoT.
Опубликовано сентябрь 2014 года
Последний релиз Java ME 8 вводит надежный Device I/O API, упрощающий управление светодиодами, реле, LCD, датчиками, двигателями и переключателями.
Эта статья начинает трехчастную серию об интеграции электронных датчиков с Raspberry Pi Model B через интерфейсы GPIO, I²C, SPI или UART.
Используя Java ME 8 для управления устройствами через эти интерфейсы, можно построить полнофункциональную экосистему IoT.
В этой части мы фокусируемся на GPIO и предоставляем готовые к использованию классы Java ME 8 для:
- Обнаружения пламени с датчиком DFRobot DFR0076
- Обнаружения движения с PIR-датчиком HC‑SR501
- Измерения расстояния с ультразвуковым модулем HC‑SR04
Примечание: Полный проект NetBeans IDE 8.0, включая все исходные файлы, можно скачать здесь.
Обзор Device I/O API
Спецификация Device I/O API определяет общий интерфейс периферийного ввода-вывода для Java-приложений на встраиваемых платформах. Она охватывает распространенные устройства, такие как:
- GPIO, I²C, SPI, UART
- ADC и DAC
- Memory‑mapped I/O
- AT-командные модули
- Watchdog-таймеры и счетчики импульсов
- Генераторы PWM и общие устройства
Ключевые соображения по схеме
Все GPIO-пины Raspberry Pi работают на 3,3 В. Перед подключением датчика проверьте его требования к напряжению. Если устройство ожидает 5 В, используйте преобразователь уровней (например, на базе MOSFET BSS138) для безопасного преобразования сигналов.
Подключение детектора пламени
Датчик DFR0076 обнаруживает длины волн света примерно от 760 нм до 1100 нм, с диапазоном обнаружения 20–100 см. При наличии пламени его сигнальный пин переходит в высокое состояние.
Подключите датчик к 3,3 В, GND и GPIO 22 Pi, как показано на рисунке 3, затем создайте класс Java ME 8 для управления им.
Листинг 1 – Класс DFR0076Device
public class DFR0076Device {
private GPIOPin pin = null; // Пин для управления датчиком пламени
}
Листинг 2 – Инициализация 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));
}
Листинг 3 – Регистрация слушателя
public void setListener(PinListener flameListener) {
if (pin != null) {
pin.setInputListener(flameListener);
}
}
Листинг 4 – Очистка ресурсов
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Листинг 5 – MIDlet, использующий датчик пламени
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("WARNING Flame detected!!!");
waitNext = 10;
}
}
}
}
Подключение детектора движения
Интегрируйте PIR-датчик HC‑SR501, который выдает импульс 3,3 В при обнаружении движения. У датчика три пина: GND, VCC (3–5 В) и цифровой выход.
Настройте чувствительность и задержку PIR через его потенциометры, и установите перемычку на «L» для единичных срабатываний или «H» для повторяющихся.
Подключите PIR к 5 В, GND и GPIO 24, затем расширьте MIDlet с выделенным классом HCSR501Device.
Листинг 6 – Класс HCSR501Device
public class HCSR501Device {
private GPIOPin pin = null;
}
Листинг 7 – Инициализация пина с задержкой 3 секунды
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); // Ожидание стабилизации датчика
}
Листинг 8 – Регистрация слушателя движения
public void setListener(PinListener pirListener) {
if (pin != null) {
pin.setInputListener(pirListener);
}
}
Листинг 9 – Очистка
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Расширьте MIDlet TestSensors для обработки событий движения:
Листинг 10 – MIDlet с поддержкой PIR
// Инициализация 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("WARNING Motion detected!!!");
}
}
}
Для более глубокого погружения прочитайте полную серию: Java ME 8 + Raspberry Pi + Sensors = IoT World (Part 1).
Производственный процесс
- Java Hello World: ваша первая программа
- Построение многоканального логгера данных на Raspberry Pi — Часть 1: Требования и архитектура
- Учебник для начинающих по IoT: стриминг данных температуры с Raspberry Pi
- Измерение аналоговых датчиков на Raspberry Pi с одним GPIO-пином
- Чтение аналоговых датчиков на Raspberry Pi без встроенного АЦП
- Подключение цифрового термометра DS18B20 1-Wire к Raspberry Pi — пошаговое руководство
- Создание IoT с Java ME 8 на Raspberry Pi: Часть 1 — интеграция GPIO-датчиков
- Чтение линейного Холловского датчика с Raspberry Pi: руководство по Java и особенности ADC0832
- Мастерство датчиков Raspberry Pi: практическое руководство по электронике и протоколам связи
- Мониторинг домашней температуры с панелью управления на Raspberry Pi