Necesito ayuda en como poder cambiar los botones por un teclado matricial y hacer que cuando inicie el tempo active un motor a pasos conectado a un l298n y al terminar el tiempo lo regrese.
El codigo es un temporizador y con botones puedes poner el tiempo que quieras
Este es el codigo:
#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte horas, minutos, segundos;
byte pinBuz = 13;
byte pinSta = A1;
byte pinHor = A5;
byte pinMin = A4;
byte pinSeg = A3;
boolean SSS; //start Stop State
byte seguro;
unsigned long lastMillis;
byte frownie[8] = {
0b00000,
0b00000,
0b01010,
0b00000,
0b00000,
0b00000,
0b01110,
0b10001
};
byte armsDown[8] = {
0b00100,
0b01010,
0b00100,
0b00100,
0b01110,
0b10101,
0b00100,
0b01010
};
byte armsUp[8] = {
0b00100,
0b01010,
0b00100,
0b10101,
0b01110,
0b00100,
0b00100,
0b01010
};
void setup() {
lcd.createChar(2, frownie);
lcd.createChar(3, armsDown);
lcd.createChar(4, armsUp);
pinMode(pinBuz, OUTPUT);
pinMode(pinSta, INPUT_PULLUP);
pinMode(pinHor, INPUT_PULLUP);
pinMode(pinMin, INPUT_PULLUP);
pinMode(pinSeg, INPUT_PULLUP);
startLCD();
}
void loop() {
do {
manage_SSS();
//--------RUTINA ESCOGER EL TIEMPO EN PANTALLA.
lcd.home();
lcd.print("Elige el tiempo");
printTime();
//--------RUTINA BOTONES DE TIEMPO.
if (digitalRead(pinHor) == LOW)
{ delay(200);
horas++;
if (horas > 99) horas = 0;
}
if (digitalRead(pinMin) == LOW)
{ delay(200);
minutos++;
if (minutos > 60) minutos = 0;
}
if (digitalRead(pinSeg) == LOW)
{ delay(200);
segundos++;
if (segundos > 60) segundos = 0;
}
}
while (!SSS);
while (SSS) //<----inicia whie // SSS = TRUE
{ manage_SSS();//<----función que activa y libera el ciclo do y el ciclo while
lcd.home();
lcd.print("Tiempo restante");
// printTime();
//A PARTIR DE AQUÍ INICIA EL CALCULO DEL TIEMPO RESTANTE, CADA 1000 MS
if (millis() - lastMillis >= 1000)
{
lastMillis = millis();
if (segundos > 0 ) segundos--;
if (segundos == 0 && minutos > 0)
{
minutos--;
segundos = 59;
}
if (minutos == 0 && horas > 0)
{
horas--;
minutos = 59;
}
} //TERMINA EL CALCULO DEL TIEMPO RESTANTE
//EMPIEZA LA RUTINA "TIEMPO FINALIZADO"
if (horas == 0 && minutos == 0 && segundos == 0) //<---- ¿no hay tiempo?.
{
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("Tiempo");
lcd.setCursor(3, 1);
lcd.print("Finalizado");
digitalWrite(pinBuz, HIGH);
delay(200);
digitalWrite(pinBuz, LOW);
delay(200);
}else printTime();
}
}
void manage_SSS() { //función que cambia el estado de SSS, y evita atascos
//se ejecuta en ambos ciclos, para poder salir de ambos.
if (digitalRead(pinSta) == LOW && seguro == 0)
{lcd.clear(); //agrego un clear porque cuando termina el tiempo queda F00:00:00o
SSS = !SSS;
seguro++;
}
if (digitalRead(pinSta) == HIGH) seguro = 0;
//cuando pinSta sea liberado cambiara su estado a HIGH y seguro = 0
//con esto posibilitamos que la condición anterior se pueda ejecutar nuevamente
// y por una vez cuando sea presionado nuevamente (pinSta = LOW)
//no necesita delay pues el seguro entra inmediato
}
void printTime() {
// función simple que imprime el tiempo en la segunda linea
// con esto evitamos repetir código en el ciclo do y en el ciclo while
lcd.setCursor(4, 1);
if (horas < 10)lcd.print("0");
lcd.print(horas);
lcd.print(":");
if (minutos < 10)lcd.print("0");
lcd.print(minutos);
lcd.print(":");
if (segundos < 10)lcd.print("0");
lcd.print(segundos);
}
void startLCD() {
// + + + + + + + + + + + + + + + + + + + + + //
// ---- Rutina de inicio Splash Screen ---- //
// + + + + + + + + + + + + + + + + + + + + + //
lcd.begin(16, 2);
byte customChar1[8] = {
B00000,
B00100,
B01110,
B11111,
B01110,
B00100,
B00000,
B00000
};
byte customChar2[8] = {
B00000,
B00100,
B01010,
B10101,
B01010,
B00100,
B00000,
B00000
};
lcd.createChar(0, customChar1);
lcd.createChar(1, customChar2);
// --- inicia rutina --- //
lcd.setCursor(0, 0);
lcd.print("ACTIVACION");
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.setCursor(1, 1);
lcd.print("--------------");
lcd.setCursor(15, 1);
lcd.write(byte(1));
delay(2500);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Temporizador");
lcd.setCursor(6, 1);
int sensorReading = analogRead(A0);
int delayTime = map(sensorReading, 0, 1023, 200, 1000);
lcd.setCursor(4, 1);
lcd.write(3);
delay(delayTime);
lcd.setCursor(4, 1);
lcd.write(4);
delay(delayTime);
lcd.print("TTT");
delay(2500);
lcd.clear();
}
Moderador: Titulo editado