Arduino - Apagar y encender un Led con el mismo botón

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

Apagar y encender un Led con el mismo botón

Publicado por Meta (25 intervenciones) el 29/07/2020 05:28:53
Hola:

Quiero pulsar el botón ARRIBA me enciende el Led 13 de Arduino UNO, si vuelvo a pulsar el mismo botón, se apaga, así quiero que funcioine siempre.

El 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
159
#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
#define pinLed10 10 // Luz de fondo.
#define pinLed13 13   // Declaramos la variable pin del Led.
char caracter;
String comando;
int teclaAnt = 0;
 
// Leer 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(F("Arduino 2020"));
  Serial.begin(115200);
}
 
void loop()
{
  /* 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(F("Led_13_ON")) == true)  // Led_ON.
  {
    digitalWrite(pinLed13, HIGH); // Enciende el Led.
    lcd.setCursor(0, 1);
    lcd.print(F("Led 13: ON "));
    Serial.println(F("Led 13 encendido."));
  }
 
  if (comando.equals(F("Led_13_OFF")) == true) // Led_OFF.
  {
    digitalWrite(pinLed13, LOW); // Apaga el Led.
    lcd.setCursor(0, 1);
    lcd.print(F("Led 13: OFF"));
    Serial.println(F("Led 13 apagado."));
  }
 
  if (comando.equals(F("Led_10_ON")) == true)  // Led_ON.
  {
    digitalWrite(pinLed10, HIGH); // Enciende el Led.
    lcd.setCursor(14, 1);
    lcd.print(F("F1"));
    Serial.println(F("Led 10 encendido."));
  }
 
  if (comando.equals(F("Led_10_OFF")) == true) // Led_OFF.
  {
    digitalWrite(pinLed10, LOW); // Apaga el Led.
    lcd.setCursor(14, 1);
    lcd.print(F("F0"));
    Serial.println(F("Led 10 apagado."));
  }
  // Limpiamos la cadena para volver a recibir el siguiente comando.
  comando = "";
 
  // Indicar posición.
  lcd.setCursor(0, 1);
  // Esperando lectura botones.
  teclaLCD = leer_botones_del_LCD();
  if (teclaLCD != teclaAnt) {
      // Dependiendo de qué botón se presionó, realizamos una acción.
      switch (teclaLCD) {
        case botonDERECHO:
          {
            lcd.print(F("Derecha  "));
            Serial.println(F("Derecha."));
            break;
          }
        case botonIZQUIERDA:
          {
            lcd.print(F("Izquierda"));
            Serial.println(F("Izquierda."));
            break;
          }
        case botonARRIBA:
          {
            lcd.print(F("Arriba   "));
            Serial.println(F("Arriba."));
            break;
          }
        case botonABAJO:
          {
            lcd.print(F("Abajo    "));
            Serial.println(F("Abajo."));
            break;
          }
        case botonSELECT:
          {
            lcd.print(F("SELECT   "));
            Serial.println(F("SELECT"));
            break;
          }
        case botonNADA:
          {
            //lcd.print(F("Nada     "));
            //Serial.println(F("Nada"));
            break;
          }
      }
  }
  teclaAnt = teclaLCD;
}

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