Imprimir un numero e LCD vía un Keypad (para un timbre programable)

Hola, como verán el el código soy algo nuevo en el tema. Estoy haciendo un proyecto para 6° de electronica, pero tengo un problema con el Keypad, cada ves que quiero usar una función, por ejemplo waitForKey o getKey, me imprime un 1 en el LCD sin que yo quiera y no me deja usar el keypad.
use varios códigos pero siempre hacia lo mismo, probé con el código mas simple para escribir algo en el LCD y hace lo mismo.
Este es el código del timbre

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "RTClib.h"

LiquidCrystal_I2C lcd(0x20, 16, 2);
RTC_DS1307 RTC;

#include <Keypad.h>   //Libreria para el teclado
char pulsacion;
const byte Filas = 4;          //Cuatro filas
const byte Cols = 3;           //Tres columnas

byte Pins_Cols[] = { 9, 8, 7};     //Pines Arduino para las columnas
byte Pins_Filas[] = {13, 12, 11, 10};    // Pines Arduino para las filas
char Teclas [ Filas ][ Cols ] =
{
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'},
};

Keypad Teclado1 = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols); //Creamos lo que va a ser nuestro Keypad, que llamaremos "Teclado1"


int confirmar = A1, alarma = A0, RELE = 6 ;
int i;
int pulsacion1;
int seg1, min1, hor1, ano1, mes1, dia1; //Hora que trae el reloj DS1307RTC
int min2, hor2; //Hora que defino yo como alarma. Solo me interesan la hora y los minutos


void setup() {
  Wire.begin(); // Inicia el puerto I2C
  RTC.begin(); // Inicia la comunicación con el RTC
  RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora, sincronizandola con el de el ordenador. (Comentar una vez establecida la hora)

  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.begin(16, 2);

  pinMode(alarma, INPUT);
  pinMode(RELE, OUTPUT);
}

