* This class is designed to allow user to use PCF8574 gpio expander like any standard arduino pins.\n
* This class provided standards arduino functions like pinMode, digitalWrite, digitalRead, ...\n
* This new version is fully optimized and documented.\n
* \n
* Please report bug to <skywodd at gmail.com>
*
* @section license_sec License
* This program is free software: you can redistribute it and/or modify\n
* it under the terms of the GNU General Public License as published by\n
* the Free Software Foundation, either version 3 of the License, or\n
* (at your option) any later version.\n
* \n
* This program is distributed in the hope that it will be useful,\n
* but WITHOUT ANY WARRANTY; without even the implied warranty of\n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n
* GNU General Public License for more details.\n
* \n
* You should have received a copy of the GNU General Public License\n
* along with this program. If not, see <http://www.gnu.org/licenses/>.\n
*
* @section other_sec Others notes and compatibility warning
* Compatible with arduino 1.0.x and >=0023\n
* Retro-compatible with the previous library version
*/
#ifndef PCF8574_H
#define PCF8574_H
/** Comment this define to disable interrupt support */
//#ifndef PCF8574_INTERRUPT_SUPPORT
//#define PCF8574_INTERRUPT_SUPPORT
//#include "PCint.h"
//#include "pins_arduino.h"
//#endif
/* Retro-compatibility with arduino 0023 and previous version */
#if ARDUINO >= 100
#include "Arduino.h"
#define I2CWRITE(x) Wire.write(x)
#define I2CREAD() Wire.read()
#else
#include "WProgram.h"
#define I2CWRITE(x) Wire.send(x)
#define I2CREAD() Wire.receive()
#define INPUT_PULLUP 2
#endif
/**
* @brief PCF8574 Arduino class
*/
classPCF8574{
public:
/**
* Create a new PCF8574 instance
*/
PCF8574();
/**
* Start the I2C controller and store the PCF8574 chip address
*/
voidbegin(uint8_taddress=0x21);
/**
* Set the direction of a pin (OUTPUT, INPUT or INPUT_PULLUP)
*
* @param pin The pin to set
* @param mode The new mode of the pin
* @remarks INPUT_PULLUP does physicaly the same thing as INPUT (no software pull-up resistors available) but is REQUIRED if you use external pull-up resistor
*/
voidpinMode(uint8_tpin,uint8_tmode);
/**
* Set the state of a pin (HIGH or LOW)
*
* @param pin The pin to set
* @param value The new state of the pin
* @remarks Software pull-up resistors are not available on the PCF8574
*/
voiddigitalWrite(uint8_tpin,uint8_tvalue);
/**
* Read the state of a pin
*
* @param pin The pin to read back
* @return
*/
uint8_tdigitalRead(uint8_tpin);
/**
* Set the state of all pins in one go
*
* @param value The new value of all pins (1 bit = 1 pin, '1' = HIGH, '0' = LOW)
*/
voidwrite(uint8_tvalue);
/**
* Read the state of all pins in one go
*
* @return The current value of all pins (1 bit = 1 pin, '1' = HIGH, '0' = LOW)
*/
uint8_tread();
/**
* Exactly like write(0x00), set all pins to LOW
*/
voidclear();
/**
* Exactly like write(0xFF), set all pins to HIGH
*/
voidset();
/**
* Toggle the state of a pin
*/
voidtoggle(uint8_tpin);
/**
* Mark a pin as "pulled up"
*
* @warning DO NOTHING - FOR RETRO COMPATIBILITY PURPOSE ONLY
* @deprecated
* @param pin Pin the mark as "pulled up"
*/
voidpullUp(uint8_tpin);
/**
* Mark a pin as "pulled down"
*
* @warning DO NOTHING - FOR RETRO COMPATIBILITY PURPOSE ONLY
* @deprecated
* @param pin Pin the mark as "pulled down"
*/
voidpullDown(uint8_tpin);
/**
* Make a pin blink N times for T duration
*
* @warning Blocking function, not recommended for new code
* @deprecated
* @param pin The pin to blink
* @param count The number of ON/OFF couples to execute
* @param duration The duration of the whole blink action in milliseconds
* @remarks Call this routine from your wrapping routine to detect and process interrupts (if any) of this PCF8574 instance.
*/
voidcheckForInterrupt();
/**
* Attach a function to an interrupt event of a pin of the PCF8574
*
* @param pin The pin to attach the interrupt event on
* @param userFunc The callback function to call when the interrupt event is triggered
* @param mode The interrupt mode to check for, only interrupts events coming from the specified pin and with the specified mode will call the callback function.
* @remarks 1 PCF8574 pin = 1 interrupt, multiple interrupts on the same pin is not supported