LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: sergiotux em 27 de Setembro de 2013, 17:32
-
por favor,
sou péssimo em programação e por isso peço a ajuda de vocês.
como posso fazer para gravar um numero longo, como o de um telefone, na eeprom e depois ler o numero para uma variável?
já tentei várias coisas e não tive sucesso.
Muito obrigado a todos.
sérgio
-
O que é que já tentaste, que micro-controlador estás a usar, que eeprom(interna ou externa), linguagem de programação?
-
Estás a falar de arduino?
Se sim, depende de se tens o numero guardado com um long:
http://www.google.pt/search?q=arduino+store+long+in+eeprom (http://www.google.pt/search?q=arduino+store+long+in+eeprom)
ou como uma string:
http://www.google.pt/search?q=arduino+store+string+in+eeprom (http://www.google.pt/search?q=arduino+store+string+in+eeprom)
em ambos os casos, esta solução é catita e é referenciado nos dois casos anteriores:
http://playground.arduino.cc/Code/EEPROMWriteAnything (http://playground.arduino.cc/Code/EEPROMWriteAnything)
(é catita em termos de utilização... headers com código fazem morrer gatinhos :'( )
Edit: exceto em C++ para templates... desta vez não morreu nenhum gatinho....
-
Obrigado por ajudar;;;
Estiou usando o Arduino (atmega328p)
Tentei os dois códigos abaixo, sendo que o codigo 1 escreve na eeprom numeros diferentes...não estou entendendo porque, exemplo:
0 escreve 49
1 escreve 50
2 escreve 51
3 escreve 52
...
E também nao sei como juntar em uma variável só
# --- CODIGO 1
#include <EEPROM.h>
int c;
void setup(){
Serial.begin(9600);
escreve_numero("123456789",0);
ler(0,12);
// le_numero(0,1);
}
void escreve_numero(char *n, unsigned pos)
{
for (; *n; n++, pos++) {
Serial.print(pos);Serial.print(" : ");Serial.println(*n);
EEPROM.write(pos, *n);
}
EEPROM.write(pos, '\0');
Serial.println("gravado");
// Serial.println(EEPROM.read(9));
}
void ler(int ini, int fim)
{
for (int x=ini; x<fim; x++) {
Serial.print(x);Serial.print(" : ");
int c = EEPROM.read(x);
Serial.println(c);
}
}
/*
void le_numero(char *n, unsigned pos)
{
do {
int c = EEPROM.read(pos++);
*n++ = c;
} while (c != '\0');
}
*/
void loop(){}
#--- Fim código 1
E no código 2 só funciona se eu utilizar 9999 no numero, se eu por 999999999 ele "estoura"...
#--- CODIGO 2
#include <EEPROM.h>
void setup()
{
Serial.begin(9600);
{ // Escreve
uint32_t telefone = 9999;
byte a = (telefone >> 24) & 0xff;
byte b = (telefone >> 16) & 0xff;
byte c = (telefone >> 8) & 0xff;
byte d = (telefone) & 0xff;
EEPROM.write(0, a);
EEPROM.write(1, b);
EEPROM.write(2, c);
EEPROM.write(3, d);
}
{ // Lê
byte a = EEPROM.read(0);
byte b = EEPROM.read(1);
byte c = EEPROM.read(2);
byte d = EEPROM.read(3);
uint32_t telefone = (a << 24) | (b << 16) | (c << 8) | d;
Serial.println(telefone);
}
}
void loop() { }
#--- FIM CODIGO 2
Obrigado a todos....
Sérgio
-
Porque estás a ler directamente da EEPROM, ou melhor a biblioteca print do arduino acha-se muito esperta e passa os valores hex para decimal, 48 é ASCCI para 0, 49 é ASCCI para 1 e por ai adiante..
-
Tentei os dois códigos abaixo, sendo que o codigo 1 escreve na eeprom numeros diferentes...não estou entendendo porque, exemplo:
0 escreve 49
1 escreve 50
2 escreve 51
3 escreve 52
Faz exactamente o que tens no código. O código ascii do carater "1" é 49, o do careter "2" é 50, e por aí fora.
Escreves chars com caracteres Ascii e estás a ler ints.
-
Senso e JM_Araujo, muito obrigado por me esclarecer e ajudar...
troquei
int c = EEPROM.read(x); por
char c = EEPROM.read(x);
e está ok,
Posso pedir mais uma ajuda?
Como faço para ler os dados da eeprom e jogar para uma variável?
minha ideia é usar essa variável para enviar SMS via shild.
Obrigado
-
Vê o ultimo link que te enviei, tem mais de 1 solução:
http://playground.arduino.cc/Code/EEPROMWriteAnything (http://playground.arduino.cc/Code/EEPROMWriteAnything)
-
Basta usares EEPROM.read() para cada byte que queres ler e guardar esses bytes todos como char[] ou char*.
char[] ou char*, para se comportar como String, o último byte tem de ter valor 0 decimal.
-
Obrigado JM_Araujo, tinha visto sim, mas meu programa já tá muito grande e eu não posso utilizar bibliotecas.
Rglove, não entendi bem o que vc falou...pode me mostrar como fazer?
Seguem abaixo o programa como está agora, graças a ajuda de todos...
#include <EEPROM.h>
int c;
char *numero= "11999999999";
void setup(){
Serial.begin(9600);
escreve_numero(numero,1);
int a = 1;
int b = 12;
ler(a,b);
// le_numero(0,1);
}
void escreve_numero(char *n, unsigned pos)
{
for (; *n; n++, pos++) {
Serial.print(pos);Serial.print(" : ");Serial.println(*n);
EEPROM.write(pos, *n);
}
EEPROM.write(pos, '\0');
Serial.println("------");
}
void ler(int ini, int fim)
{
for (int x=ini; x<fim; x++) {
Serial.print(x);Serial.print(" : ");
char c = EEPROM.read(x);
Serial.println(c);
}
}
/*
void le_numero(char *n, unsigned pos)
{
do {
int c = EEPROM.read(pos++);
*n++ = c;
} while (c != '\0');
}
*/
void loop(){}
Obrigado