PCF8574Das Node.js Modul pcf8574 ist eine Eigenentwicklung von mir und kann über den Node.js Paketmanager npm installiert werden.

Der Quellcode ist öffentlich im cryHost GitLab Repository verfügbar. Hier können auch Fehler und Ideen gemeldet werden.

 

Was kann das Modul pcf8574?

Mit diesem Modul ist es möglich, jeden Pin eines PCF8574/PCF8574A Porterweiterungs-ICs einzeln zu kontrollieren. Ein Pin kann entweder als Eingang oder als Ausgang definiert werden.

Der PCF8574/PCF8574A ist ein 8-Bit Porterweiterungs-IC, welcher über den I²C-Bus angesteuert wird. Jeder der 8 Pins kann separat als Eingang oder Ausgang benutzt werden. Weiterhin bietet der IC ein Interrupt-Signal, welches dem I²C-Master (z.B. einem Raspberry Pi) mitteilen kann, dass sich etwas an einem Pin geändert hat. Weitere Informationen zu dem PCF8574/PCF8574A sind im Datenblatt von Texas Instruments zu finden.

 

Installation

TypeScript-Definitionen sind in dem Paket enthalten. Somit kann es ohne Weiteres direkt mit TypeScript verwendet werden.

Das Modul sollte auf jedem Linux basierten Betriebssystem funktionieren, sofern eine I²C Schnittstelle vorhanden ist.

Zur Verwendung der Interrupt-Erkennung ist ein Raspberry Pi (oder ähnliches) erforderlich.

 

Beispiele

Beachte bitte, dass das i2c-bus Objekt vorher erstellt und zusammen mit der I²C-Adresse des ICs an den Konstruktor der PCF8574-Klasse übergeben werden muss.

Das folgende Beispiel ist auch zusammen mit einem TypeScript-Beispiel im Repository unter examples zu finden.

 

API

Die API verwendet Events für erkannte Änderungen an Eingängen und Promises für alle asynchronen Aktionen.

Änderungen an Eingängen können auf zwei Wege erkannt werden:

  • Unter Verwendung eines GPIO zur Beachtung des Interrupt-Signal vom PCF8574/PCF8574A. Empfohlen bei Verwendung eines Raspberry Pi oder ähnlichem.
  • Manueller Aufruf der Funktion doPoll() in regelmäßigen Abständen, um aktiv den aktuellen Status des ICs abzufragen. Dies führt zu einer höheren Last auf dem I²C-Bus.

Wenn ein Pin als Eingang definiert ist und eine Änderung an diesem Pin erkannt wird, dann wir ein input-Event ausgelöst. Diesem Event wird ein Objekt mit dem Pin (pin) und dem neuen Wert (value) mitgegeben.

Für jeden Pin kann das invertiert-Flag einzeln gesetzt werden, was einen invertierten Eingang oder Ausgang zur Folge hat. Wenn ein invertierter Eingang ein low-Level aufweist wird dies als true interpretiert und ein high-Level als false. Ein invertierter Ausgang wird ein low-Level aufweisen, wenn er auf true gesetzt wird und ein high-Level bei false.

new PCF8574(i2cBus, address, initialState)

Konstruktor für eine neue PCF8574-Instanz.

  • i2cBus – Instanz eines geöffneten i2c-bus.
  • address – Die Adresse des PCF8574/PCF8574A ICs.
  • initialState – Der Anfangszustand der Pins des ICs. Es kann eine Bitmaske (z.B. 0b00101010) verwendet werden, um jeden Pin einzeln festzulegen, oder true/false, um alle Pins auf einmal zu definieren.

Beachte bitte, dass das i2c-bus Objekt vorher erstellt und an den Konstruktor der PCF8574-Klasse übergeben werden muss.

Wenn der IC mit einem oder mehreren Eingängen verwendet wird, dann muss eine der folgenden Funktionen aufgerufen werden:

  • enableInterrupt(gpioPin), um die Interrupt-Erkennung über einen GPIO-Pin zu aktivieren, oder
  • doPoll() in regelmäßigen Abständen, um Eingangsänderungen durch manuelles Abfragen zu erkennen.

enableInterrupt(gpioPin)

Aktiviert die Interrupt-Erkennung am angegebenen GPIO-Pin.

  • gpioPin – BCM-Nummer des Pins, der für Interrupt-Erkennung des PCF8574/PCF8574A ICs genutzt wird.

disableInterrupt()

Deaktiviert die Interrupt-Erkennung. Gibt außerdem dem GPIO-Pin wieder frei.

doPoll()

Manuell Änderungen an Eingangs-Pins des PCF8574/PCF8574A abfragen.

Wenn eine Änderung erkannt wurde, dann wird das input-Event ausgelöst. Diesem Event wird ein Objekt mit dem Pin (pin) und dem neuen Wert (value) des Pins mitgegeben.

Diese Funktion muss in regelmäßigen Abständen aufgerufen werden, wenn keine Interrupt-Erkennung verwendet wird. Erfolgt ein neuer Poll bevor der letzte abgeschlossen ist, dann wird das Promise mit einem Fehler zurückgewiesen.

outputPin(pin, inverted, initialValue)

Definiert einen Pin als Ausgang.

  • pin – Die Nummer des Pins. (0 bis 7)
  • inverted – true wenn der Pin invertiert sein soll.
  • initialValue – (optional) Der Anfangswert des Pins. Wird beim Einrichten des Pins gesetzt.

inputPin(pin, inverted)

Definiert einen Pin als Eingang. Dies markiert einen Pin für die Auswertung von Signaländerungen und setzt einen high-Pegel an diesem Pin.

  • pin – Die Nummer des Pins. (0 bis 7)
  • inverted – true wenn der Pin invertiert sein soll.

Achtung: Der Pin wird immer intern auf einen high-Pegel gesetzt. (Pull-Up)

setPin(pin, value)

Setzt den Wert eines Ausgangs. Wenn kein neuer Wert angegeben wird, dann wird der Ausgang getoggelt.

  • pin – Die Nummer des Pins. (0 bis 7)
  • value – Der neue Wert für den Pin.

setAllPins(value)

Setzt den Wert aller Ausgänge.

  • value – Der neue Wert für alle Ausgangs-Pins.

getPinValue(pin)

Gibt den aktuellen Wert eines Pins zurück. Dies ist der zuletzt gespeicherte Zustand des Pins und nicht zwangsläufig der aktuell am IC anliegende Zustand. Um den aktuellen Zustand zu erhalten muss zuerst doPoll() aufgerufen werden, wenn keine Interrupts verwendet werden.

 

Lizenz

Lizenziert unter der GPL Version 2

Copyright ©2017 Peter Müller