.. | ||
.github/workflows | ||
docs | ||
examples | ||
test | ||
.arduino-ci.yml | ||
keywords.txt | ||
library.json | ||
library.properties | ||
LICENSE | ||
PCF8574.cpp | ||
PCF8574.h | ||
README.md |
PCF8574
Arduino library for PCF8574 - 8 channel I2C IO expander
Description
Related to the PCF8575 16 channel IO expander library https://github.com/RobTillaart/PCF8575
This library gives easy control over the 8 pins of a PCF8574 and PCF8574A chip. These chips are identical in behavior although there are two distinct address ranges.
TYPE | ADDRESS-RANGE | notes |
---|---|---|
PCF8574 | 0x20 to 0x27 | same range as PCF8575 !! |
PCF8574A | 0x38 to 0x3F |
So you can connect up to 16 PCF8574 on one I2C bus, giving access to 16 x 8 = 128 IO lines. To maximize IO lines combine 8 x PCF8575 + 8 x PCF8574A giving 128 + 64 = 192 IO lines. Be sure to have a well dimensioned power supply.
The library allows to read and write both single pins or 8 pins at once. Furthermore some additional functions are implemented that are playfull but useful.
Interface
PCF8574_INITIAL_VALUE is a define that can be set compile time or before the include of "pcf8574.h" to overrule the default value used with the begin() call.
Constructor
- PCF8574(deviceAddress, TwoWire *wire = &Wire) Constructor with device address, and optional the Wire interface as parameter.
- begin(val = PCF8574_INITIAL_VALUE) set the initial value for the pins and masks.
- begin(sda, scl, val = PCF8574_INITIAL_VALUE) idem, for the ESP32 where one can choose the I2C pins What needs to be added in the future is a parameter to choose another Wire interface as some processors have multiple hardware Wire interfaces.
- isConnected() checks if the address is visable on the I2C bus
Read and Write
- read8() reads all 8 pins at once. This one does the actual reading.
- read(pin) reads a single pin; pin = 0..7
- value() returns the last read inputs again, as this information is buffered in the class this is faster than reread the pins.
- write8(value) writes all 8 pins at once. This one does the actual reading.
- write(pin, value) writes a single pin; pin = 0..7; value is HIGH(1) or LOW (0)
- valueOut() returns the last written data.
Button
- setButtonMask(mask)
- readButton8()
- readButton8(mask)
- readButton(pin)
Special
- toggle(pin) toggles a single pin
- toggleMask(mask) toggles a selection of pins, if you want to invert all pins use 0xFF (default value).
- shiftRight(n = 1) shifts output channels n pins (default 1) pins right (e.g. leds ). Fills the higher lines with zero's.
- shiftLeft(n = 1) shifts output channels n pins (default 1) pins left (e.g. leds ). Fills the lower lines with zero's.
- rotateRight(n = 1) rotates output channels to right, moving lowest line to highest line.
- rotateLeft(n = 1) rotates output channels to left, moving highest line to lowest line.
- reverse() revers the "bit pattern" of the lines, high to low and vice versa.
Misc
- lastError() returns the last error from the lib. (see .h file)
Error codes
name | value | description |
---|---|---|
PCF8574_OK | 0x00 | no error |
PCF8574_PIN_ERROR | 0x81 | pin number out of range |
PCF8574_I2C_ERROR | 0x82 | I2C communication error |
Operation
See examples