Problemas con sentencia if

Buenos días. Estoy tratando de desarrollar un sistema de riego automático. He dividido el proyecto en subproyectos, y actualmente estoy haciendo un subproyecto compuesto por una pantalla OLED y un Keypad 4x4. He conseguido crear un menú en el que si selecciono la A programo una de las horas de riego, y lo mismo con la B y la C, y las muestro en la pantalla OLED. El problema ha venido cuando trato de evitar que se pulse teclas que no concordarían con una hora real. Cuando añado un condicional la pantalla deja de responder. Se queda en negro y no imprime siquiera el mensaje de inicio (el mensaje del setup()).

Les adjunto el código por si alguien supiese en que estoy fallando. De paso aprovecho para preguntar si alguien sabe el motivo por el cual cuando, después de haber cargado en Arduino el programa por primera vez, la primera tecla que tecleo no es aceptada (o más bien leída) y en cuando la pulso una segunda vez ya sí que la reconoce y de ahí en adelante reconoce todas

#include <Keypad.h>

#include <SPI.h>

#include <Wire.h>//Librería necesaria para la comunicación I2C conel chip de la pantalla

#include <Adafruit_GFX.h>//Librería gráfica para la pantalla OLED

#include <Adafruit_SSD1306.h>//Librería necesaria para laspantallas OLED

#define ANCHO_PANTALLA 128 // ancho pantalla OLED. Valor típico 128

#define ALTO_PANTALLA 64 // alto pantalla OLED. Valor típico son 64 y 32

const byte filas =4;

const byte columnas=4;

char teclas [filas][columnas] ={

{‘1’, ‘2’, ‘3’, ‘A’},

{‘4’, ‘5’, ‘6’, ‘B’},

{‘7’, ‘8’, ‘9’, ‘C’},

{’*’, ‘0’, ‘#’, ‘D’}

};

byte pinesFilas [filas] = {11, 10, 9, 8};//Definimos los pines correspondientes a las filas del teclado matricial

byte pinesColumnas [columnas] = {7, 6, 5, 4};//Definimos los pines correspondientes a las filas del teclado matricial

char tecla_pulsada;

char horariego1[6];

char horariego2[6];

char horariego3[6];

int i=0;

int tecla_numerica;

int tecla_anterior;

char opcion_seleccionada;

bool bandera_seleccion;

void menu_principal();

void opcion_a();

void opcion_b();

void opcion_c();

Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);

Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas);

void setup() {

Serial.begin(9600);

delay(100);

bandera_seleccion=0;

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

menu_principal();

}

void loop() {

tecla_pulsada = teclado.getKey();

opcion_seleccionada=tecla_pulsada;

if(opcion_seleccionada == ‘A’){

opcion_a();

bandera_seleccion=1;

}

if(opcion_seleccionada == ‘B’){

opcion_b();

bandera_seleccion=1;

}

if(opcion_seleccionada == ‘C’){

opcion_c();

bandera_seleccion=1;

}

}

void opcion_a(){

if(bandera_seleccion==1){

bandera_seleccion=0;

display.clearDisplay();

display.setCursor(0,0);

display.println(“Opcion A seleccionada”);

display.display();

for(i=0;i<6;i++){

tecla_pulsada=teclado.waitForKey();

if(tecla_pulsada==‘A’||tecla_pulsada==‘B’||tecla_pulsada==‘C’||tecla_pulsada==‘D’||tecla_pulsada==’*’||tecla_pulsada==’#’){

display.clearDisplay();

display.setCursor(0,0);

display.println(“ERROR”);

display.setCursor(0,10);

display.println(“La tecla pulsada no es numerica”);

display.display();

menu_principal();

}

else{

horariego1*=tecla_pulsada;*
tecla_numerica=horariego1*-48;
if(i==0&&tecla_numerica>2){
_
display.clearDisplay();_
_
display.setCursor(0,0);_
_
display.println(“La hora introducida no es válida”);_
_
display.display();_
_
delay(2000);_
menu_principal();
_
}_
if(i==0&&tecla_numerica==2){
tecla_anterior=tecla_numerica;
_
}_
if(i==1&&tecla_anterior==2&&tecla_numerica>4){
_
display.clearDisplay();_
_
display.setCursor(0,0);_
_
display.println(“La hora introducida no es válida”);_
_
display.display();_
_
delay(2000);_
menu_principal();
_
}_
if(i==2&&tecla_numerica>5){
_
display.clearDisplay();_
_
display.setCursor(0,0);_
_
display.println(“La hora introducida no es válida”);_
_
display.display();_
_
delay(2000);_
menu_principal();
_
}_
if(i==4&&tecla_numerica>5){
_
display.clearDisplay();_
_
display.setCursor(0,0);_
_
display.println(“La hora introducida no es válida”);_
_
display.display();_
_
delay(2000);_
menu_principal();
_
}*_

* if(i==5){//Si ya hemos terminado de meter la hora completa, esta ocupará 6 espacios, por lo que una vez estén rellenos imprimiremos por pantalla lo que tenemos en el vector*
* display.clearDisplay();*
* display.setCursor(3,0); *
* display.println("Se ha programado la hora de riego a las ");*
* display.write(horariego1[0]);*
* display.write(horariego1[1]);*
* display.print(’:’);*
* display.write(horariego1[2]);*
* display.write(horariego1[3]);*
* display.print(’:’);*
* display.write(horariego1[4]);*
* display.write(horariego1[5]); *
* display.display();*
* delay(5000);*
* display.clearDisplay();*
* menu_principal();
_
}_
_
}_
_
}_
_
}_
_
}_
void menu_principal(){
_
// Limpiar buffer*_
* display.clearDisplay();*

* // Tamaño del texto*
* display.setTextSize(2);*
* // Color del texto*
* display.setTextColor(SSD1306_WHITE);
_
// Posición del texto*_
* display.setCursor(40, 16);*

* // Escribir texto*
* display.println(“Menu”);*

* // Enviar a pantalla*
* display.display();*
* //Seleccionamos el lugar donde pondremos el cursor, imprimimos por pantalla y lo mandamos al display*
* display.setCursor(10,32);*
* display.println(“Principal”);*
* display.display();*

* delay(2000);*

* // Limpiamos la pantalla, cambiamos el tamaño del texto y resituamos el cursor para escribir el nuevo mensaje. Luego lo mandamos*
* display.clearDisplay();*
* display.setTextSize(1);*
* display.setCursor(0,0);*
* display.println(“Pulse A, B y C para cambiar las horas de riego 1, 2 y 3 respectivamente”);*
* display.display();*
}

Primero que nada, por favor, edita tu post y pon el código como corresponde (ver Normas del foro, punto 7).

A primera vista, no te toma la primera pulsación porque bandera_seleccion está en 0 en la primer llamada, deberías ponerla en 1 antes de la llamada a opcion_x().

Fijate que hay una función isdigit() que da verdadero si un caracter es un número (y falso si no es un número, obviamente), te simplificaría el if en que filtras las teclas no numéricas. Busca en Google "isdigit arduino" para ver como usarla, verás que es muy sencillo.

Cuando el código esté "en forma" lo sigo revisando.

Saludos

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