#include <LiquidCrystal_I2C.h>
// CONSTANTS
#define PIN_SENSOR_IN A0 // пин сенсора вход
#define PIN_SENSOR_OUT A1 // пин сенсора выход
#define PIN_BUTTON_RESET A2 // пин кнопки сброса
#define DELAY_AFTER_PRESS 1000 // задержка после нажатия кнопки
// GLOBAL VARIABLES
int inCount = 0; // вошло
int outCount = 0; // вышло
bool buttonIsUnPressed = true;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// Инициализация сенсоров
pinMode(PIN_SENSOR_IN, INPUT_PULLUP);
pinMode(PIN_SENSOR_OUT, INPUT_PULLUP);
// Инициализация кнопки сброса
pinMode(PIN_BUTTON_RESET, INPUT_PULLUP);
// Инициализация экрана
lcd.init(); // инициализация
lcd.backlight(); // включить подсветку
lcd.setCursor(0, 0); // столбец строка
lcd.print("Counter v0.1");
lcd.setCursor(0, 1); // столбец строка
lcd.print("BAILAMOS!");
delay(DELAY_AFTER_PRESS);
}
void loop() {
if(checkSensor(PIN_SENSOR_IN, 1) && buttonIsUnPressed) {
inCount++; // Добавляем в счетчик вохедших
buttonIsUnPressed = false; // Сбрасываем флаг отжатой кнопки
lcdPrintCounts(); // Выводим на экран
delay(DELAY_AFTER_PRESS);
if(!checkSensor(PIN_SENSOR_IN, 1)){ // Проверяем отжатость кнопки через 1 с
buttonIsUnPressed = true; // Включаем флаг отжатой кнопки
}
}
else if(checkSensor(PIN_SENSOR_OUT, 1) && buttonIsUnPressed){
outCount++;
buttonIsUnPressed = false; // Сбрасываем флаг отжатой кнопки
lcdPrintCounts(); // Выводим на экран
delay(DELAY_AFTER_PRESS);
if(!checkSensor(PIN_SENSOR_OUT, 1)){ // Проверяем отжатость кнопки через 1 с
buttonIsUnPressed = true; // Включаем флаг отжатой кнопки
}
}
else if(checkSensor(PIN_BUTTON_RESET, 1) && buttonIsUnPressed){
delay(3000);
if(checkSensor(PIN_BUTTON_RESET, 1) && buttonIsUnPressed){
inCount=0;
outCount=0;
buttonIsUnPressed = false; // Сбрасываем флаг отжатой кнопки
lcdPrintCounts(); // Выводим на экран
delay(DELAY_AFTER_PRESS);
if(!checkSensor(PIN_BUTTON_RESET, 1)) // Проверяем отжатость кнопки через 1 с
buttonIsUnPressed = true; // Включаем флаг отжатой кнопки
}
}
delay(10);
if(buttonIsUnPressed == false){
// Проверяем отжатость всех кнопок
if(!checkSensor(PIN_SENSOR_IN, 1)){
if(!checkSensor(PIN_SENSOR_OUT, 1)){
if(!checkSensor(PIN_BUTTON_RESET, 1)){
buttonIsUnPressed = true; // Включаем флаг отжатой кнопки
}
}
}
delay(100);
}
}
bool checkSensor(uint8_t pinSensor, bool isInvert){
uint8_t count = 0;
for(uint8_t i=0; i<3;i++){
if((digitalRead(pinSensor) == HIGH)^isInvert)
count++;
delay(10);
}
if(count > 2)
return true;
else
return false;
}
// Очистка экрана
void lcdClean(){
lcd.setCursor(0, 0);
lcd.print(" ");
delay(10);
lcd.setCursor(0, 1);
lcd.print(" ");
delay(10);
}
// Вывод счетчиков на экран
void lcdPrintCounts(){
lcdClean();
delay(300);
lcd.setCursor(0, 0);
lcd.print("NOW: " + String(inCount - outCount));
delay(10);
lcd.setCursor(0, 1);
lcd.print("ENT:" + String(inCount) + " EX:" + String(outCount));
delay(10);
}