#define gre 4
#define yel 3
#define red 2
#define blu 5
#define buz 10
#define b50c 8
#define b1e 7
#define b2e 6
#define bdis 9
#define bcan 11
enum State {
IDLE,
PROCESSING,
DISPENSING,
CHANG,
ERROR
};
float credit = 0;
float price = 1.5;
State curState = IDLE;
bool disState = true;
unsigned long stateStartTime = 0;
void setLeds(bool b, bool g, bool y, bool r){
digitalWrite(blu, b);
digitalWrite(gre, g);
digitalWrite(yel, y);
digitalWrite(red, r);
}
bool bHandler(int pin){
if(digitalRead(pin) == LOW){
delay(200);
return true;
}
else{
return false;
}
}
void beep(int duration) {
tone(buz, 1000);
delay(duration);
noTone(buz);
}
void coinHandler(){
if (bHandler(b50c)) {
credit += 0.5;
beep(500);
Serial.print("Credit: ");
Serial.println(credit);
}
if (bHandler(b1e)) {
credit += 1.0;
beep(500);
Serial.print("Credit: ");
Serial.println(credit);
}
if (bHandler(b2e)) {
credit += 2.0;
beep(500);
Serial.print("Credit: ");
Serial.println(credit);
}
}
void changeFunction(){
float change = credit - price;
Serial.print("Returned ");
Serial.println(change);
for (int i = 0; i < 3; i++) {
digitalWrite(blu, HIGH);
tone(buz, 1000);
delay(300);
digitalWrite(blu, LOW);
noTone(buz);
delay(300);
}
credit = 0;
Serial.println("Credit reset to 0");
}
bool errorBlink(){
for(int i = 0; i < 3; i++){
digitalWrite(red, HIGH);
delay(200);
digitalWrite(red,LOW);
delay(200);
}
}
void cancel(){
if(bHandler(bcan)){
if(curState == IDLE || (curState == PROCESSING && disState)){
float change = credit;
Serial.print("Returned ");
Serial.println(change);
for (int i = 0; i < 3; i++) {
digitalWrite(blu, HIGH);
tone(buz, 1000);
delay(300);
digitalWrite(blu, LOW);
noTone(buz);
delay(300);
}
credit = 0;
Serial.println("Credit reset to 0");
curState = IDLE;
}
}
}
void setup() {
// put your setup code here, to run once:
pinMode(gre, OUTPUT);
pinMode(yel, OUTPUT);
pinMode(red, OUTPUT);
pinMode(blu, OUTPUT);
pinMode(buz, OUTPUT);
pinMode(b50c, INPUT_PULLUP);
pinMode(b1e, INPUT_PULLUP);
pinMode(b2e, INPUT_PULLUP);
pinMode(bdis, INPUT_PULLUP);
pinMode(bcan, INPUT_PULLUP);
Serial.begin(9600);
setLeds(0,1,0,0);
Serial.print("Credit: ");
Serial.println(credit);
}
void loop() {
// put your main code here, to run repeatedly:
coinHandler();
cancel();
switch(curState){
case IDLE:
setLeds(0,1,0,0);
if (bHandler(bdis)) {
if (credit >= price) {
stateStartTime = millis();
curState = PROCESSING;
} else {
curState = ERROR;
}
}
break;
case PROCESSING:
setLeds(0,0,1,0);
if((millis() - stateStartTime) >= 1000){
if(disState){
curState = DISPENSING;
disState = false;
break;
}
else{
curState = IDLE;
disState = true;
Serial.print("Credit: ");
Serial.println(credit);
break;
}
}
break;
case DISPENSING:
setLeds(0,0,0,1);
tone(buz, 1000);
delay(500);
noTone(buz);
delay(2000);
case CHANG:
setLeds(1,0,0,0);
changeFunction();
stateStartTime = millis();
curState = PROCESSING;
break;
case ERROR:
setLeds(0,0,0,1);
errorBlink();
curState = IDLE;
break;
}
}