#include <util/atomic.h>
// Token-Acceptor CH-926
const uint8_t TokenPin = 2;
uint32_t _lastimpulse; // timer für den letzten Impuls-Zeitpunkt
const uint16_t timeout = 500; // wann das Impuls-Zählen abgeschlossen sein soll (Zeit in ms)
uint8_t _impulseCount = 0; // Anzahl der Impulse
uint16_t credits = 0;
// Relais
const uint8_t RelaisPin = 3;
bool relaisaktiv = false; // true, wenn aktiviert .. duh!
const bool relaisaktivlevel = LOW; // LOW- oder HIGH-Level Relais?
uint32_t relaistimer; // timer für die Relaisaktivzeit
const uint32_t relaisdauer = 180000;// wie lange das Relais aktiviert sein soll
void setup() {
Serial.begin(9600);
pinMode(TokenPin, INPUT_PULLUP);
attachInterrupt(0, incomingImpulse, FALLING);
pinMode(RelaisPin, OUTPUT);
digitalWrite(RelaisPin, !relaisaktivlevel);
}
void loop() {
checkforCredits(); // Münzprüfer-Impulse abfragen und Geldwerte addieren
if ((credits >= 200) && (relaisaktiv == false)) { // 2EUR erreicht? UND Relais deaktiviert?
credits -= 200; // 2EUR abziehen
relaistimer = millis(); // Relaiszeit starten
relaisaktiv = true; // bei Abfrage, Relais aktivieren
}
if (relaisaktiv == true) {
if ((millis() - relaistimer) > relaisdauer) { // relaiszeit abgelaufen?
relaisaktiv = false; // bei Abfrage Relais deaktivieren
}
}
if (relaisaktiv == true) { digitalWrite(RelaisPin, relaisaktivlevel); } // Relais AN
else { digitalWrite(RelaisPin, !relaisaktivlevel); } // Relais AUS
}
void incomingImpulse() {
_impulseCount += 1;
_lastimpulse = millis();
}
void checkforCredits() {
uint32_t lastimpulse;
uint8_t impulseCount;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
impulseCount = _impulseCount;
lastimpulse = _lastimpulse;
}
if ((impulseCount > 0) && ((millis() - lastimpulse) > timeout)) {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
_impulseCount = 0;
}
switch (impulseCount) {
case 2:
// 2 Pulses = 10 cent
credits += 10;
break;
case 3:
// 3 Pulses = 20 cent
credits += 20;
break;
case 4:
// 4 Pulses = 50 cent
credits += 50;
break;
case 5:
// 5 Pulses = 100 cent
credits += 100;
break;
case 6:
// 6 Pulses = 200 cent
credits += 200;
break;
default:
// no valid impulsCount
break;
}
Serial.print("Impulse: "); Serial.println(impulseCount);
Serial.print("Credits in Cent: "); Serial.println(credits);
}
}