Java ME 8 + Raspberry Pi + Sensoren =IoT World (Teil 1)
Erfahren Sie, wie Sie Sensoren mit dem Raspberry Pi verbinden und mit Java steuern.
Veröffentlicht September 2014
Die neueste Version von Java ME 8 enthält eine leistungsstarke API zur Steuerung von Geräten wie LEDs, Relais, LCDs, Sensoren, Motoren und Schaltern.
Dieser Artikel ist der erste in einer dreiteiligen Serie über den Anschluss elektronischer Sensoren an den Raspberry Pi Model B mithilfe von Universal Input/Output (GPIO), Inter-Integrated Circuit Bus (I2C), Serial Peripheral Interface Bus (SPI). , oder universelle asynchrone Empfänger/Sender (UART)-Schnittstellen.
Indem wir Java ME 8 verwenden, um Geräte mit unterschiedlichen Schnittstellentypen zu steuern und die Geräte mit einem Raspberry Pi zu verbinden, können wir eine Welt des Internets der Dinge (IoT) schaffen.
Dieser Artikel konzentriert sich auf die Verwendung von GPIO und zeigt Beispiele für die Entwicklung von Klassen in Java ME 8, die
- Erkennen einer Flamme mit einem DFRobot-Flammensensor (Modell DFR0076)
- Erkennen Sie Bewegungen mit einem Passiv-Infrarot-(PIR)-Bewegungsmelder HC-SR501
- Messen Sie die Entfernung mit einem HC-SR04-Ultraschall-Entfernungsmodul
Hinweis :Der vollständige Beispielcode für dieses NetBeans IDE 8.0-Projekt kann hier heruntergeladen werden.
Geräte-E/A-API
Die Geräte-I/O-API-Spezifikation definiert eine generische Peripheriegeräte-I/O-API für Java-Anwendungen, die auf kleinen eingebetteten Geräten laufen. Es definiert APIs für einige der gängigsten Peripheriegeräte, einschließlich der folgenden:
- GPIO-Geräte
- I2C-Geräte
- SPI-Geräte
- Analog-Digital-Wandler (ADCs)
- Digital-Analog-Wandler (DACs)
- UART-Geräte
- Memory-mapped I/O (MMIO)-Geräte
- AT-Befehlsgeräte
- Watchdog-Timer
- Impulszähler
- Pulsweitenmodulation (PWM)-Generatoren
- Generische Geräte
Schaltungen, die wir erstellen werden
Ein GPIO-Gerät kann entweder als digitaler Eingang oder als digitaler Ausgang verwendet werden, es kann deaktiviert oder aktiviert werden und es kann verwendet werden, um „Interrupt“-Leitungen zu steuern. Eine sehr wichtige Überlegung ist jedoch, dass alle GPIO-Pins des Raspberry Pi mit 3,3 V arbeiten. Daher ist es sehr wichtig, die technischen Spezifikationen der Geräte zu überprüfen, die Sie anschließen möchten, um festzustellen, ob sie 3,3 V oder 5 V verwenden. In einigen Fällen , müssen Sie einen solchen Logikpegelwandler verwenden.
Anschließen des Flammenmelders
Der Flammensensor DFR0076 von DFRobot kann verwendet werden, um Feuer oder andere Lichtwellenlängen zwischen ca. 760 nm und 1100 nm zu erkennen. Wir können es an 3,3 V oder 5 V anschließen und die Reichweite beträgt ca. 20 cm (4,8 V) bis 100 cm (1 V). Wenn ein Feuer erkannt wird, wird der Signalstift hochgezogen.
Verbinden wir den Flammensensor mit den 3,3 V-, Gnd- und GPIO 22-Pins des Raspberry Pi, wie in Abbildung 3 gezeigt, und erstellen wir eine Java ME 8-Klasse für die Flammendetektor-Sensorsteuerung.
Erstellen Sie zuerst eine Klasse DFR0076Device
die die Gerätezugriffs-API verwendet, und definieren einen variablen pin
das die Schnittstelle zu GPIO unterstützt, wie in Listing 1 gezeigt.
öffentliche Klasse DFR0076Device { privater GPIOPin pin =null; // Definieren Sie den Pin für die Flammensensorsteuerung
Auflistung 1. Klasse für die Flammenmelder-Sensorsteuerung
Erstellen Sie als Nächstes einen Klassenkonstruktor, der den GPIO 22-Pin mit dem DeviceManager
. initialisiert und aktiviert API und die GPIOPinConfig
Klasse (siehe Listing 2), um die folgenden Bedingungen festzulegen:
- Gerätename:0
- Pin-Nummer:GPIO 22 (angegeben durch
pinGPIO
) - Richtung:nur Eingabe
- Modus:Klimmzug
- Trigger:steigende Flanke
- Anfangswert:false
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)); /pre>Auflistung 2. Festlegung der Anfangsbedingungen
Erstellen Sie nun eine Methode, die eine definierte Listener-Klasse empfängt, die Flammenerkennungsereignisse unterstützt, wie in Listing 3 gezeigt.
public void setListener(PinListener flameListener) {... if (pin!=null) pin.setInputListener(flameListener);...}Auflistung 3. Methode, die Flammenerkennungsereignisse unterstützt
Es ist auch wichtig, dass Sie den Pin schließen, wenn Sie fertig sind, und sicherstellen, dass Sie den Pin-Listener freigeben, wie in Listing 4 gezeigt.
public void close() {... if (pin!=null){ pin.setInputListener(null); pin.close(); }...}Auflistung 4. Den Pin schließen und den Hörer befreien
Erstellen Sie nun ein Haupt-MIDlet, das unseren Code aufruft und eine Listener-Klasse für die Verarbeitung von Flammenerkennungsereignissen definiert, wie in Listing 5 gezeigt.
public class TestSensors erweitert MIDlet { DFR0076Device Flame; privates statisches finales int FLAME_DETECTOR_PIN =22; public void startApp () {// Flammensensor Flamme initialisieren =neues DFR0076Device (FLAME_DETECTOR_PIN); Flame.setListener (neuer FlameSensor ()); aufrechtzuerhalten. Public Void DestroyApp (boolescher unbedingter Wert) { Flame.close(); } privates statisches int waitnext =1; Klasse FlameSensor implementiert PinListener { public void valueChanged(PinEvent event) { if (event.getValue() &&--waitnext ==0) { System.out.println("WARNUNG Flamme erkannt!!!"); Weiter warten =10; } } }}Auflistung 5. Erstellen eines MIDlets zum Aufrufen unseres Codes
Anschließen des Bewegungsmelders
Jetzt fügen wir unseren
TestSensoren
Bewegungsmelder-Funktionen hinzu MIDlet. Dazu benötigen wir einen Bewegungssensor wie den in Abbildung 2 gezeigten HC-SR501.PIR-Sensoren ermöglichen Ihnen, Bewegungen zu erkennen. Alles emittiert eine kleine Menge Infrarotstrahlung, und je heißer etwas ist, desto mehr Strahlung gibt es ab. PIR-Sensoren sind in der Lage, eine Änderung der IR-Pegel innerhalb ihres Erfassungsbereichs zu erkennen (z. B. wenn ein Mensch einen Raum betritt) und somit Bewegungen wahrzunehmen.
Der von uns verwendete PIR-Sensor hat drei Pins:Masse, Digitalausgang und 3–5 Vdc In. Im Leerlauf, wenn keine Bewegung erkannt wurde, bleibt das Digitalausgangssignal niedrig. Wenn jedoch eine Bewegung erkannt wird, wird das Digitalausgangssignal hoch pulsieren (3,3 V). Es ist in Ordnung, den Digital-Out-Pin direkt mit dem Raspberry Pi zu verbinden.
Zum Testen hat der PIR-Sensor einen Jumper (siehe Abbildung 4).
- Das Setzen des Jumpers auf die Position „L“ erzeugt einen einzelnen (nicht wiederholbaren) Trigger. Wenn sich der Jumper in dieser Position befindet, wird die Erkennung aktiviert, nachdem ein Erkennungsereignis auftritt, was eine kontinuierliche Bewegungserkennung ermöglicht. Der Ausgang wird noch 3 Sekunden lang auf Low gehalten, nachdem keine Bewegung mehr erkannt wird.
- Das Setzen des Jumpers auf die Position „H“ erzeugt einen wiederholbaren Trigger. Wenn der Jumper auf die Position „H“ (Standard) gesetzt ist, wird die Erfassung deaktiviert, nachdem ein Erfassungsereignis auftritt (d. h. sobald der Ausgang hoch ist).
Sie können die folgenden Anpassungen vornehmen:
- Ein Verstellen des Empfindlichkeitspotentiometers im Uhrzeigersinn erhöht den Erfassungsabstand auf etwa 7 Meter; durch Drehen gegen den Uhrzeigersinn verringert sich der Erfassungsabstand auf etwa 3 Meter.
- Das Einstellen des Zeitverzögerungspotentiometers im Uhrzeigersinn verlängert die Induktionsverzögerung auf 300 Sekunden; durch Verstellen gegen den Uhrzeigersinn wird die Induktionsverzögerung auf 5 Sekunden verkürzt.
Verbinden wir den PIR-Sensor mit den Raspberry Pi 5 V-, Gnd- und GPIO 24-Pins, wie in Abbildung 3 gezeigt, und erstellen wir ein Java ME 8-KlasseHCSR501Device
um es mit der Device Access API zu steuern, wie in Listing 6 gezeigt.
öffentliche Klasse HCSR501Device { privater GPIOPin-Pin =null;
Auflistung 6. HCSR501Gerät
Klasse
Erstellen Sie dann einen Klassenkonstruktor, der den GPIO 24-Pin mit dem DeviceManager
initialisiert und aktiviert API und die GPIOPinConfig
Klasse (siehe Listing 7), um die folgenden Bedingungen festzulegen:
- Gerätename:0
- Pin-Nummer:GPIO 24 (angegeben durch
pinGPIO
) - Richtung:nur Eingabe
- Modus:Pulldown
- Trigger:steigende Flanke
- Anfangswert:false
- Warten Sie drei Sekunden, bevor Sie den PIR initialisieren
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); // 3 Sekunden warten ...}
Auflistung 7. Festlegung der Anfangsbedingungen
Erstellen Sie nun eine Methode, die eine definierte Listener-Klasse empfängt, die Bewegungserkennungsereignisse unterstützt, wie in Listing 8 gezeigt.
public void setListener(PinListener pirListener) {... if (pin!=null) pin.setInputListener(pirListener);...}
Auflistung 8. Methode, die Bewegungserkennungsereignisse unterstützt
Es ist auch wichtig, dass Sie den Pin schließen, wenn Sie fertig sind, und sicherstellen, dass Sie den Pin-Listener freigeben, wie in Listing 9 gezeigt.
public void close() {... if (pin!=null){ pin.setInputListener(null); pin.close(); }...}
Auflistung 9. Den Pin schließen und den Hörer befreien
Lassen Sie uns unsere MIDlet-Klasse erweitern, um den PIR-Sensor und seinen Listener zu unterstützen, wie in Listing 10 gezeigt.
//Define HCSR501 Device objectHCSR501Device pir;private static final int MOTION_DETECTOR_PIN =24;@Overridepublic void startApp() {... //Initialize PIR sensor pir =new HCSR501Device(MOTION_DETECTOR_PIN); pir.setListener(new PirSensor());... }@Overridepublic void DestroyApp(boolean unconditional) {... pir.close();...} // PIR Sensor auf Bewegungserkennungsklasse prüfen PirSensor implementiert PinListener { @Override public void valueChanged(PinEvent event) { if (event.getValue()) { System.out.println("WARNUNG Bewegung erkannt!!!"); } }}
Auflistung 10. Erweiterung der MIDlet-Klasse zur Unterstützung des PIR-Sensors und seines Listeners
Weitere Informationen: Java ME 8 + Raspberry Pi + Sensoren =IoT World (Teil 1)
Herstellungsprozess
- Java-Hello-World-Programm
- Professioneller Multichannel-Datenlogger auf Raspberry Pi – Teil 1
- IoT 101-Projekt:Stream-Temperatur von Ihrem Raspberry Pi
- Lesen analoger Sensoren mit einem GPIO-Pin
- Analoge Sensoren ohne analoge Eingänge auf dem Raspberry Pi
- Raspberry Pi 1-Draht digitaler Thermometersensor (DS18B20)
- Java ME 8 + Raspberry Pi + Sensoren =IoT World (Teil 1)
- Raspberry Pi digitaler Hall-Sensor in JAVA
- Raspberry Pi-Sensoren
- Überwachen Sie Ihre Haustemperatur mit Ihrem Raspberry Pi