#include
#define _LCD_TYPE 2
#include
#include
void count_pulse(); // Для счета имупульсо от монетоприемника CH-926
int detectButton(); //Детектирует нажатую кнопку на LCD Keypad Shield
void display_print();
LCD_1602_RUS lcd(8, 9, 4, 5, 6, 7); //Для LCD Keypad Shield
#define BTN_RIGHT 11
#define BTN_LEFT 12
#define BTN_UP 13 //Для увеличения суммы руками, если монета не пройдет
#define BTN_DOWN 14 //Для вычитания суммы руками, если что-то взяли из копилки
#define BTN_SELECT 15 //Кнопка сброса суммы, если копилка разорена
#define BTN_NONE 16
#define MONEY_PIN 3 //Номер пина, подключенного к монетоприемнику CH-926
#define TIME_ALL_PULSE 500// макс. время приема монеты
int pulse = 0; //Количество импульсов, полученных от монетоприемника
unsigned long timeCount = 0; //Для сохранения времени импульса
unsigned long btn_Up_Timer = 0;
unsigned long btn_Down_Timer = 0;
unsigned long btn_select_press = 0;
unsigned long display_timer = 0;
bool display_flag = 0;
int nominals[4] = {1, 2, 5, 10}; // Массив хранит номиналы наших монет
unsigned long sum; // Сумма всех денег в копилке
int keyAnalog = analogRead(A0); //Для определения какая кнопка была нажата Для LCD Keypad Shield
void setup()
{
EEPROM.get(0,sum);
lcd.begin(16, 2);
display_print();
pinMode(MONEY_PIN, INPUT_PULLUP);
attachInterrupt(1, count_pulse, FALLING);
pulse = 0;
}
void loop()
{
int button = detectButton();
switch (button) {
case BTN_UP:
if (millis() - btn_Up_Timer > 50) { //Антидребезг кнопки
sum ++;
EEPROM.put(0,sum);
display_flag = true;
}
btn_Up_Timer = millis();
break;
case BTN_DOWN:
if (millis() - btn_Down_Timer > 50) { //Антидребезг кнопки
sum --;
EEPROM.put(0,sum);
display_flag = true;
}
btn_Down_Timer = millis();
break;
case BTN_SELECT:
if (btn_select_press > 29999) { //Проверка на удержание
sum = 0;
EEPROM.put(0,sum);
lcd.clear();
display_print();
btn_select_press = 0;
display_flag = true;
}
btn_select_press++;
break;
default:
btn_select_press = 0;
break;
}
if (display_flag) { //Обновляем Дисплей
display_print();
display_flag = false;
}
// Если прошло максимальное время для приема монеты
if (pulse > 0 && millis() - timeCount > TIME_ALL_PULSE)
{
sum += nominals[pulse - 1];
EEPROM.put(0,sum);
pulse = 0;
display_flag = true;
}
}
//Обработка прерывания монетоприемника. Получаем количество импульсов
void count_pulse()
{
detachInterrupt(1);
delay(10);
if (!digitalRead(MONEY_PIN))
{
pulse++;
if (pulse == 1)
timeCount = millis();
}
attachInterrupt(1,count_pulse,FALLING);
}
int detectButton() {
int keyAnalog = analogRead(A0);
if (keyAnalog < 100) {
// Значение меньше 100 – нажата кнопка right
return BTN_RIGHT;
} else if (keyAnalog < 200) {
// Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
return BTN_UP;
} else if (keyAnalog < 400) {
// Значение больше 200, но меньше 400 – нажата кнопка DOWN
return BTN_DOWN;
} else if (keyAnalog < 600) {
// Значение больше 400, но меньше 600 – нажата кнопка LEFT
return BTN_LEFT;
} else if (keyAnalog < 800) {
// Значение больше 600, но меньше 800 – нажата кнопка SELECT
return BTN_SELECT;
} else {
// Все остальные значения (до 1023) будут означать, что нажатий не было
return BTN_NONE;
}
}
void display_print() {
lcd.setCursor(0, 0);
lcd.print("На шаурму");
lcd.setCursor(5, 1);
lcd.print(String(sum)+" руб.");
pulse = 0;
}