Lee mal los datos si usas PROGMEM [SOLUCIONADO]

Buenas gente:

Lee los datos de estas variables con caracteres raro si usas el PROGMEM, que es para orientar los datos de la SRAM a la flash o memoria programa.

Captura.PNG

#include <LiquidCrystal.h>

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

// 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 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', '.', ',', '-', '_', ':', ';',
  '¿', '?', '(', ')', '[', ']', '{', '}', '=', '

Captura 2.PNG

Si quito el PROGMEN, si los lee bien.

int const PROGMEM INDICE_ARRAY[] =
{
  80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
};

Cambiar a:

int const INDICE_ARRAY[] =
{
  80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
};

Lo de PROGMEN es para guardar en la memoria Flash en vez de la SRAM. Pero veo que al leer hay fallos.

Saludos.

Captura.PNG

Captura 2.PNG, '&', '"', ' '
};

// Dirección del carácter del array. El 80 presenta al espacio ' ' del array roALFANUMERICO.
const int PROGMEM INDICE_ARRAY[] =
{
  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" };

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);

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

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

for (byte i = 0; i < 80; i++)
  {
    Serial.println(ALFANUMERICO[i]);
  }

for (byte j = 0; j < 16; j++)
  {
    Serial.println(INDICE_ARRAY[j]);
  }

for (byte k = 0; k < 2; k++)
  {
    Serial.println(TEXTO[k]);
  }
}

void loop()
{
  //return 0;
}


![Captura 2.PNG|682x372](upload://iXEizHX69ScIiN2Ae4KJSUO3ebj.png)

Si quito el PROGMEN, si los lee bien.

§DISCOURSE_HOISTED_CODE_1§


Cambiar a:

§DISCOURSE_HOISTED_CODE_2§


Lo de PROGMEN es para guardar en la memoria Flash en vez de la SRAM. Pero veo que al leer hay fallos.

Saludos.

![Captura.PNG|682x372](upload://vRhpocJynbomEdl3ErbcSdOW5hv.png)

![Captura 2.PNG|682x372](upload://iXEizHX69ScIiN2Ae4KJSUO3ebj.png)

Hol ade nuevo.

Mirando aquí los tipos de datos.

He hecho ahora esto.

PROGMEM const unsigned char 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', '.', ',', '-', '_', ':', ';',
  '¿', '?', '(', ')', '[', ']', '{', '}', '=', '

Con este otro array también.

PROGMEM const int INDICE_ARRAY[] =
{
  80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
};

El resultado que muestra es este.

152
184
184
184
184
184
184
184
2
184
2
184
184
184
184
184
184
184
184
184
1
4
161
0
0
184
0
184
0
248
254
255
0
0
184
184
2
184
6
184
16
0
0
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
184
33
184
184
184
0
0
769
0
21
0
0
0
-18248
-18248
-18248
-18248
-18248
-18248
-18248
-18248

Si no uso el PROGMEM, me da sus resultados correcto como muestra abajo.

65
66
67
68
69
70
71
72
73
74
75
76
77
78
145
79
80
81
82
83
84
85
86
88
89
90
97
98
99
100
101
102
103
104
105
106
107
108
109
110
177
111
112
113
114
115
116
117
118
120
121
122
48
49
50
51
52
53
54
55
56
57
46
44
45
95
58
59
191
63
40
41
91
93
123
125
61
36
38
34
80
80
80
80
80
80
80
80
80
80
80
80
80
80
80
80

Mentira.
Debo poner de este código.

PROGMEM const unsigned char ALFANUMERICO[] =
{

A este otro.

const char ALFANUMERICO[] =
{

Ahora si que me da este resultado esperado.

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
.
,
-
_
:
;
⸮
?
(
)
[
]
{
}
=
$
&
"
80
80
80
80
80
80
80
80
80
80
80
80
80
80
80
80

Pero cuidado una cosa, que estos datos están en la SRAM, en el cual quiero ahorrarlo pasarlo a la memoria Flash o memoria programa con el PROGMEM, lo que pasa que me da resultados raros.

Mi pregunta es.
Si los datos no lo muestra correctamente desde la memoria flash. ¿Para qué hicieron el PROGMEM?

Lo curioso que estos trozos de datos aquí abajo, que es sacado de una fotografía *.jpg y por un editor hexadecimal, si funciona de maravilla.

PROGMEM const unsigned char rawData2[] = {
  0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D,
  0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12,
  0x08, 0x06, 0x00, 0x00, 0x00, 0x5B, 0xD0, 0xFE, 0x10, 0x00, 0x00, 0x00,
  0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72,
  0x65, 0x00, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x49, 0x6D, 0x61, 0x67,

Paso estos datos al terminal que he creado en el Pc y recupero esta foro guardado en la flash de Arduino UNO con PROGMEM porque en la SRAM no cabe.

Ya explicaré por este tema lo que estoy haciendo para que lo entiendan. Guardar pequeñas fotos de cualquier formato dentro de Arduino UNO.

Saludos., '&', '"', ' '
};


Con este otro array también.

§DISCOURSE_HOISTED_CODE_1§


El resultado que muestra es este.

§DISCOURSE_HOISTED_CODE_2§


Si no uso el [PROGMEM](https://www.arduino.cc/reference/en/language/variables/utilities/progmem/), me da sus resultados correcto como muestra abajo.

§DISCOURSE_HOISTED_CODE_3§


Mentira.
Debo poner de este código.

§DISCOURSE_HOISTED_CODE_4§


A este otro.

§DISCOURSE_HOISTED_CODE_5§


Ahora si que me da este resultado esperado.

§DISCOURSE_HOISTED_CODE_6§


Pero cuidado una cosa, que estos datos están en la SRAM, en el cual quiero ahorrarlo pasarlo a la memoria Flash o memoria programa con el PROGMEM, lo que pasa que me da resultados raros.

Mi pregunta es.
**Si los datos no lo muestra correctamente desde la memoria flash. ¿Para qué hicieron el PROGMEM?**

Lo curioso que estos trozos de datos aquí abajo, que es sacado de una fotografía *.jpg y por un editor hexadecimal, si funciona de maravilla.

§DISCOURSE_HOISTED_CODE_7§


Paso estos datos al terminal que he creado en el Pc y recupero esta foro guardado en la flash de Arduino UNO con PROGMEM porque en la SRAM no cabe.

Ya explicaré por [este tema](https://forum.arduino.cc/index.php?topic=444461.120) lo que estoy haciendo para que lo entiendan. Guardar pequeñas fotos de cualquier formato dentro de Arduino UNO.

Saludos.

Buenas:

Ya lo descubrí. Se me había olvidado el truco.
En la salida había que poner esto: pgm_read_byte.

Dejo el código completo por si alguien lo necesita.

#include <LiquidCrystal.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', '.', ',', '-', '_', ':', ';',
  '¿', '?', '(', ')', '[', ']', '{', '}', '=', '

Saludos., '&', '"', ' '
};

// 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_éÉÁá" };

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);
  // 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);

for (int i = 0; i < 80; i++)
  {
    Serial.write(pgm_read_byte(&ALFANUMERICO[i]));
    Serial.println();
  }

for (int j = 0; j < 16; j++)
  {
    Serial.println(pgm_read_byte(&INDICE_ARRAY[j]));
  }
 
  for (int k = 0; k < 2; k++)
  {
    Serial.println(TEXTO[k]);
  }
}

void loop()
{

}


Saludos.