boton de interrupcion — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by ingguel85.

Components

Sketch code

//ESTE ES EL PROGRAMA PRINCIPAL QUE ESTA FUNCIONANDO//

#include <Wire.h> 
//#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  //



// Definición del pin de interrupción pin23
const int SDA_PIN =32;
const int SCL_PIN =33;
const int pinMonedero = 14;
const int senHopper = 15; 
bool estadoBoton = 0;
int cantidad = 0,on;
int i=0,j=0,k=0;
int valor, selector1, selector2, selector3, selector4, sensor;

volatile int contadorPulsos = 0;
volatile int contadorHopper =0;
unsigned long tiempoUltimoPulso = 0;
unsigned long timeUltimoPulso = 0;
const unsigned long tiempoEspera = 400; // Tiempo en milisegundos para consolidar los pulsos de una moneda
int ValorT=0, ValorTH=0;
int estadoActual = 0;    // Estado actual del sensor
int estadoAnterior = 1;  // Estado previo del sensor

void Inicio() {

  lcd.setCursor(0, 0);
  lcd.println("       H-A-L      ");
  lcd.setCursor(0, 1);
  lcd.println("     BIENVENIDO    "); 
   lcd.setCursor(0, 2);
  lcd.println(" INSERTA EL IMPORTE "); 
   lcd.setCursor(0, 3);
  lcd.println("     CORRECTO      "); 
  ValorTH=0;
  
 
   
  delay(10);
 //lcd.clear();

}

void setup() {

   // Inicializa el bus I2C con los pines personalizados
  Wire.begin(SDA_PIN, SCL_PIN);
 
  // Inicializa la pantalla LCD
  lcd.init();
  lcd.backlight();

 // Configura el pin con resistencia Pull-Up interna si tu circuito lo requiere
  pinMode(pinMonedero, INPUT_PULLUP); 
 pinMode(senHopper, INPUT_PULLUP); 
  // Registra la interrupción en el flanco de bajada (FALLING)
  attachInterrupt(digitalPinToInterrupt(pinMonedero), contarPulso, FALLING);

  pinMode(34, INPUT_PULLUP);
  pinMode(35, INPUT_PULLUP);
  pinMode(36, INPUT_PULLUP);
  pinMode(39, INPUT_PULLUP);
   pinMode(01, OUTPUT);
   pinMode(02, OUTPUT);
   pinMode(03, OUTPUT);
   pinMode(04, OUTPUT);
      //RELEVADOR
  digitalWrite(01, LOW);
   digitalWrite(02, LOW);
    digitalWrite(03, LOW);
 

}

void loop() {



//SELECTORES
  selector1 = digitalRead(34);
  selector2 = digitalRead(35);
  selector3 = digitalRead(36);
  selector4 = digitalRead(39);
estadoActual = digitalRead(senHopper); // Lee el sensor
   //RELEVADOR
  //digitalWrite(32, HIGH);
   //digitalWrite(33, HIGH);
    //digitalWrite(27, HIGH);
  
 
  // Si ha pasado suficiente tiempo desde el último pulso, procesamos la moneda
  if (contadorPulsos > 0 && (millis() - tiempoUltimoPulso) > tiempoEspera) {
    
    // Deshabilitamos interrupciones momentáneamente para leer la variable de forma segura
    noInterrupts();
    int pulsosDetectados = contadorPulsos;
    contadorPulsos = 0;
    interrupts();

    lcd.setCursor(0, 0);
    lcd.print("Moneda ingresada");
    lcd.setCursor(17, 0);
    lcd.println(pulsosDetectados);
    
    // Aquí defines el valor real según los pulsos configurados en tu monedero
    // Ejemplo ficticio: 1 pulso = $1, 2 pulsos = $2, 5 pulsos = $5, etc.
    float creditoRecibido = calcularCredito(pulsosDetectados);
    ValorT=ValorT+creditoRecibido;
   ValorTH=ValorTH+creditoRe