Leer y escribir EEPROM

Yo muchas veces no entiendo tu forma de programar o tus consultas.

HIGH justo HIGH, no tenías otra opción!!
HIGH al igual que LOW estan definidos por el compilador como un 1 y 0.

No tienes otra etiqueta para usar?
Ademas Constantes se ponen en Mayúsculas y variables en minúsculas o bueno, usa una mayúscula pero lo demás en minúscula.
Cambia esa estiqueta por cualquier otra cosa.

Es igualdad no asignación.

Igual coincido en que es medio "rara" su forma de programar y a veces cuesta entenderle.

Estamos acostumbrados a ver las condiciones como

if (mi_dato == TRUE) {

en lugar de

if (TRUE == mi_dato) {

que finalmente es lo mismo pero "raro" visualmente.

Buenas:

Lo de las variables, lo que suelo hacer, aunque a veces me despisto.

Cuendo vean estas variables de estas formas lo que aprendí en "Buenas técnicas de programación". No todas son iguales.

// Si usas una variable de una sola palabra, se pone todo en minúsculas.
String hola = "Hola";

// Dos o más palabras, la primera toda en minúsculas y cada palabra para diferenciar, en mayúsculas.
String estoEsUnaVariable = "Hola";

// Si es una palabra y una constante se escribe en mayúsculas.
const byte HOLA = 0;

// Si es varias palabras y una constante, se pone todo en mayúsculas y un guión bajo _.
const byte ESTO_ES_UNA_CONSTANTE = 0;

Si te refieres a estos detallitos, cuando veas HOLA todo en mayúsculas, ya sabes que es una constante.

En cuanto a

if (HIGH == digitalRead(A2))

Por las prisas lo dejé así. Ya lo corregiré a su debido tiempo para dejarlo como debe ser.

if (digitalRead(A2) == HIGH)

En cuanto a esto.

HIGH == digitalRead(ABAJO);

Lo dejo más claro por si acaso.

const PROGMEM byte ABAJO = A2;
digitalRead(ABAJO) == HIGH;

O lo que es lo mismo. Sin guardar en una variable el nombre del pin A2.

digitalRead(A2) == HIGH;

Lo que estoy intentando averiguar si hay alguna forma de guardar en una variable no solo el estado de un teclado HIGH o LOW, sino el botón que se pulsó, por ejemplo, en digital A2.

¿Esto es posible hacerlo en Arduino?

Lo que quiero decir, que cuando detecte un pulsador, sea cual sea en digital, se guarde en una variable ese pulsador o la entrada de dicho pin. En el código uso unas 5 entradas digitales, que son el A1, A2, A3, A4 y A5, guardadas cada una de ellas con su variable.

const PROGMEM byte ARRIBA = A1;
const PROGMEM byte ABAJO = A2;
const PROGMEM byte IZQUIERDA = A3;
const PROGMEM byte DERECHA = A4;
const PROGMEM byte ENTER = A5;

Saludos.

Ok pero no es un detalle menor @Metaconta justamente usar HIGH te da problemas o no es el caso?

const PROGMEM byte ARRIBA = A1;
const PROGMEM byte ABAJO = A2;
const PROGMEM byte IZQUIERDA = A3;
const PROGMEM byte DERECHA = A4;
const PROGMEM byte ENTER = A5;

Todo esto me parece locura!!!
Si no tienes espacio usa otro arduino con mas capacidad y no te des golpes contra la pared. Ya te dije que es lento usar PROGMEM pero si eso no te afecta, cuanto ganas usando 5 definiciones de este modo? Todo lo que ganas en parte se pierde con el llamado a las posiciones de la flash y el uso de heap stack correspondiente.

Porque no planteas todo tu código y veamos donde esta el problema. Es el que pusiste al comienzo?
Cuanto ocupa, cuanta RAM libre te queda?
Empecemos por ahi, aunque seguramente dirás porque ya te conozco que lo estas considerando porque le falta y es entendible.

Buenas:
¿Prefieres dejarlo así?

const byte ARRIBA = A1;
const  byte ABAJO = A2;
const byte IZQUIERDA = A3;
const byte DERECHA = A4;
const byte ENTER = A5;

El problema que quiero resolver, o averiguar si en Arduino existe alguna forma que en una variable guarda el btón pulsado, como en este caso es el A1, o el A2 así hasta el A5, cualquier de ello cuando esté pulsado.

Lo quiero hacer así para comprar con un if else algo como esto.


// Especifica botón pulsado de Arduino = Variable.
scanearBoton = Boton;

// Variable = Botón pulsado por el usurio. Como ejemplo pues se pulsa el A5.
Boton = LeerBoton;

// ¿La variable Boton es igual al botón A5 pulsado?
if (Boton == scanearBoton.A5)
{
     //...
}

¿Se entiende lo que quiero decir?

Código completo del archivo *.ino. Explica en documentos // lo que quiero lograr.

// Include el código de la librería.
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Declarar a partir de aquí el lcd.
#include "MenuPrincipal.h"

// Variables.
// Declarado pulsadores.
const byte SCAPE = A0;
const byte ARRIBA = A1;
const byte ABAJO = A2;
const byte IZQUIERDA = A3;
const byte DERECHA = A4;
const byte ENTER = A5;

enum BOTONES
{
  ENUM_ARRIBA = ARRIBA,
  ENUM_ABAJO = ABAJO,
  ENUM_IZQUIERDA = IZQUIERDA,
  ENUM_DERECHA = DERECHA,
  ENUM_ENTER = ENTER 
};

byte teclaInicial = 0;
byte estadoBotonArriba = 0;
byte estadoBotonAbajo = 0;
byte estadoBotonIzquierda = 0;
byte estadoBotonDerecha = 0;
byte estadoBotonEnter = 0;

void setup()
{
  Serial.begin(115200); // 115200

  // La pantalla es de 20 caracteres y 4 filas.
  lcd.begin(20, 4);

  // Configuración de pines como salidas digitales.
  pinMode(13, OUTPUT);

  // Configuración de pines como entradas digitales.
  pinMode(ARRIBA, INPUT);     // Arriba. A1.
  pinMode(ABAJO, INPUT);      // Abajo. A2.
  pinMode(IZQUIERDA, INPUT);  // Izquierda. A3.
  pinMode(DERECHA, INPUT);    // Derecha. A4.
  pinMode(ENTER, INPUT);      // Ok / Enter. A5.

  lcd.clear();                          // Borra la pantalla y su posición superior izquierda.
  lcd.setCursor(0, 1);                  // Línea 2 del LCD.
  lcd.print(F(" Pantalla principal ")); // Muestra título en la LCD.

  // Almacena la tecla pulsada en la variable.
  BOTONES botonInicial;
  
  do
  {
    // #####################################################
    
    // Almacena en la variable una tecla pulsada.
    botonInicial = ReadButton; 
  
    // Como puedes leer arriba, es igual a ReadButton, donde pone
    // ReadButton, tiene que ser una variable que lea cualquier
    // botón pulsado y se almacene en la variable "botonInicial".
    //
    // Si pulso el botón ENTER, se almacena en la variable 
    // "botonInicial" y se compara conel if de abajo.
    //
    // Lo he llamado como ejemplo ReadButton. Ahí es cuando tiene
    // que detectar el botón pulsado para almacenarlo en la variable
    // "botonInicial".
    // 
    // Es la parte que no me sale. La que quiero lograr.
    
    // #####################################################
    
    // ¿Haz pulsado la tecla Enter?
    if (botonInicial == BOTONES::ENUM_ENTER)
    {
      // Sí. Se ejecuta esta función.
      lcd.noCursor(); // Oculat cursor.
      lcd.noBlink();  // Cursor no parpadeando.
      Serial.println(F("fdgmdgkjdfg"));
      Menu_Principal();
    }
    delay(50); // Para mayor estabilidad entre lecturas.
  } while (teclaInicial != digitalRead(SCAPE));
}

void loop() {}

Saludos.

La única forma de hacer eso es tener una rutina que le preste atención a todos los pines involucrados o... que tal si lees directamente el puerto PORTC tendras que bit se ha accionado, el bit esta relacionado con el pin pulsado.
Entonces una simple lectura del PORTC? Te dirá con peso 2 cual es el pin presionado, luego es facil saber a cual nos referimos.
Eso ayuda?

Me ayudó.

A buscar una instrucción llamada scanf() y sscanf(). Lo detecta el IDE de Arduino. Debo examinarlo muy bien.

Por ejemplo, quiero saber que lo voy a mirar más a fondo, si scanf() y sscanf() detecta por ejemplo el pin A5.


// Guarda en una variable el botón pulsado, el que sea.
variable = sscanf();

switch (variable) 
{
  case A1:
    // Ejecuta esta acción porque pulsó el botón A1.
    break;
  case A5:
    // Ejecuta esta acción porque pulsó el botón A5.
    break;
  default:
    // Se ignora cualquier otro botón no indicado en case.
}

Sabía que en C de PC está esta instrucción para capturar las teclas, pero no en Arduino.

En Arduino se captura mucho si es HIGH o LOW de un pin, y lo que quiero saber en este caso es saber que pin o pulsador de pulsó. Ahí está la cuestión.

¿Se entiende bien lo que estoy buscando o lo que les quiero comentar?

Voy a investigar.

Gracias por todo a todos.

te refieres a que queres tener algun tipo de variable donde se guarde si el botón se pulsó?
Quizá te vendría bien las interrupciones pero dependerá del tipo de arduino las que podrás utilizar.
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Dependerá el arduino que uses que tenga más o menos interrupciones.
En el ejemplo de la referencia se ve como hace funcionar un led con un pulsador mediante interrupciones.
En el "void blink()" podrías leer si está pulsado y guardar en una variable "sePulso=true" o algo similar...

También si el bucle "loop" que tienes es rápido puedes hacerlo con el estado HIGH y LOW que es más simple y funcionará con cualquier pin
Saludos.

Me refiero que quiero saber que botón se pulsó, hay 5 botones que se llama A1, A2, A3, A4 y A5.

Quiero que si pulso el botón por ejemplo A5, se guarde A5 en una variable.

Lo normal es que en la variable se guarde HIGH o LOW de un pin o entrada en concreto. En este caso, que se sepa cuál pin o entrada se pulsó, no los estados.

Gracias.

¿Y si pones despues de cada if (HIGH == digitalRead(Ax))

if (HIGH == digitalRead(A1)) // Sí.
    {
BotonPulsado = "A1"
      if (textBox == 0)

¿Y qué es lo que te impide hacerlo?
No entiendo tu planteo.

@tresvdoble
No se me había ocurrido así. Parece ser una buena idea.

@anon90500195
Que no te captura o no hay instrucción, o no conozco alguna como hacerlo.

Es que los planteos de @Metaconta son siempre especiales.
Lo que te dice @DanX3 que te lo iba a comentar pero me quede con lo de PORTC es usar las interrupciones con cada Pin pero estamos en la misma que preguntar con un simple digitalRead(pin) solo que es mas veloz.

Lo del puerto C es una cosa, nada que ver con lo que digo. :wink:

Parece ser que el compañero @tresvdoble es la solución.

if (HIGH == digitalRead(A1)) // Sí.
    {
BotonPulsado = "A1"
      if (textBox == 0)

Vale, gracias a que si pulsas HIGH el botón y cuando lo dejes de pulsar vuelve a LOW, ya con el if y más abajo guarda en la variable el A1.

Con eso ya puedo tocar el Swith Case.

Voy a seguir con ls pruebas y les comento si me funciona.

Saludos

Es en serio?
Me dices que la respuesta era tan simple como leer cada pulsador con digitalRead pero si eso no se sugiere porque se entiende que eso ya lo sabes, lo has hecho cientos de veces y que preguntabas por otra manera de hacerlo.

Por eso dije

Sabía que iba a terminar en lo que es obvio. :wink:

Saludos

Por ahora esto.

// Include el código de la librería.
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Declarar a partir de aquí el lcd.
#include "MenuPrincipal.h"

// Variables.
// Declarado pulsadores.
const byte SCAPE = A0;
const byte ARRIBA = A1;
const byte ABAJO = A2;
const byte IZQUIERDA = A3;
const byte DERECHA = A4;
const byte ENTER = A5;

enum BOTONES
{
  ENUM_ARRIBA = ARRIBA,
  ENUM_ABAJO = ABAJO,
  ENUM_IZQUIERDA = IZQUIERDA,
  ENUM_DERECHA = DERECHA,
  ENUM_ENTER = ENTER
};

byte GetPressedKey()
{
  while (true)
  {
    if (digitalRead(SCAPE))
      return SCAPE;
    else if (digitalRead(ENTER))
      return ENTER;
    else if (digitalRead(DERECHA))
      return DERECHA;
    else if (digitalRead(IZQUIERDA))
      return IZQUIERDA;
    else if (digitalRead(ARRIBA))
      return ARRIBA;
    else if (digitalRead(ABAJO))
      return ABAJO;
  }
}

void setup()
{
  Serial.begin(115200); // 115200

  // La pantalla es de 20 caracteres y 4 filas.
  lcd.begin(20, 4);

  // Configuración de pines como entradas digitales.
  pinMode(ARRIBA, INPUT);     // Arriba. A1.
  pinMode(ABAJO, INPUT);      // Abajo. A2.
  pinMode(IZQUIERDA, INPUT);  // Izquierda. A3.
  pinMode(DERECHA, INPUT);    // Derecha. A4.
  pinMode(ENTER, INPUT);      // Ok / Enter. A5.

  lcd.clear();                          // Borra la pantalla y su posición superior izquierda.
  lcd.setCursor(0, 1);                  // Línea 2 del LCD.
  lcd.print(F(" Pantalla principal ")); // Muestra título en la LCD.

  // Almacena la tecla pulsada en la variable.
  BOTONES botonInicial;

  do
  {

    // #####################################################

    // Almacena en la variable una tecla pulsada.
    botonInicial = GetPressedKey();

    // #####################################################

    // ¿Haz pulsado la tecla Enter?
    Serial.println(botonInicial);
    Serial.println(BOTONES::ENUM_ENTER);
    if (botonInicial == BOTONES::ENUM_ENTER)
    {
      // Sí. Se ejecuta esta función.
      lcd.noCursor(); // Oculat cursor.
      lcd.noBlink();  // Cursor no parpadeando.
      Serial.println(F("Botón ENTER pulsado."));
      Menu_Principal();
    }
    delay(50); // Para mayor estabilidad entre lecturas.
  } while (teclaInicial != digitalRead(SCAPE));
}

void loop() {}

Esto es lo que estaba buscando.

    // Almacena en la variable una tecla pulsada.
    botonInicial = GetPressedKey();

Si lo pongo en otros archivos externos .h, me dice que lo declare otra vez. Que pesades, siempre me espera algo.

Mucha gracias a ustedes porque he podido llegar hasta aquí que si funciona, solo falta corregir en cada archivo.

¿Donde has encontrado esa funcion? es que no la encuentro.

Está declarada en el código de #37 antes de setup().

Saludos

Gracias @anon90500195, creí que era una función del lenguaje y no una funcion de usuario.