//       (o\---/o)           
//        ( , , )
// ___,--.(_(Y)_),--.____
//|   "--"       "--"    |
//| Don't Worry Be Happy |
//| HECTOR E. VILLARREAL |
//|         2023         |
//|______________________|
//       )   |   (
//      (___,'.___) 
//CONTROL DE Aforo con pulsadores
//---------------------------------------------------------------------------------------------------
//Librerias
#include <LiquidCrystal.h>
//--------------------------------------------------------------
//Declaración de los PULSADORES
//--------------------------------------------------------------
int entrada=0;                   // variable entrada
int salida=0;                    // variable salida
int entradag=0;                   // variable entrada a googlesheets
int salidag=0;                    // variable salida s goglesheets
byte Pe = 2;     //Pulsador entrada
byte Ps = 3;     //Pulsador salida
long pmpreviousMillis = 0;
int r = 300;
//--------------------------------------------------------------
//Declaración de los LCD, led interno y BUZZER
//--------------------------------------------------------------
//Set LCD
LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);  // Corresponde a (RS, EN, D4, D5, D6, D7)
int buzzer = 7;
int led = 4;
const int ledPin = LED_BUILTIN; // led builtin
int ledState = LOW;         // ledState used to set the LED
int ledState1 = LOW;         // ledState used to set the LED
long previousMillis = 0;
long previousMillis1 = 0;
long interval = 500; // tiempo que queremos destelle el led
long interval1 = 3000; // tiempo antes de comunicar a googlesheets
//--------------------------------------------------------------
//INICIALIZACION y CONFIGURACION del sistema
//--------------------------------------------------------------
void setup() {
  // inicializamos el puerto serie:
  Serial.begin(9600);
  //Configura los 2 Pines de Pulsadores como ENTRADAS digitales
    pinMode(2,INPUT);
    pinMode(3,INPUT);
  //--------------------------------------------------------------
  //Configura los Pines como SALIDAS
  pinMode(buzzer, OUTPUT);   //Configura la salida de BUZZER
  digitalWrite(LED_BUILTIN,LOW);  //Coloca la salida de LED en LOW
  digitalWrite(buzzer, LOW);
  //--------------------------------------------------------------
  //Configura primera linea LCD
  lcd.begin(16, 2);   // Tipo de LCD
  lcd.setCursor(0, 0); // Selecciono la Primera linea
  lcd.print("Contr. Aforo 1.0"); // escribimos en la primera linea
} 
//--------------------------------------------------------------
//Programa PRINCIPAL LOOP
//--------------------------------------------------------------
void loop() {
  digitalWrite(buzzer, LOW);
  lcd.setCursor(0, 1); 
  lcd.print("IN=");
  lcd.print(entrada);  
  lcd.print(" OUT=");
  lcd.print(salida);
  //--------------------------------------------------------------
  // Ajuste de destello del led LED_BUILTIN
  //--------------------------------------------------------------  
  unsigned long currentMillis1 = millis(); 
  if (currentMillis1 - previousMillis1 >= interval1) {
    // save the last time you blinked the LED
    previousMillis1 = currentMillis1;
    Serial.print("Entrada= ");
    Serial.println(entradag);
    Serial.print("Salida= ");
    Serial.println(salidag);
    delay(r); //Anti-Rebote
    salidag = 0;
    entradag = 0;
  }
  unsigned long currentMillis = millis(); 
  if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED
      previousMillis = currentMillis;
    if (ledState == LOW) {
      ledState = HIGH;
    } 
    else {
      ledState = LOW;
    }
    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
  }
  //--------------------------------------------------------------
  // Pulsador entrada
  //--------------------------------------------------------------
  if(digitalRead(Pe)) {  // Pregunta si pulsador horario fue presionado
    delay(r); //Anti-Rebote
    digitalWrite(buzzer, HIGH);
    entrada=entrada + 1; //Contador general
    entradag = entradag + 1;  //Contador para envío
  }
  //--------------------------------------------------------------
  // Pulsador salida
  //--------------------------------------------------------------
  if(digitalRead(Ps)) {  // Pregunta si pulsador Antihorario fue presionado
    delay(r); //Anti-Rebote
    digitalWrite(buzzer, HIGH);
    salida=salida + 1; //Contador general
    salidag = salidag + 1; //Contador para envío
  }
  //--------------------------------------------------------------
}
//--------------------------------------------------------------
// FIN del programa
//--------------------------------------------------------------