struct Button {
const uint8_t PIN;
uint32_t numberKeyPresses;
bool pressed;
//variables to keep track of the timing of recent interrupts
unsigned long button_time;
unsigned long last_button_time;
};
struct Relay {
const uint8_t PIN;
bool isOn;
const uint8_t count;
uint8_t countdown;
};
Button buttonCoin = {19, 0, false, 0, 0};
Button button1 = {18, 0, false, 0, 0};
Button button2 = {5, 0, false, 0, 0};
Relay relay1 = {25, false, 5, 0};
Relay relay2 = {26, false, 10, 0};
const int SEC_PER_COIN = 20;
uint32_t totalTime = 0;
const bool RELAY_ON = 0; //active low
const bool RELAY_OFF = 1; //active low
#define LED_PIN 33
uint16_t onTimerCount = 0;
uint16_t onTimerCountLast = 0;
hw_timer_t *My_timer = NULL;
void IRAM_ATTR onTimer() {
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
onTimerCount++;
}
void IRAM_ATTR isrCoin() {
buttonCoin.button_time = millis();
if (buttonCoin.button_time - buttonCoin.last_button_time > 250)
{
buttonCoin.numberKeyPresses++;
buttonCoin.pressed = true;
buttonCoin.last_button_time = buttonCoin.button_time;
totalTime += SEC_PER_COIN;
}
}
void IRAM_ATTR isr1() {
button1.button_time = millis();
if (button1.button_time - button1.last_button_time > 250)
{
button1.numberKeyPresses++;
button1.pressed = true;
button1.last_button_time = button1.button_time;
relayAllOff();
if(relay1.isOn) {
digitalWrite(relay1.PIN, RELAY_OFF);
relay1.isOn = false;
}
else if(totalTime) {
digitalWrite(relay1.PIN, RELAY_ON);
relay1.isOn = true;
}
}
}
void IRAM_ATTR isr2() {
button2.button_time = millis();
if (button2.button_time - button2.last_button_time > 250)
{
button2.numberKeyPresses++;
button2.pressed = true;
button2.last_button_time = button2.button_time;
relayAllOff();
if(relay2.isOn) {
digitalWrite(relay2.PIN, RELAY_OFF);
relay2.isOn = false;
}
else if(totalTime) {
digitalWrite(relay2.PIN, RELAY_ON);
relay2.isOn = true;
}
}
}
void relayAllOff() {
if(!button1.pressed) {
digitalWrite(relay1.PIN, RELAY_OFF);
relay1.isOn = false;
}
if(!button2.pressed) {
digitalWrite(relay2.PIN, RELAY_OFF);
relay2.isOn = false;
}
}
void countdownTask() {
if(totalTime) {
if(relay1.countdown && relay1.isOn) {
relay1.countdown--;
totalTime--;
Serial.printf("totalTime = %u, relay1.countdown = %u \n", totalTime, relay1.countdown);
digitalWrite(relay1.PIN, RELAY_ON);
if(!totalTime || !relay1.countdown) {
digitalWrite(relay1.PIN, RELAY_OFF);
relay1.isOn = 0;
}
}
else if(relay2.countdown && relay2.isOn) {
relay2.countdown--;
totalTime--;
Serial.printf("totalTime = %u, relay2.countdown = %u \n", totalTime, relay2.countdown);
digitalWrite(relay2.PIN, RELAY_ON);
if(!totalTime || !relay2.countdown) {
digitalWrite(relay2.PIN, RELAY_OFF);
relay2.isOn = 0;
}
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, coin acceptor countdown timer!");
uint32_t Freq = getCpuFrequencyMhz();
Serial.print("CPU Freq = ");
Serial.print(Freq);
Serial.println(" MHz");
Freq = getXtalFrequencyMhz();
Serial.print("XTAL Freq = ");
Serial.print(Freq);
Serial.println(" MHz");
Freq = getApbFrequency();
Serial.print("APB Freq = ");
Serial.print(Freq);
Serial.println(" Hz");
pinMode(buttonCoin.PIN, INPUT_PULLUP);
pinMode(button1.PIN, INPUT_PULLUP);
pinMode(button2.PIN, INPUT_PULLUP);
pinMode(relay1.PIN, OUTPUT);
pinMode(relay2.PIN, OUTPUT);
digitalWrite(relay1.PIN, RELAY_OFF);
digitalWrite(relay2.PIN, RELAY_OFF);
attachInterrupt(buttonCoin.PIN, isrCoin, FALLING);
attachInterrupt(button1.PIN, isr1, FALLING);
attachInterrupt(button2.PIN, isr2, FALLING);
pinMode(LED_PIN, OUTPUT);
My_timer = timerBegin(0, 80, true);
timerAttachInterrupt(My_timer, &onTimer, true);
timerAlarmWrite(My_timer, 1000000, true);
timerAlarmEnable(My_timer); //Just Enable
}
unsigned long secTime = 0;
unsigned long secLastTime = 0;
unsigned long secCount = 0;
void loop() {
// put your main code here, to run repeatedly:
// delay(10); // this speeds up the simulation
// secTime = millis();
// if (secTime - secLastTime > 1000) // 1 second
// {
// secLastTime = secTime;
// Serial.printf("secCount = %u \n", secCount++);
// digitalWrite(LED_PIN, !digitalRead(LED_PIN));
// }
if(onTimerCount != onTimerCountLast) {
// Serial.printf("onTimerCount = %u, onTimerCountLast = %u \n", onTimerCount, onTimerCountLast);
countdownTask();
onTimerCountLast = onTimerCount;
}
if (buttonCoin.pressed) {
Serial.printf("Button coin has been pressed totalTime = %u \n", totalTime);
buttonCoin.pressed = false;
}
if (button1.pressed) {
Serial.printf("Button 1 pressed, totalTime = %u, coundown = %u, isOn = %u\n", totalTime, relay1.countdown, relay1.isOn);
button1.pressed = false;
if(totalTime && !relay1.countdown) {
relay1.countdown = relay1.count;
Serial.printf("relay1.countdown = %u \n", relay1.countdown);
}
}
if (button2.pressed) {
Serial.printf("Button 2 pressed, totalTime = %u, coundown = %u, isOn = %u\n", totalTime, relay2.countdown, relay2.isOn);
button2.pressed = false;
if(totalTime && !relay2.countdown) {
relay2.countdown = relay2.count;
Serial.printf("relay2.countdown = %u \n", relay2.countdown);
}
}
}