/*
Forum: https://forum.arduino.cc/t/pass-the-pulse-from-coin-acceptor-to-coffee-vending-machine-using-arduino-esp32/1178550
Wokwi: https://wokwi.com/projects/379021820365072385
*/
#define WOKWI
#ifdef WOKWI
#include "MCAEmulation.h"
#endif
constexpr byte coinPin = 2;
volatile boolean ISRFired = false;
volatile unsigned long changeTimeISR;
volatile byte pinStateISR;
unsigned long changeTime;
byte pinState;
unsigned long previousChangeTime = 0;
unsigned long countPulses = 0;
void IRAM_ATTR coinInterrupt() {
changeTimeISR = millis();
pinStateISR = digitalRead(coinPin);
ISRFired = true;
}
void setup() {
Serial.begin(115200);
Serial.println("Start");
pinMode(coinPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(coinPin), coinInterrupt, CHANGE);
}
void loop() {
#ifdef WOKWI
// Only required for testing START
MCAEmulation();
// Only required for testing END
#endif
if (newISRData()) {
if (changeTime - previousChangeTime < 500) {
if (pinState == LOW) {
Serial.print("\tHIGH Time:\t");
} else {
Serial.print(++countPulses);
Serial.print("\tLOW Time:\t");
}
Serial.println(changeTime - previousChangeTime);
}
previousChangeTime = changeTime;
}
}
boolean newISRData() {
boolean result = false;
noInterrupts();
if (ISRFired) {
changeTime = changeTimeISR;
pinState = pinStateISR;
ISRFired = false;
result = true;
} else {
result = false;
}
interrupts();
return result;
}
1
2
5
10