/*
This sketch assumes that coin 1, will return 1 pulse, coin 2 will return 2 pulses, and so on.
Coin values:
1 = 0.5
2 = 1
3 = 2
4 = 10
*/
const byte coinValues[4] = {
5, 10, 20, 100}; //Coin values goes into this array
#define pulseTimeout 200 //How many milliseconds there are from the last impulse to the coin is determined (default 275)
#define actionTimeout 60000 //How many milliseconds before stored credit is reset (default 60000)
unsigned long lastAction = 0; //When last action was made
unsigned long lastPulse = 0; //When last pulse was send
int pulseCount = 0; //How many pulses we got
int currentCredit; //The current credit
void showCredit()
{
int credit = currentCredit/10;
int left = currentCredit % (currentCredit/10);
Serial.print("Current credit: ");
Serial.print(credit, DEC);
Serial.print(".");
Serial.print(left, DEC);
Serial.println("0");
}
void setup()
{
Serial.begin(115200);
attachInterrupt(0, acceptorCount, RISING); //Digital interrupt pin 1
attachInterrupt(1, acceptorPulse, RISING); //Digital interrupt pin 2
Serial.println("Coin Acceptor ready");
pulseCount = 0;
pinMode(13, OUTPUT);
}
unsigned long tempAction;
unsigned long tempPulse;
void loop()
{
tempAction = lastAction;
tempPulse = lastPulse;
if (millis() - lastPulse >= pulseTimeout && pulseCount > 0 || pulseCount >= 4)
{
if (tempAction != lastAction || tempPulse != lastPulse) return; //Check if interrupt has fired since loop started, wait for next cycle if it has
tone(12, 1800, 150);
currentCredit += coinValues[pulseCount-1];
showCredit();
pulseCount = 0;
}
if ((millis() - lastAction >= actionTimeout) && (lastAction != 0) && (currentCredit > 0) && (pulseCount == 0))
{
if (tempAction != lastAction || tempPulse != lastPulse) return; //Check if interrupt has fired since loop started, wait for next cycle if it has
currentCredit = 0;
lastAction = 0;
Serial.println("\n*** TIMEOUT! Credit reset. ***");
showCredit();
}
}
void acceptorPulse()
{
lastAction = millis();
lastPulse = millis();
pulseCount++;
}
void acceptorCount()
{
digitalWrite(13, digitalRead(13));
}