Teil 7: I2C-Kanäle effizient ausnutzen mit dem PCA9516

Software

Für das Beispielprogramm kommt Code aus Teil 6 dieser Reihe zum Einsatz. Dabei verschieben Sie nun das Programm aus dem letzten Teil in die Methode messen() (Listing 1). Wie Sie sehen, besteht die Methode main() aus einer Schleife, die nacheinander die GPIO-Pins für das Freigeben der einzelnen I2C-Kanäle auf logisch 1 setzt.

Listing 1

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;
public class PCA9516 {
  final static GpioController gpio = GpioFactory.getInstance();
  private static final int i2cBus = 1;
  private static final int address = 0x5c;
    public static void main(String[] args) throws InterruptedException {
      GpioPinDigitalOutput[] channel =new GpioPinDigitalOutput[4];
      channel[0] = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "Channel0", PinState.LOW);
      channel[1] = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "Channel1", PinState.LOW);
      channel[2] = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, "Channel2", PinState.LOW);
      channel[3] = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, "Channel3", PinState.LOW);
      for(int i=0;i<4;i++) {
        System.out.println("Channel: "+i);
        channel[i].toggle();
        messen();
        Thread.sleep(1000);
        channel[i].toggle();
      }
    }//main
  private static void messen() {
    byte[] wb = new byte[] {(byte)0x03,(byte)0x00,(byte)0x04};
    byte[] rb = new byte[8];
    try {
      I2CBus bus=I2CFactory.getInstance(I2CBus.BUS_1);
      I2CDevice dev = bus.getDevice(address);
      // wecken
      try{dev.read();}catch(Exception e){Thread.sleep(100);};
      // messen
      dev.read(wb, 0, 3, rb, 0, 8);
      int crc = ((rb[6] & 0xff ) << 8) | rb[7] & 0xff;
      double hum = (((rb[2] & 0xff ) << 8) | rb[3] & 0xff);
      double temp = (((rb[4] & 0xff) << 8) | rb[5] & 0xff);
      hum=hum/10;
      temp=temp/10;
      System.out.println("Luftfeuchtigkeit:"+hum);
      System.out.println("Temperatur:"+temp);
      }
    catch(Exception e) {
      System.out.println(e.toString());
      }
  }//messen
} //class

Wenn ein Kanal aktiv ist, ruft das Programm die Methode messen() auf und gibt die Messergebnisse aus. Danach setzt es den Channel wieder auf inaktiv. Mehr macht das kleine Testprogramm nicht. Listing 2 zeigt, wie Sie es mithilfe des Tools Pi4j kompilieren und starten.

Interessant an der Ausgabe des Testprogramms ist die Streuung der Messwerte der einzelnen Sensoren: Obwohl es so aussieht, als ob der Sensor an Kanal 3 falsch misst, liegt der Wert noch in der Toleranz von 3 Prozent für die Luftfeuchtigkeit.

Listing 2

$ pi4j -c PCA9516.java
+ javac -classpath '.:classes:*:classes:/opt/pi4j/lib/*' -d . PCA9516.java
$ pi4j -r PCA9516
+ sudo java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' PCA9516
Channel: 0
Luftfeuchtigkeit:37.0
Temperatur:26.4
Channel: 1
Luftfeuchtigkeit:36.0
Temperatur:26.0
Channel: 2
Luftfeuchtigkeit:37.1
Temperatur:26.1
Channel: 3
Luftfeuchtigkeit:42.8
Temperatur:26.3

Möchten Sie die Daten der einzelnen Sensoren weiterverarbeiten, empfiehlt es sich, über mehrere Messwerte zu mitteln und diesen Mittelwert für weitere Berechnungen zu verwenden. Beim Testen hatte es den Anschein, als ob der erste Messwert nach einer längeren Pause grundsätzlich sehr ungenau ausfällt. Dazu fand sich aber im Datenblatt keine konkrete Information.

Fazit

Beim PCA9516 handelt es sich sicher nicht um einen Baustein, den Sie in jedem Feld-, Wald- und Wiesen-Projekt einsetzen. Kommen Sie jedoch einmal in die Verlegenheit, dass die Adressen am I2C-Bus zur Neige gehen oder sich überschneiden, springt der nützliche Hub in die Bresche und hilft relativ einfach aus der Klemme. 

Infos

  1. Datenblatt AM2321: http://akizukidenshi.com/download/ds/aosong/AM2321_e.pdf
  2. Datenblatt PCA9516: http://www.nxp.com/documents/data_sheet/PCA9516A.pdf
  3. I2C, Teil 6 (AM2321): Martin Mohr, "Wetterfrosch", RPG 01/2016, S. 80, http://www.raspi-geek.de/33934

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

12/2019
RasPi-Alternativen

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Grußbotschaften

    Mit Sonic Pi zaubern Sie komplexe Sounds, die Sie bei Bedarf sogar noch während des Abspielens modifizieren.

  • Das Runde und das Eckige

    Mit dem MCP4725 ergänzen Sie einen RasPi um einem D/A-Wandler, der bei Bedarf noch weitere Funktionen erfüllt.

  • Alles unter Kontrolle

    Schon ein einfaches Mikrocontrollerboard wie das CY8CKIT-049-42xx bietet erstaunlich viele Möglichkeiten beim Ansteuern von Hardware.

  • Viele Kerne

    Das Spresense Development Board von Sony lässt sich mit der Arduino IDE programmieren und bringt auch ein eigenes Entwickler-SDK mit.

  • Exotische Früchte

    Der aus China stammende Orange Pi positioniert sich mit einem guten Preis und interessanten Features gegen die RasPi-Truppe. Kann er sich auch behaupten?

  • Flexibler Surfer

    Mit dem neuen RasPi 4 setzen Sie einen öffentlichen Webkiosk schnell und kostengünstig auf.

  • Auskunftsfreudig

    Viele Devices, so auch der E.ON-Aura-Controller, verwenden eine Schnittstelle namens REST, um Zustandsdaten zu übermitteln. Mit ein wenig Bastelei lesen Sie diese auch über Ihr Smartphone aus.

  • Doppelt gemessen

    Mit wenig Aufwand und einem Pi Zero realisieren Sie einen mobilen Zweikanal-Spannungsprüfer.

  • Elegant zusammengeführt

    Tizonia streamt Musik von Online-Quellen und lokalen Sammlungen. Die schlanke Architektur macht den Player zur guten Wahl für den Einsatz auf dem RasPi.

  • Kommunikativ

    Nicht jeder traut sich zu, sein eigenes Smartphone zu bauen. Allerdings kann jeder Linux-Nutzer den Raspberry Pi im Handumdrehen zu einem VoIP-Telefon aufrüsten.