Arduino - Se me repite en el Monitor Serie los botones

 
Vista:
sin imagen de perfil
Val: 63
Oro
Ha mantenido su posición en Arduino (en relación al último mes)
Gráfica de Arduino

Se me repite en el Monitor Serie los botones

Publicado por Meta (27 intervenciones) el 27/07/2020 23:29:16
Hola:

Tengo un programa hecho que controla el display de 16x2 llamado LCD kaypd Shield.

Lo que ocurre es que en el "Monitor Serie" de Arduino IDE v1.8.13 me muestra la imagen de abajo, pulso una vez el botón ARRIBA y me sale como si pulsara unos diez veces seguidas.

index

Su código es este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <LiquidCrystal.h>
 
// Seleccionado los pines del LCD.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
// Definir algunos valores utilizados por el LCD y los botones.
int teclaLCD = 0;
int teclaEntradaADC = 0;
#define botonDERECHO 0
#define botonARRIBA 1
#define botonABAJO 2
#define botonIZQUIERDA 3
#define botonSELECT 4
#define botonNADA 5
int pinLed10 = 10; // Luz de fondo.
int pinLed13 =  13;   // Declaramos la variable pin del Led.
char caracter;
String comando;
 
// Leeer todos los botones.
int leer_botones_del_LCD()
{
  teclaEntradaADC = analogRead(A0); //Leer el valor desde el sensor.
  // Los botones cuando se leen están centrados en estos valores: 0, 144, 329, 504, 741.
  // Agregamos aproximadamente 50 a esos valores y verificamos si estamos cerca.
 
  // Hacemos de esta la primera opción por razones de velocidad,
  // ya que será el resultado más probable.
  if (teclaEntradaADC > 1000) return botonNADA;
  // Para V1.1 nosotros este umbral.
  /*
    if (teclaEntradaADC < 50)   return botonDERECHO;
    if (teclaEntradaADC < 250)  return botonARRIBA;
    if (teclaEntradaADC < 450)  return botonABAJO;
    if (teclaEntradaADC < 650)  return botonIZQUIERDA;
    if (teclaEntradaADC < 850)  return botonSELECT;
  */
  // Para V1.0, comente el otro umbral y use el siguiente:
 
  if (teclaEntradaADC < 50)   return botonDERECHO;
  if (teclaEntradaADC < 195)  return botonARRIBA;
  if (teclaEntradaADC < 380)  return botonABAJO;
  if (teclaEntradaADC < 555)  return botonIZQUIERDA;
  if (teclaEntradaADC < 790)  return botonSELECT;
 
  return botonNADA;  // Cuando todos los demás fallan, devuelve esto ...
}
void setup()
{
  pinMode(pinLed13, OUTPUT);
  pinMode(pinLed10, OUTPUT);
  digitalWrite(pinLed10, HIGH); // Dejar encendido luz de fondo.
  lcd.begin(16, 2); // LCD de 16x2.
  lcd.setCursor(0, 0);
  lcd.print("Arduino 2020");
  Serial.begin(115200);
}
 
void loop()
{
  // Indicar posición.
  lcd.setCursor(0, 1);
  // Esperando lectura botones.
  teclaLCD = leer_botones_del_LCD();
 
  /* Voy leyendo carácter a carácter lo que se recibe por el canal
    serie (mientras llegue algún dato allí), y los voy concatenando
    uno tras otro en una cadena. En la práctica, si usamos el
    "Serial monitor" el bucle while acabará cuando pulsemos Enter.
    El delay es conveniente para no saturar el canal serie y que la
    concatenación se haga de forma ordenada.
  */
  while (Serial.available() > 0)
  {
    caracter = Serial.read();
    comando.concat(caracter);
    delay(10);
  }
  /* Unavez ya tengo la cadena "acabada", compruebo su valor y hago
     que la placa Arduino reaccione según sea este. Aquí podríamos
     hacer lo que quiesiéramos: si el comando es "tal", enciende
     un Led, si es cual, mueve un motor... y así.
  */
  if (comando.equals("Led_13_ON") == true)  // Led_ON.
  {
    digitalWrite(pinLed13, HIGH); // Enciende el Led.
    lcd.setCursor(0, 1);
    lcd.print("Led 13: ON ");
    Serial.println("Led 13 encendido.");
  }
 
  if (comando.equals("Led_13_OFF") == true) // Led_OFF.
  {
    digitalWrite(pinLed13, LOW); // Apaga el Led.
    lcd.setCursor(0, 1);
    lcd.print("Led 13: OFF");
    Serial.println("Led 13 apagado.");
  }
 
  if (comando.equals("Led_10_ON") == true)  // Led_ON.
  {
    digitalWrite(pinLed10, HIGH); // Enciende el Led.
    lcd.setCursor(14, 1);
    lcd.print("F1");
    Serial.println("Led 10 encendido.");
  }
 
  if (comando.equals("Led_10_OFF") == true) // Led_OFF.
  {
    digitalWrite(pinLed10, LOW); // Apaga el Led.
    lcd.setCursor(14, 1);
    lcd.print("F0");
    Serial.println("Led 10 apagado.");
  }
  // Limpiamos la cadena para volver a recibir el siguiente comando.
  comando = "";
 
  // Dependiendo de qué botón se presionó, realizamos una acción.
  switch (teclaLCD)
  {
    case botonDERECHO:
      {
        lcd.print("Derecha  ");
        Serial.write("Derecha.");
        break;
      }
    case botonIZQUIERDA:
      {
        lcd.print("Izquierda");
        Serial.write("Izquierda.");
        break;
      }
    case botonARRIBA:
      {
        lcd.print("Arriba   ");
        Serial.write("Arriba.");
        break;
      }
    case botonABAJO:
      {
        lcd.print("Abajo    ");
        Serial.write("Abajo.");
        break;
      }
    case botonSELECT:
      {
        lcd.print("SELECT   ");
        Serial.write("SELECT");
        break;
      }
    case botonNADA:
      {
        //lcd.print("Nada     ");
        //Serial.write("Nada");
        break;
      }
  }
}

¿Alguna idea?

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder