I'm trying to use the sketch bellow to work with my WeMos D1 mini (ESP8266 Arduino platform) together with Rotary Encoder KY-040 or MJKDZ, and it's not working for some reason, but the same sketch is working great on the Arduino Uno (with different pin assignment - 2, 3, 4).
Can someone explain to me what is the issue with the sketch?
const int PinA = 14; // Used for generating interrupts using CLK signal
const int PinB = 12; // Used for reading DT signal
const int PinSW = 13; // Used for the push button switch
int lCnt = 0; // Keep track of last rotary value
volatile int vPos = 0; // Updated by the ISR (Interrupt Service Routine)
void isr_event () {
static unsigned long lIsrTmr = 0; // Last Interrupt time
unsigned long IsrTmr = millis(); // Interrupt time
// If interrupts come faster than 5ms, assume it's a bounce and ignore
if (IsrTmr - lIsrTmr > 5) {
if (digitalRead(PinB) == LOW)
{
vPos++ ; // Could be +5 or +10
}
else {
vPos-- ; // Could be -5 or -10
}
// Restrict value from 0 to +100
vPos = min(10, max(0, vPos));
// Keep track of when we were here last (no more than every 5ms)
lIsrTmr = IsrTmr;
}
}
void setup()
{
Serial.begin(9600);
// Rotary pulses are INPUTs
pinMode(PinA, INPUT);
pinMode(PinB, INPUT);
pinMode(PinSW, INPUT_PULLUP); // Switch is floating so use the in-built PULLUP so we don't need a resistor
attachInterrupt(digitalPinToInterrupt(PinA), isr_event, LOW); // Attach the routine to service the interrupts
Serial.println(F("Starting...")); // Ready to go!
}
void loop()
{
// Is someone pressing the rotary switch?
if ((!digitalRead(PinSW))) {
vPos = 0;
while (!digitalRead(PinSW))
delay(10);
}
// If the current rotary switch position has changed then update everything
if (vPos != lCnt) {
// Write out to serial monitor the value and direction
Serial.println(vPos);
// Keep track of this new value
lCnt = vPos ;
}
}
-
1Define "not work"... That phrase can mean anything from "jittery movement" to "the whole thing exploded and burned off my eyebrows".Majenko– Majenko2018年07月17日 11:09:20 +00:00Commented Jul 17, 2018 at 11:09
-
@Majenko No, didn't exploded just not getting any output to the Serial monitor.beic– beic2018年07月17日 11:28:24 +00:00Commented Jul 17, 2018 at 11:28
-
1Not even the initial "Starting" message?Majenko– Majenko2018年07月17日 11:29:32 +00:00Commented Jul 17, 2018 at 11:29
-
Yes, I get the message "Starting..."beic– beic2018年07月17日 11:33:41 +00:00Commented Jul 17, 2018 at 11:33
-
To be sure 100%, I recompiled for Arduino Uno as we speak and tested with both Rotary Encoder type ( KY-040 and MJKDZ) and it's working as expected. But as I said, it's not outputing nothing except "Starting..." on ESP8266 platform. @Majenkobeic– beic2018年07月17日 11:39:51 +00:00Commented Jul 17, 2018 at 11:39
1 Answer 1
The ESP8266 doesn't know what a "LOW" interrupt is. You will have to change your code to use FALLING, RISING or CHANGE interrupts only.
-
Tried all of them, the FALLING gives me the best result, also I made pinMode(PinA, INPUT); and removed digitalPinToInterrupt(), and made PinB to be attachInterrupt, but the output is weird, there are duplicates and messed counts too. linkbeic– beic2018年07月17日 12:18:49 +00:00Commented Jul 17, 2018 at 12:18
-
perhaps your debounce isn't - perhaps this code can helpJaromanda X– Jaromanda X2018年07月18日 04:15:33 +00:00Commented Jul 18, 2018 at 4:15
-
@JaromandaX tried that to and it's working really bad, skipping and messing numbers upbeic– beic2018年07月19日 17:14:05 +00:00Commented Jul 19, 2018 at 17:14
Explore related questions
See similar questions with these tags.