Pages: [1]   Go Down
Author Topic: ajuda em programação na memoria EEPROM  (Read 1600 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

boa tarde,



poderiam me ajuda com a programação da memoria EEPROM, estou com um problema de armazena dados preciso armazena um valor de 99999.

esse programa deveria armazena dados e recupera-lo  e continuar a medição.

#include <EEPROM.h>
#include <LiquidCrystal.h>
float potencia = 0;
float watts =0;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int leituraeeprom;



void setup()
{
 
  leituraeeprom = EEPROM.read(watts);
 
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("KWH");
  watts = leituraeeprom
 

void loop()
{
 
  float sensor = analogRead(A0);
  float leitura;
 
 
  if (sensor == 512)
 
  {
   sensor = analogRead(A0);
   while(sensor == 512)
   {
   sensor = analogRead(A0);
   }
  }
  if ( sensor > 512)
  {
   potencia = (sensor - 512)*0.00488;
  }
  else
  {
   potencia = ( 512 - sensor)*0.00488;
  }
   
   watts = (watts + (potencia));
   
   lcd.setCursor(4,0);
   lcd.print(watts);
   
   int tempo = (millis()/1000);
   lcd.setCursor(0,1);
   lcd.print(tempo);
   EEPROM.write(0,watts);
   
   
  delay(1000);       
}


se alguém poder me ajuda com esse problema agradeço.
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
esse programa deveria armazena dados e recupera-lo  e continuar a medição.
Nao , nao vai com tanta coisa errada
Quote
float watts =0;
...
int leituraeeprom;
...
leituraeeprom = EEPROM.read(watts);

O que é isto ?
Sabes  que o EEPROM.read() recebe um parametro de uma posiçao de memoria de apenas 1 byte?!
Quote
leituraeeprom = EEPROM.read(watts);
watts = leituraeeprom
O que pretendes com isto ?
Isto até me fez dar uma gargalhada sozinho lol
Quote
float sensor = analogRead(A0);
O analogRead devolve te um int (entre 0 a 1023) e nao um float
Sei que isto nao resolve o teu problema mas começemos por estas correcçoes
Entretanto passa os olhos na documentaçao da eeprom
http://arduino.cc/en/Tutorial/EEPROMRead
http://arduino.cc/en/Tutorial/EEPROMWrite



« Last Edit: September 08, 2013, 06:08:27 pm by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Para escrever na EEPROM, tens de definir um endereço para a tua variável.

Por exemplo, se vais guardar um float, tens de "guardar" 4 bytes. Ou seja, se escreveres o float na posição 0, a próxima variável terá de ser escrita na posição 4. Isso é importante.

Outra coisa importante a pensar é veres se o valor que leste da EEPROM está corrompido/inicializado ou não. Isso é todo um novo problema. smiley-wink
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a ideia principal desse programa era de realiza mediçoes e armazena dados para pode recupera-los ao reinicia o modulo arduino sei que possui variavel errada, porem o comentario que fez HugoPT nao me ajudou estou pensando em salvar esses dados em um cartao microSD de 512MB, porem como posso chama uma linha com os dados e atribui-la em uma variavel para continuar a medição.

Logged

Brasília - DF - Brazil
Offline Offline
Full Member
***
Karma: 3
Posts: 226
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
porem o comentario que fez HugoPT nao me ajudou estou pensando em salvar esses dados em um cartao microSD de 512MB, porem como posso chama uma linha com os dados e atribui-la em uma variavel para continuar a medição.
Ola colega, desculpa se fui muito bruto no meu comentario, nao era minha intensao ...
Bom em relaçao a queres fazer isso com um cartao SD dá mas eu faria com a eeprom talvez do seguinte modo.
Primeiro o que prentedes guardar ?
Os kwh ou apenas os Watts?
Independente da resposta consideremos que tens uma variavel float ja com o que queres.Para poderes guardar essa variavel que é composta por 4 bytes podes usar uma union composta por essa variavel float e outros 4 bytes.
Assim podes depois escrever esses 4 bytes para a eeprom e facilmente recupera-los quando queres.
Interessa relembrar que o numero de vezes que escreves na eeprom é limitado e nao coloques o gravar dos dados na loop descontroladamente.
Em tempos fiz um pequeno projecto para contar peças e apresentar num display 16*2 e quando a energia falhava detectava isso e so nesse momento é que gravava na eeprom.Usava uma pilha de condensadores e um pino digital para detectar a falha da aliementaçao.Ou seja os condensadores sustinham uns segundos o microcontrolador e ele so nesse bocado é que gravava na eeprom.
No momento de arranque recuperava os dados da eeprom.

Na altura fiz o projecto no MikroC para um PIC 16F877 mas a idea é semelhante ao que pretendes.
Neste caso nao usei a union, usei operaçoes de deslocamente mas pode te dar uma idea de como pode ser feito.
Code:
void write_eeprom()
{
eeprom_byte1 = peca & 0xff;
eeprom_byte2 = (peca>> 8) & 0xff;
eeprom_byte3 = (peca>> 16) & 0xff;
eeprom_byte4 = (peca>> 24) & 0xff;
  
EEPROM_Write(0x00, eeprom_byte4);  //Write on eeprom the byte4 @0x00 address
delay_ms(25);
EEPROM_Write(0x01, eeprom_byte3);  //Write on eeprom the byte3 @0x01 address
delay_ms(25);
EEPROM_Write(0x02, eeprom_byte2);   //Write on eeprom the byte2 @0x02 address
delay_ms(25);
EEPROM_Write(0x03, eeprom_byte1);   //Write on eeprom the byte1 @0x03 address
delay_ms(25);
}
//__________________________________
void read_counter_eeprom()
{
read_eeprom_byte4 = EEPROM_Read(0x00);
delay_ms(20);
read_eeprom_byte3 = EEPROM_Read(0x01);
delay_ms(20);
read_eeprom_byte2 = EEPROM_Read(0x02);
delay_ms(20);
read_eeprom_byte1 = EEPROM_Read(0x03);
delay_ms(20);
peca = ( (long)read_eeprom_byte4 << 24) | ((long)read_eeprom_byte3 << 16) | ((int)read_eeprom_byte2 << 8) | read_eeprom_byte1;

  
  
}
Se queres usar a union aqui tens um simples exemplo do poder das unions.

Code:
union Data
{
byte b[3];
float valor;
};

int main( )
{
union Data data;

data.b[0] = 13;
data.b[1] = 13;
data.b[2] = 13;
data.b[3] = 13;

o_teu_float =data.valor;
« Last Edit: September 09, 2013, 12:26:42 pm by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado Hugo estarei realizando teste com esse codigo, mais ja me informei que a memoria EEPROM tem um valor maximo para gravações e no maximo 100mil ciclos estou analisando que no caso a memoria do arduino vai ter um desgaste muito grande pois ira realizar gravações contantemente, por isso veio a ideia do cartao microSD.
Logged

Brasília - DF - Brazil
Offline Offline
Full Member
***
Karma: 3
Posts: 226
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tem a opção de usar uma EEPROM externa também:
http://www.taydaelectronics.com/93c46-at93c46b-1k-serial-eeprom-ic.html

Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Obrigado Hugo estarei realizando teste com esse codigo, mais ja me informei que a memoria EEPROM tem um valor máximo para gravações e no máximo 100mil ciclos estou analisando que no caso a memoria do arduino vai ter um desgaste muito grande pois ira realizar gravações constantemente, por isso veio a ideia do cartao microSD.
Podes apenas gravar na eeprom quando detectares que a alimentação falhou como te sugeri
Quando ao SD card relembro-te que o SD card também tem limite máximo de números de escrita como a eeprom, a diferença é que tens mais espaço ...
Se estas a pensar em estar sempre a gravar os valores actuais na loop acho que vais dar no mesmo.
Imagina que estas até a gravar e falha a energia.Estas a prever isso?
Se estiveres a gravar isso sempre corres o risco de muito provavelmente perderes a energia num momento de falha de energia  o que te ira gerar corrupção nos dados.
A minha solução quando fiz um contador de peças era no momento que detecto que a energia primaria falhou escrevo o mais rápido possível na eeprom apenas uma vez e ficava a espera que o resto da energia na bateria de condensadores falha-se.Assim tinha sempre garantido que escrevi na eeprom os dados em estado seguro sem estar prestes ao CPU entrar em Brown-out reset.
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tambem acho melhor grava apenas quando ocorre queda de energia estarei realizando teste para programa o arduino sobre essa situação, acabei de entender como realiza programação no arduino e nao tenho conhecimento avançado em C++ como pode ter notado, aprendir isso visualizando videos e lendo os tutoriais e bem dificil aprender assim sem suporte, mais valeu o dica e o apoio estarei estudando o codigo e uma forma de armazena os dados.
Logged

0
Offline Offline
Full Member
***
Karma: 2
Posts: 123
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado Hugo estarei realizando teste com esse codigo, mais ja me informei que a memoria EEPROM tem um valor maximo para gravações e no maximo 100mil ciclos estou analisando que no caso a memoria do arduino vai ter um desgaste muito grande pois ira realizar gravações contantemente, por isso veio a ideia do cartao microSD.
os limites de gravação se referem ao pior caso na pior das hipóteses... no link abaixo o cara relata que a EEPROM aguentou 1.200.000 de ciclos de escritas. Um SD tem a mesma vida util da flash do arduino... menor que a EEPROM...
http://tronixstuff.com/2011/05/11/discovering-arduinos-internal-eeprom-lifespan/
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

alguem tem ideia de como posso fazer aloca o numero na memoria com a seguinte condição:

numero inteiro 98756 esse pode varia
 

gostaria de armazena cada numero em um espaço da memoria tipo
EEPROM(0,6)
EEPROM(1,5)
EEPROM(2,7)
EEPROM(3,8)
EEPROM(4,9)
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3104
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu sinceramente odeio essa classe EEPROM do Arduino, principalmente porque é inútil.

Se deres uma olhada aqui:

http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

tens as funções da AVR libc para usar a eeprom e são bem mais funcionais.

Para o que tu queres seria assim:

Code:
#include <avr/eeprom.h>
....
eeprom_write_dword(0, 98756);

Que é bem mais simples do que usar a EEPROM do Arduino. smiley
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1414
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
eeprom_write_dword(0, 98756);
Esta instruçao dara para escreveres no endereço 0 mas caso queiras escrever numa posiçao diferente de 0 tens de fazer um cast ao valor passado no parametro do endereço.
Isto porque a funçao eeprom_write_dword() espera um endereço do tipo ponteiro nao um int
Algo assim ira encher apartir do byte 4 da eeprom as 4 posiçoes seguintes com 0xFF


Code:
#include <avr/eeprom.h>
void setup()
{
Serial.begin(9600);
eeprom_write_dword((uint32_t *)4, 4294967295);
}
void loop()
{

}

Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

realizei o seguinte procedimento
a variavel watts e unsigned int


   watts = watts + ((potencia/10));   
 int leitura = digitalRead(3);
 if (leitura == 0)
 {
     digitalWrite(13, 1);
     Serial.println(" esta  calulando ");
    if( watts < 10 && watts >0 )
       {
        EEPROM.write(0,watts);
        EEPROM.write(1,0);
        EEPROM.write(2,0);
        EEPROM.write(3,0);
        EEPROM.write(4,0);
       }
       
       if( watts >9 && watts <100)
       {
        a = watts;
        b = watts;
        y = (b%100 - b%10)/10;
        x = (a%10);
        EEPROM.write(0,x);
        EEPROM.write(1,y);
        EEPROM.write(2,0);
        EEPROM.write(3,0);
        EEPROM.write(4,0);
       }
       
        if( watts > 99 && watts < 1000)
         {
           a = watts;
           b = watts;
           c = watts;
         
           z = (c%1000- c%100)/100;
           y = (b%100 - b%10)/10;
           x = (a%10);
           EEPROM.write(0,x);
           EEPROM.write(1,y);
           EEPROM.write(2,z);
           EEPROM.write(3,0);
           EEPROM.write(4,0);
         }
         if( watts > 999 && watts < 10000)
          {
             a = watts;
             b = watts;
             c = watts;
             d = watts;
           w = (d%10000- d% 1000)/1000; 
           z = (c%1000- c%100)/100;
           y = (b%100 - b%10)/10;
           x = (a%10);
           EEPROM.write(0,x);
           EEPROM.write(1,y);
           EEPROM.write(2,z);
           EEPROM.write(3,w);
           EEPROM.write(4,0);
          }
         
          if( watts > 9999 && watts < 100000)
           {
             a = watts;
             b = watts;
             c = watts;
             d = watts;
             e = watts;
             k = (e%100000 - e%10000)/10000;
             w = (d%10000- d% 1000)/1000; 
             z = (c%1000- c%100)/100;
             y = (b%100 - b%10)/10;
             x = (a%10);
             EEPROM.write(0,x);
             EEPROM.write(1,y);
             EEPROM.write(2,z);
             EEPROM.write(3,w);
             EEPROM.write(4,k);
       }         
  }
       
   Serial.println(watts);
  delay(100);       
}
Logged

Pages: [1]   Go Up
Jump to: