diff --git a/solarium/solarium.ino b/solarium/solarium.ino index 253a462..326ce71 100644 --- a/solarium/solarium.ino +++ b/solarium/solarium.ino @@ -1,13 +1,139 @@ +#include + /* Управление соляриями */ +#include // Подключаем библиотеку для работы с шиной I2C +#include // Подключаем библиотеку для работы с LCD +#include + +// ===============================задаем константы ========================================================================= +const byte moneyPin = 2; // номер пина, к которому подключён купюроприемник, DB2 +const byte inhibitPin = 4; // +Inhibit (зеленый) на купюроприемник, DB4 +const byte buttonPin_Start = 15; // номер входа, подключенный к кнопке "Старт", А0 +const byte buttonPin_Service = 13; // номер входа, подключенный к кнопке "Сервис", А1 +const byte LEDPin = 14; // номер выхода светодиода кнопки Старт, DB13 +//const byte RelayPin = 17; // номер выхода, подключенный к реле, А3 +const byte Device_SerNum = 1; // серийный номер устройства +const char Device_Ver[] = "0.0"; // версия ПО устройства +const char Device_Date[] = "09/09/24"; // дата производства устройства +const unsigned long block = 500000; // блокировка устройства при превышении этой суммы денег + +boolean lastReading = false; // флаг предыдущего состояния кнопки +boolean buttonSingle = false; // флаг состояния "краткое нажатие" +boolean buttonDouble = false; // флаг состояния "двойное нажатие" +boolean buttonHold = false; // флаг состояния "долгое нажатие" +unsigned long onTime = 0; // переменная обработки временного интервала +unsigned long lastSwitchTime = 0; // переменная времени предыдущего переключения состояния +unsigned long ledStartTime = 0; // переменная-флаг времени начала включения LED + +const int bounceTime = 10; // задержка для подавления дребезга +const int holdTime = 1000; // время, в течение которого нажатие можно считать удержанием кнопки +const int doubleTime = 500; // время, в течение которого нажатия можно считать двойным + +// ============================== Описываем свой символ "Рубль" ======================================================================== +// Просто "рисуем" символ единицами. Единицы при выводе на экран окажутся закрашенными точками, нули - не закрашенными +byte rubl[8] = { + 0b00000, + 0b01110, + 0b01001, + 0b01001, + 0b01110, + 0b01000, + 0b11110, + 0b01000, +}; + +LiquidCrystal_I2C lcd(0x27, 16, 2); // устанавливаем адрес 0x27, и дисплей 16 символов 2 строки void setup() { - // put your setup code here, to run once: + Serial.begin(115200); + lcd.init(); // инициализация LCD + lcd.backlight(); // включаем подсветку + lcd.createChar(0, rubl); // создаем символ и записываем его в память LCD по 0 адресу + + pinMode(inhibitPin, OUTPUT); // устанавливает режим работы - выход + pinMode(moneyPin, INPUT_PULLUP); // устанавливает режим работы - вход, подтягиваем к +5В через встроенный подтягивающий резистор (на всякий случай) + pinMode(LEDPin, OUTPUT); // инициализируем пин, подключенный к светодиоду, как выход + pinMode(buttonPin_Service, INPUT_PULLUP); // инициализируем пин, подключенный к кнопке, как вход + pinMode(buttonPin_Start, INPUT_PULLUP); // инициализируем пин, подключенный к кнопке, как вход + + digitalWrite(LEDPin,LOW); // изначально светодиод погашен + digitalWrite(inhibitPin, LOW); // изначально разрешаем прием купюр +} + +void read_buttons(byte x) +{ + boolean reading = !digitalRead(x); + + if (reading && !lastReading) // проверка первичного нажатия + { + onTime = millis(); + } + if (reading && lastReading) // проверка удержания + { + if ((millis() - onTime) > holdTime) + { + buttonHold = true; + //digitalWrite(LEDPin, HIGH); // при удержании кнопки загорается светодиод + digitalWrite(LEDPin, !digitalRead(LEDPin)); // при удержании кнопки мигает светодиод + } + } + if (!reading && lastReading) // проверка отпускания кнопки + { + if (((millis() - onTime) > bounceTime) && !buttonHold) + { + if ((millis() - lastSwitchTime) >= doubleTime) + { + lastSwitchTime = millis(); + buttonSingle = true; + } + else + { + lastSwitchTime = millis(); + buttonDouble = true; + buttonSingle = false; + isButtonDouble(); + buttonDouble = false; // сброс состояния после выполнения команды + } + } + if (buttonHold) + { + buttonDouble = false; + isButtonHold(); + buttonHold = false; // сброс состояния после выполнения команды + } + } + lastReading = reading; + if (buttonSingle && (millis() - lastSwitchTime) > doubleTime) + { + buttonDouble = false; + isButtonSingle(); + buttonSingle = false; // сброс состояния после выполнения команды + } +} + +// ============================== удержание кнопки =============================================================================== +void isButtonHold() +{ + Serial.println( F("isButtonHold") ); +} + +// ============================== одиночное нажатие кнопки ======================================================================== +void isButtonSingle() +{ + Serial.println( F("isButtonSingle") ); +} + +// ================================ двойное нажатие кнопки ======================================================================== +void isButtonDouble() +{ + Serial.println( F("isButtonDouble") ); } void loop() { - // put your main code here, to run repeatedly: + + read_buttons(buttonPin_Service); }