Go Down

Topic: Guardar y leer EEPROM de un array y lee cosas raras (Read 219 times) previous topic - next topic

Metaconta

Jul 31, 2020, 01:51 am Last Edit: Jul 31, 2020, 02:20 am by Metaconta
Buenas:

Estoy intentando guardar un array que se llama ALFANUMERCO en la EERPOM de Arduino UNO.
Pasa 5 segundos.
Lee la EEPROM dicho array.
Muestra el array en el Monitor Serie de Arduino IDE.

A parte de todo esto. No entiendo el motivo de estos caracteres raros que salen sin parar y no tengo ningún bucle ni nada, no se detiene.


Dejo el código aquí.
Code: [Select]
#include <LiquidCrystal.h>
#include <EEPROM.h>
//#define pinLed10 10 // Luz de fondo.

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
// LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Abreviado.

// Pin 10 para saber que es luz de fondo del LCD.
//int LuzFondo = 10;


// Variables.
String guardarNombre = ""; // Guardar nombre escrito.
int coordenadaX = 0; // Coordenada X del setCursorPisition.
int index = 0; // Índice.

// Caracteres de este array.
const unsigned char PROGMEM ALFANUMERICO[] =
{
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
  'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
  'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '-', '_', ':', ';',
  '¿', '?', '(', ')', '[', ']', '{', '}', '=', '$', '&', '"', ' '
};

// Dirección del carácter del array. El 80 presenta al espacio ' ' del array roALFANUMERICO.
const int INDICE_ARRAY[] PROGMEM =
{
  80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
};

// Palabras del array para imprimir en pantalla.
const String TEXTO[] = { "ATRÁS", "GUARDAR" };

int direccion = 0; // Ubicación donde queremos que se coloquen los datos.
unsigned long tiempo = 0;
String leerEEPROM;

void setup()
{
  // La pantalla es de 16 caracteres y 2 filas.
  lcd.begin(16, 2);
  lcd.print(F("  Probando..."));

  // Baudios del puerto serie.
  Serial.begin(115200);
  tiempo = millis();
  // Espere a que se conecte el puerto serie. Necesario USB nativo.
  while (!Serial);
  // Envía un OK al puerto serie avisando que se detecto la conexión.
  Serial.println(F("OK"));

  // Indicar luz de fondo como salida.
  // pinMode(LuzFondo, OUTPUT);

  Serial.println(guardarNombre);
  Serial.println(coordenadaX);
  Serial.println(index);

  // Muestra todos los caracteres del array
  for (int i = 0; i < 80; i++)
  {
    Serial.write(pgm_read_byte(&ALFANUMERICO[i]));
    Serial.println();
  }
  // Muestra todos los caracteres del array
  for (int j = 0; j < 16; j++)
  {
    Serial.println(pgm_read_byte(&INDICE_ARRAY[j]));
  }

  // Muestra todos los caracteres del array
  for (int k = 0; k < 2; k++)
  {
    Serial.println(TEXTO[k]);
  }

  // Una simple llamada, con la dirección primero y el objeto segundo.
  EEPROM.put(direccion, ALFANUMERICO);

  tiempo = (millis() / 5000); // 5 segundos.

  EEPROM.get(direccion, leerEEPROM);

  // Muestra todos los caracteres del array
  for (int k = 0; k < 16; k++)
  {
    Serial.println(leerEEPROM);
  }
}

void loop()
{

}


El código en grande, porque voy a guardar las demás variables en diferentes zonas de memoria de la EEPROM para practicar.

Saludos.

Pablo_Lucini

Probá cambiando la velocidad a Serial.begin(9600) y seguramente vas a ver bien el monitor serie

Metaconta

Ocurre exactamente lo mismo.

Solo quiero probar lo que guardo en la EEPROM.

Luego quiereo comprobar, leyendo la EEPROM a ver si los datos son los que he guardado y si realmente lo he guardado.

victorjam

El error está aquí:

Code: [Select]

EEPROM.put(direccion, ALFANUMERICO);


Al ser ALFANUMERICO un array creado en la flash con PROGMEM no se puede acceder directamente a él, sino que tienes que usar las funciones pgm_read_xxx(), como bien has hecho en el resto del código. put no hace uso de este de funciones y simplemente direcciona memoria RAM, por lo tanto escribe algo raro en la eeprom que es lo que obtienes.

Aquí un ejemplo de como hacerlo:

Code: [Select]

#include <EEPROM.h>

const unsigned char PROGMEM ALFANUMERICO[] =
{
  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
  'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
  'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '-', '_', ':', ';',
  '¿', '?', '(', ')', '[', ']', '{', '}', '=', '$', '&', '"', ' '
};


void setup() {
  Serial.begin(9600);
}

void loop() {
  // Leemos el array de la memoria flash, byte a byte, lo mostramos por el puerto
  // serie y a la vez lo grabamos en la eeprom.
  for (int i=0; i<80; i++) {
    Serial.print((char)pgm_read_byte(ALFANUMERICO+i));
    EEPROM.update(i, (byte)pgm_read_byte(ALFANUMERICO+i));
    Serial.print(" ");

  }
  Serial.println();
  delay(5000);

  //Leemos el array de la EEPROM y lo mostramos por el puerto serie.
  for (int i=0; i<80; i++) {
    Serial.print((char)EEPROM.read(i));
    Serial.print(" ");
  }
  Serial.println();
}

Metaconta

Buenas:

¿Por eso me sale la ñ y Ñ rara?



Saludos.

surbyte

Moderador
Bueno Metaconta te adverti de los dobles posteos y sigo viendolos.
Indicame s iquieres que los mezcle o cierra uno.



Go Up