GPIO-Beispiel: Ansteuerung eines extern angeschlossenen Relais

Schritt 1: Ein Relais, das an den GPIO-Kanal mit der Nummer 0 angeschlossen ist, soll per Software ein- und ausgeschaltet werden. Bild 1 zeigt eine Möglichkeit, eine solche Schaltung zu realisieren.

Bild 1: Anschluss eines Relais an einen GPIO-Kanal

Das Relais ist hier LOW-aktiv mit dem GPIO-Kanal verbunden, d.h. der GPIO-Kanal muss initial auf HIGH geschaltet werden, um das Relais in Ruhestellung zu halten. In der Schaltung erledigt dies der Widerstand R101.

Schritt 2: Es soll nun eine Java-Klasse zur Ansteuerung der obigen Schaltung implementiert werden. Diese soll das Relais bei der Instantiierung in Ruhestellung initialisieren und Methoden zum Ein- und Ausschalten des Relais zur Verfügung stellen. Der folgende Quelltext zeigt, wie diese Aufgaben mit Hilfe der Klasse GPIO erledigt werden können:

1    import jcontrol.io.GPIO;
2    import jcontrol.lang.ThreadExt;
3    
4    /**
5     * RelayExample shows how to control a hardware relay
6     * connected to a GPIO channel.
7     *
8     * <p>(C) DOMOLOGIC Home Automation GmbH 2003</p>
9     */
10    public class RelayExample {
11    
12    
13        /** GPIO channel the relay is connected to */
14        static final int GPIO_RELAY = 0;
15    
16    
17        /** init relay control */
18        public RelayExample() {
19            GPIO.setMode(GPIO_RELAY, GPIO.PUSHPULL);
20            release();
21        }
22    
23    
24        /**
25         * Switch relay to released state.
26         */
27        void release() {
28            GPIO.setState(GPIO_RELAY, GPIO.HIGH);
29        }
30    
31    
32        /**
33         * Switch relay to attracted state.
34         */
35        void attract() {
36            GPIO.setState(GPIO_RELAY, GPIO.LOW);
37        }
38    
39    
40        /**
41         * Main method. Init relay and attract it for one second.
42         * @param args
43         */
44        public static void main(String args[]) {
45    
46            RelayExample r = new RelayExample();
47    
48            // endless loop
49            for (;;) {
50    
51                // attract relay
52                r.attract();
53    
54                // sleep one second
55                try {
56                    ThreadExt.sleep(1000);
57                } catch (InterruptedException e) {}
58    
59                // release relay
60                r.release();
61    
62                // sleep one second
63                try {
64                    ThreadExt.sleep(1000);
65                } catch (InterruptedException e) {}
66            }
67        }
68    }
Listing 1: RelayExample.java

Im Konstruktor der Klasse RelayExample wird der GPIO-Kanal, an den das Relais angeschlossen ist, zunächst in den Modus PUSHPULL versetzt, um das Relais danach durch einen Aufruf der Methode release() in den Ruhezustand zu bringen. Die Methode release() benutzt die Konstante HIGH, um den GPIO-Kanal einzuschalten (logisch '1'). Als Antagonist steht die Methode attract() zur Verfügung, um das Relais zu aktivieren. Diese versetzt den Portpin in den Zustand LOW (logisch '0'), wodurch das Relais "anzieht". Ein angeschlossener Verbraucher würde nun eingeschaltet.

Schritt 3: Wenn Sie obige Schaltung nachgebaut haben, probieren Sie das RelayExample damit aus. Erstellen Sie ein neues JControl/IDE-Projekt, laden Sie den Quelltext herunter und fügen Sie ihn dem Projekt hinzu. Nach dem Hochladen auf Ihr JControl-Gerät und Druck auf den Reset-Schalter wird das Relais 1 Sekunde (100ms) lang aktiviert werden. Diese Zeitspanne läßt sich durch Anpassung des Parameters millis der Funktion ThreadExt.sleep() in der main-Methode verändern.

Damit der ganze Vorgang besser nachvollzogen werden kann, wird das Relais in einer Endlosschleife immer wieder ein- und ausgeschaltet. Die Ausschaltzeit beträgt dabei ebenfalls 1000ms. Sie können den Vorgang auch mit der Simulationsumgebung überprüfen, wenn Sie sich einfach den aktuellen Zustand der GPIO-Kanäle anzeigen lassen.