//#include <avr/wdt.h> // Libreria para usar el watchdog
#include <Wire.h> // le permite comunicarse con dispositivos por bus I2C
//(Inter-Integrated Circuit o 2 alambres).
//Usa dos lineas: SDA (datos) y SCL (reloj).
#include <LiquidCrystal_I2C.h> // Libreria lcd pero con I2C
int total_lineas = 2; // indica cuantas lineas tiene el lcd
int total_columnas = 16; // indica cuantas columnas tiene el lcd
int pin_SDA = 7; // indica el pin del SDA
int pin_SCL = 6; // indica el pin del SCL
const int pinInicio = 4; // Declaramos pin 4 como boton de inicio
const int pinReset = 5; // Declaramos pin 5 como boton de reset
const int pinSensor = 16; // Declaramos pin 16 como receptor del sensor
unsigned int minutos = 0 ; // Declaracion variable minutos
unsigned int segundos = 0 ; // Declaracion variable segundos
unsigned int milisegundos = 0 ; // Declaracion variable milisegundos
unsigned int miliDosDig = 0 ; // Esta variable es para milisegundos en 2 digitos
unsigned int tiempoActual = 0;
unsigned int tiempoEspera = 0;
unsigned int tiempoReset = 0;
int sensorAcu = 0;
// indicamos la direccion, numero de columnas, y lineas tiene el lcd:
LiquidCrystal_I2C lcd(0x27, total_columnas, total_lineas);
// Volatile indica que esta variable puede cambiar de manera inesperada
volatile bool startPress = false; // Declara variable startPress
volatile bool resetPress = false; // Declara variable resetPress
volatile bool sensorDetect = false; // Declara variable sensorDetect
// Se declaran las funciones inicio, reset y sensor
// El atributo reservado para rutinas de interrupcion IRAM_ATTR para ESP32
void IRAM_ATTR inicio()
{
startPress= true; // Se coloca la variable startPress en true
// Asi inicia una rutina en void loop
sensorDetect = false;
}
void IRAM_ATTR reset()
{
resetPress= true; // Se coloca la variable resetPress en true
} // Asi inicia una rutina en void loop
void IRAM_ATTR sensor()
{
tiempoActual = millis();
sensorDetect = true;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //Iniciamos la comunicacion serial con 115200 baud
//Serial.println("Hello, ESP32-S3!");
//wdt_disable();
Wire.begin(pin_SDA, pin_SCL); // configura los pines I2C del ESP32 - S3
lcd.init(); // Inicializa el lcd
lcd.backlight(); // Enciende el fondo del lcd
lcd.clear(); // Limpia el display
lcd.setCursor(3,0); // Posiciona el cursor display en columna 3 fila 0
lcd.print("Cronometro"); // Muestra la palabra Cronometro
lcd.setCursor(4,1); //Posiciona el cursor display en columna 4 fila 1
lcd.print("00:00:00"); // Muestra ceros en el display
pinMode(pinInicio, INPUT); // Declara el pinInicio como estrada
pinMode(pinReset, INPUT); // Declara el pinInicio como estrada
pinMode(pinSensor, INPUT); // Declara el pinInicio como estrada
// Se declaran las interrupciones como pin de entrada de interrupcion
// digitalPinToInterrupt(pin),funcion,modo)
// RISING VA DE LOW A HIGH
// FALLING VA DE HIGH A LOW
attachInterrupt(digitalPinToInterrupt(pinInicio), inicio, RISING);
attachInterrupt(digitalPinToInterrupt(pinReset), reset, RISING);
attachInterrupt(digitalPinToInterrupt(pinSensor), sensor, FALLING);
}
void loop() {
// put your main code here, to run repeatedly:
if(startPress && !resetPress) // Si startPress = TRUE y resetPress = False
{
milisegundos = millis (); // da a la variable milisegundos = millis
miliDosDig = (milisegundos % 1000)/10; // convierte la variable milisegundos a 2 digitos
lcd.setCursor(10,1); // Posicion 10,1
lcd.print(miliDosDig); // muestra milisegundos de 2 digitos
if(miliDosDig % 99 == 0) // cada que los milisegundos este en 99
{
segundos++; // Acumula en la variable segunos + 1
if(segundos == 60) // Cuando segundos sea igual a 60
{
segundos = 0; // La variable segundo valdrá 0
minutos++; // Acumula en la variable minutos + 1
}
lcd.setCursor(4,1);
if(minutos < 10)
{
lcd.print("0");
}
lcd.print(minutos);
lcd.print(":");
lcd.setCursor(7,1);
if(segundos < 10)
{
lcd.print("0");
}
lcd.print(segundos);
lcd.print(":");
}
}
if(resetPress) // cunaod se de el boton de reset
{
miliDosDig = 0; // LLev a 0 las varibales
segundos = 0;
minutos = 0;
lcd.setCursor(4,1);
lcd.print("00:00:00");
startPress = false; // se ponen en false para que se
resetPress = false;
//ESP.restart();
}
if(sensorDetect)
{
tiempoReset = millis();
tiempoEspera = tiempoReset - tiempoActual;
if(tiempoEspera >= 30000 )
{
resetPress = true;
sensorDetect = false;
}
else
{
startPress = false;
//sensorDetect = false;
}
}
//delay(10); // this speeds up the simulation
}