void loop() {
  lcd.clear();
  if (analogRead(alarma) < 512) { //Mientras el pulsador NO este pulsado...
    DateTime now = RTC.now();

    Serial.print(now.year(), DEC); // A§o
    Serial.print('/');
    Serial.print(now.month(), DEC); // Mes
    Serial.print('/');
    Serial.print(now.day(), DEC); // Dia
    Serial.print(' ');
    Serial.print(now.hour(), DEC); // Horas
    Serial.print(':');

    Serial.print(now.minute(), DEC); // Minutos
    Serial.print(':');
    Serial.print(now.second(), DEC); // Segundos
    Serial.println();

    lcd.setCursor(0, 0);
    lcd.print("D:");
    lcd.print(now.year(), DEC);
    lcd.print("/");
    lcd.print(now.month(), DEC);
    lcd.print("/");
    lcd.print(now.day(), DEC);
    lcd.print(" ");
    lcd.setCursor(0, 1);
    lcd.print("T: ");
    lcd.print(now.hour(), DEC);
    lcd.print(":");
    lcd.print(now.minute(), DEC);
    lcd.print(":");
    lcd.print(now.second(), DEC);
    delay(1000);
    lcd.setCursor(0, 0);
    lcd.print("               ");
    lcd.setCursor(0, 1);
    lcd.print("               ");

  }

  else { //Cuando se pulse el pulsador...

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Escribe la hora");
    delay(1000);

    for (i = 0; i < 5; i++) {
      char pulsacion;
      lcd.setCursor(i, 1);
      if (i == 2) {
        lcd.print(":");
      }
      else {
        pulsacion = Teclado1.waitForKey(); // Esperamos a que pulse un boton.
        lcd.print(pulsacion);              //Escribimos el el valor de pulsacion en el LCD.

        switch (pulsacion) {

          case '1': pulsacion1 = 1;
            break;
          case '2': pulsacion1 = 2;
            break;
          case '3': pulsacion1 = 3;
            break;
          case '4': pulsacion1 = 4;
            break;
          case '5': pulsacion1 = 5;
            break;
          case '6': pulsacion1 = 6;
            break;
          case '7': pulsacion1 = 7;
            break;
          case '8': pulsacion1 = 8;
            break;
          case '9': pulsacion1 = 9;
            break;
          case '0': pulsacion1 = 0;
        }
        switch (i) {
          case 0: hor2 = pulsacion1 * 10;   //Sabemos que el primer valor de los minutos sera un valor en decimas
            break;
          case 1: hor2 = hor2 + pulsacion1; // El segundo valor de los minutos que sera una unidades
            break;
          case 3: min2 = pulsacion1 * 10;   //Primer valor de los segundos que sera un valor en decimas
            break;
          case 4: min2 = min2 + pulsacion1; //Segundo valor de los segundos que sera en unidades
            break;
        }

      }
      delay(500);
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Alarma");
    lcd.setCursor(0, 1);
    lcd.print("Configurada");
    delay(3000);

    lcd.clear();


    while (min1 != min2 || hor1 != hor2) { //Mientras la hora de la alarma escrita por el usuario, y la hora real sean diferentes,
      //escribiremos la hora real y la de la alarma en la pantalla.
      DateTime now = RTC.now();

      Serial.print(now.year(), DEC); // A§o
      Serial.print('/');
      Serial.print(now.month(), DEC); // Mes
      Serial.print('/');
      Serial.print(now.day(), DEC); // Dia
      Serial.print(' ');
      Serial.print(now.hour(), DEC); // Horas
      Serial.print(':');

      Serial.print(now.minute(), DEC); // Minutos
      Serial.print(':');
      Serial.print(now.second(), DEC); // Segundos
      Serial.println();

      hor1 = now.hour();
      min1 = now.minute();

      lcd.setCursor(0, 0);
      lcd.print("D:");
      lcd.print(now.year(), DEC);
      lcd.print("/");
      lcd.print(now.month(), DEC);
      lcd.print("/");
      lcd.print(now.day(), DEC);
      lcd.print(" ");
      lcd.setCursor(0, 1);
      lcd.print("T: ");
      lcd.print(now.hour(), DEC);
      lcd.print(":");
      lcd.print(now.minute(), DEC);
      lcd.print(":");
      lcd.print(now.second(), DEC);
      delay(1000); // La informaci¢n se actualiza cada 1 seg.
      lcd.setCursor(0, 0);
      lcd.print("               ");
      lcd.setCursor(0, 1);
      lcd.print("               ");
    }

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("ES LA HORA!!");

    while (analogRead(alarma) < 512) {
      digitalWrite(RELE, HIGH);
      delay(1000);
      digitalWrite(RELE, LOW);
      delay(1000);
    }
    delay(3000);

  }//Final del else de arriba

}//Final de programa

Este código funcionaba hasta ese Error
tengo otros pero que estaban modificados

Pd: tengo pensado hacer un final con funciones xd, no soy tan rata

Pdd: uso un analogRead porque mi botón esta en el pin A1 y ya tengo la placa echa, error mío por no prestar atención, pero creo que no influye en nada

Muchísimas Gracias

De todos modos puedes usar

if (digitalRead(alarma) == LOW) {

Los pines A0 a A5 tienen doble función, por lo que también trabajan como pines digitales.

Saludos

Amplío:

switch (pulsacion) {
// todos los case

Lo puedes simplificar a

if (pulsacion >= '0' && pulsacion <= '9') {
  pulsacion1 = pulsacion - 48;
}

con el mismo resultado (revisa una tabla ASCII si no entiendes el por qué).

La variable pulsacion la tienes declarada como global y luego como local dentro del for(). Quita esta segunda declaración.

El proceso solamente sale de un ciclo while cuando deja de cumplirse condición. En tu caso no volverá a preguntar por el estado del pulsador o del keypad.

Has definido dos veces la variable pulsacion. Cuidado con eso. Por otro lado, la variable confirmar no se utiliza

El uso de funciones puede mejorar significativamente tus probabilidades de escribir un código que trabaje correctamente desde la primera vez. Logras un código más legible y más fácil de depurar. No lo dejes para el "final", sino para el "principio".

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.