| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | /* * 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 D7void ICACHE_RAM_ATTR updateEncoder();// initialize libraryPCF8574 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;	}}
 |