mirror of
https://github.com/xreef/PCF8574_library.git
synced 2024-08-30 18:12:18 +00:00
97 lines
2.1 KiB
C++
97 lines
2.1 KiB
C++
/*
|
|
* PCF8574 GPIO Port Expand
|
|
* https://www.mischianti.org/2020/03/13/pcf8574-i2c-digital-i-o-expander-rotary-encoder-part-2/
|
|
*
|
|
* PCF8574 ----- WeMos
|
|
* A0 ----- GRD
|
|
* A1 ----- GRD
|
|
* A2 ----- GRD
|
|
* VSS ----- GRD
|
|
* VDD ----- 5V/3.3V
|
|
* SDA ----- D1(PullUp)
|
|
* SCL ----- D2(PullUp)
|
|
* INT ----- INT(PullUp)
|
|
*
|
|
* P0 ----------------- ENCODER PIN A
|
|
* P1 ----------------- ENCODER PIN B
|
|
* P2 ----------------- ENCODER BUTTON
|
|
*
|
|
*/
|
|
#include "Arduino.h"
|
|
#include "PCF8574.h"
|
|
|
|
int encoderPinA = P0;
|
|
int encoderPinB = P1;
|
|
|
|
#define INTERRUPTED_PIN D7
|
|
|
|
void ICACHE_RAM_ATTR updateEncoder();
|
|
|
|
// initialize library
|
|
PCF8574 pcf8574(0x38, INTERRUPTED_PIN, updateEncoder);
|
|
|
|
volatile long encoderValue = 0;
|
|
uint8_t encoderButtonVal = HIGH;
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin (9600);
|
|
delay(500);
|
|
|
|
// encoder pins
|
|
pcf8574.pinMode(encoderPinA, INPUT_PULLUP);
|
|
pcf8574.pinMode(encoderPinB, INPUT_PULLUP);
|
|
// encoder button
|
|
pcf8574.pinMode(P2, INPUT_PULLUP);
|
|
|
|
// Set low latency with this method or uncomment LOW_LATENCY define in the library
|
|
// Needed for encoder
|
|
pcf8574.setLatency(0);
|
|
|
|
// Start library
|
|
Serial.print("Init pcf8574...");
|
|
if (pcf8574.begin()){
|
|
Serial.println("OK");
|
|
}else{
|
|
Serial.println("KO");
|
|
}
|
|
}
|
|
|
|
bool changed = false;
|
|
|
|
void loop()
|
|
{
|
|
if (changed){
|
|
Serial.print("ENCODER --> ");
|
|
Serial.print(encoderValue);
|
|
Serial.print(" - BUTTON --> ");
|
|
Serial.println(encoderButtonVal?"HIGH":"LOW");
|
|
changed = false;
|
|
}
|
|
}
|
|
|
|
uint8_t encoderPinALast = LOW;
|
|
uint8_t valPrecEncoderButton = LOW;
|
|
|
|
void updateEncoder(){
|
|
// Encoder management
|
|
uint8_t n = pcf8574.digitalRead(encoderPinA);
|
|
if ((encoderPinALast == LOW) && (n == HIGH)) {
|
|
if (pcf8574.digitalRead(encoderPinB) == LOW) {
|
|
encoderValue--;
|
|
changed = true; // Chnged the value
|
|
} else {
|
|
encoderValue++;
|
|
changed = true; // Chnged the value
|
|
}
|
|
}
|
|
encoderPinALast = n;
|
|
|
|
// Button management
|
|
encoderButtonVal = pcf8574.digitalRead(P2);
|
|
if (encoderButtonVal!=valPrecEncoderButton){
|
|
changed = true; // Chnged the value of button
|
|
valPrecEncoderButton = encoderButtonVal;
|
|
}
|
|
}
|