IoT mit Java ME 8 auf Raspberry Pi: Teil 1 – GPIO Sensor-Integration
Überblick
Entdecken Sie, wie Sie Sensoren am Raspberry Pi mit Java ME 8 anschließen und steuern – für leistungsstarke IoT-Fähigkeiten.
Veröffentlicht September 2014
Das neueste Release von Java ME 8 führt eine robuste Device I/O API ein, die die Steuerung von LEDs, Relais, LCDs, Sensoren, Motoren und Schaltern vereinfacht.
Dieser Artikel startet eine dreiteilige Serie zur Integration elektronischer Sensoren mit dem Raspberry Pi Model B über GPIO, I²C, SPI oder UART-Schnittstellen.
Durch den Einsatz von Java ME 8 zur Ansteuerung von Geräten über diese Schnittstellen können Sie ein voll funktionsfähiges IoT-Ökosystem aufbauen.
In diesem Teil fokussieren wir uns auf GPIO und stellen einsatzbereite Java ME 8 Klassen für:
- Flammen-Erkennung mit DFRobot DFR0076 Flammensensor
- Bewegungs-Erkennung mit HC‑SR501 PIR-Sensor
- Distanzmessung mit HC‑SR04 Ultraschallmodul
Hinweis: Das vollständige NetBeans IDE 8.0 Projekt inklusive aller Quelldateien kann hier heruntergeladen werden.
Device I/O API Überblick
Die Device I/O API Spezifikation definiert eine generische Peripherie-I/O-Schnittstelle für Java-Anwendungen auf eingebetteten Plattformen. Sie deckt gängige Geräte ab:
- GPIO, I²C, SPI, UART
- ADC und DAC
- Memory-mapped I/O
- AT-Kommando-Module
- Watchdog-Timer und Pulszähler
- PWM-Generatoren und generische Geräte
Wichtige Schaltungsüberlegungen
Alle Raspberry Pi GPIO-Pins arbeiten mit 3,3 V. Vor dem Anschließen eines Sensors dessen Spannungsanforderungen prüfen. Erwartet ein Gerät 5 V, einen Logic-Level-Converter (z. B. BSS138 MOSFET-basierten Shifter) nutzen, um Signale sicher zu übersetzen.
Flammensensor anschließen
Der DFR0076 Flammensensor detektiert Lichtwellenlängen zwischen ~760 nm und 1100 nm mit einem Erfassungsbereich von 20–100 cm. Bei Flammen-Erkennung zieht sein Signalpin High.
Sensor an Pi's 3,3 V, GND und GPIO 22 anschließen (wie in Abbildung 3 dargestellt), dann eine Java ME 8 Klasse zur Steuerung erstellen.
Listing 1 – DFR0076Device Klasse
public class DFR0076Device {
private GPIOPin pin = null; // Pin für Flammensensor-Steuerung
}
Listing 2 – GPIO-Pin initialisieren
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));
}
Listing 3 – Listener registrieren
public void setListener(PinListener flameListener) {
if (pin != null) {
pin.setInputListener(flameListener);
}
}
Listing 4 – Ressourcen freigeben
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Listing 5 – MIDlet mit Flammensensor
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;
}
}
}
}
Bewegungsmelder anschließen
HC‑SR501 PIR-Sensor integrieren, der bei erkannter Bewegung einen 3,3 V Impuls ausgibt. Die drei Pins des Sensors sind GND, VCC (3–5 V) und Digital Out.
PIR-Empfindlichkeit und Verzögerung über dessen Potentiometer einstellen, Jumper auf „L“ für Einzelauslösung oder „H“ für wiederholbare Auslösung setzen.
PIR an 5 V, GND und GPIO 24 verdrahten, dann das MIDlet um eine dedizierte HCSR501Device Klasse erweitern.
Listing 6 – HCSR501Device Klasse
public class HCSR501Device {
private GPIOPin pin = null;
}
Listing 7 – Pin-Initialisierung mit 3-Sekunden-Verzögerung
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); // Warten auf Sensor-Stabilisierung
}
Listing 8 – Motion Listener registrieren
public void setListener(PinListener pirListener) {
if (pin != null) {
pin.setInputListener(pirListener);
}
}
Listing 9 – Cleanup
public void close() {
if (pin != null) {
pin.setInputListener(null);
pin.close();
}
}
Listing 10 – MIDlet mit PIR-Unterstützung
// PIR-Sensor initialisieren
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!!!");
}
}
}
Für tieferen Einstieg lesen Sie die vollständige Serie: Java ME 8 + Raspberry Pi + Sensors = IoT World (Part 1).
Herstellungsprozess
- Java Hello World: Ihr erstes Programm
- Multichannel-Datenlogger mit Raspberry Pi bauen – Teil 1: Anforderungen & Architektur
- Einsteiger IoT Tutorial: Temperaturdaten vom Raspberry Pi streamen
- Analoge Sensoren am Raspberry Pi mit nur einem GPIO-Pin auslesen
- Analoge Sensoren am Raspberry Pi ohne nativen ADC auslesen – Step-Response Methode
- DS18B20 1-Wire Digitalthermometer an Raspberry Pi anschließen – Schritt-für-Schritt-Anleitung
- IoT mit Java ME 8 auf Raspberry Pi: Teil 1 – GPIO Sensor-Integration
- Linearen Hall-Sensor mit Raspberry Pi auslesen: Java-Anleitung & ADC0832 Einblicke
- Raspberry Pi Sensoren meistern: Praktischer Leitfaden zu Elektronik und Kommunikationsprotokollen
- Heimtemperatur mit Raspberry Pi Dashboard überwachen