Introdução à EEPROM no Arduino

Experimente Nosso Instrumento Para Eliminar Problemas





Neste post vamos entender o que é EEPROM, como os dados são armazenados em EEPROM embutida em Placa Arduino Microcontrolador e também testar praticamente como escrever e ler dados na EEPROM por meio de alguns exemplos.

Introdução à EEPROM no Arduino

Por que EEPROM?

Antes de perguntarmos o que é EEPROM? É muito importante saber por que a EEPROM é usada para armazenamento em primeiro lugar. Assim, temos uma ideia clara sobre as EEPROMs.



Existem muitos dispositivos de armazenamento disponíveis atualmente, variando de dispositivos de armazenamento magnético como discos rígidos de computador, gravadores de fita cassete da velha escola, meio de armazenamento óptico como CDs, DVDs, discos Blu-ray e memória de estado sólido como SSD (Solid State Drive) para computadores e cartões de memória, etc.

Trata-se de dispositivos de armazenamento em massa que podem armazenar dados como música, vídeos, documentos, etc., de poucos quilobytes a vários terabytes. Trata-se de memória não volátil, o que significa que os dados podem ser retidos mesmo após o corte de energia para o meio de armazenamento.



O dispositivo que oferece música relaxante ou vídeos de arregalar os olhos, como computador ou smartphone, armazena alguns dados críticos, como dados de configuração, dados de inicialização, senhas, dados biométricos, dados de login, etc.

Esses dados mencionados não podem ser armazenados em dispositivos de armazenamento em massa por razões de segurança e também esses dados podem ser modificados por usuários não intencionalmente, o que pode levar ao mau funcionamento do dispositivo.

Esses dados levam apenas alguns bytes a poucos megabytes, conectar um dispositivo de armazenamento convencional como meio magnético ou óptico a chips de processador não é econômica e fisicamente viável.

Portanto, esses dados críticos são armazenados nos próprios chips de processamento.

O Arduino não é diferente do computador ou smartphones. Existem várias circunstâncias em que precisamos armazenar alguns dados críticos que não devem ser apagados mesmo após o corte de energia, por exemplo, dados do sensor.

Agora, você já deve ter tido uma ideia de por que precisamos de EEPROM em microprocessadores e chips de microcontroladores.

O que é EEPROM?

EEPROM significa Electrically Erasable Programmable Read Only Memory. É também uma memória não volátil que pode ser lida e escrita byte sábio.

Ler e escrever no nível de byte o torna diferente de outras memórias semicondutoras. Por exemplo, memória flash: leitura, gravação e apagamento de dados em bloco.

Um bloco pode ter algumas centenas a milhares de bits, o que é viável para armazenamento em massa, mas não para operações de “memória somente leitura” em microprocessadores e microcontroladores, que precisam acessar dados byte a byte.

Na placa Arduino Uno (ATmega328P) ele possui 1 KB ou 1024 bytes de EEPROM na placa. Cada byte pode ser acessado individualmente, cada byte tem endereço que varia de 0 a 1023 (isso é um total de 1024).

O endereço (0-1023) é um local da memória onde nossos dados serão armazenados.

Em cada endereço, você pode armazenar dados de 8 bits, dígitos numéricos de 0 a 255. Nossos dados são armazenados na forma binária, portanto, se escrevermos o número 255 na EEPROM, ele armazenará o dígito como 11111111 em um endereço e se armazenarmos zero, ele será armazenado como 00000000.

Você também pode armazenar texto, caracteres especiais, caracteres alfanuméricos, etc., escrevendo o programa apropriado.

Os detalhes de construção e o funcionamento não são discutidos aqui, o que pode tornar este artigo demorado e deixá-lo com sono. Vá para o YouTube ou Google, há artigos / vídeos interessantes sobre a construção e funcionamento da EEPORM.

Não confunda EEPROM com EPROM:

Resumindo, a EPROM é uma memória somente leitura eletricamente programável, o que significa que pode ser programada (memória de armazenamento) eletricamente, mas não pode ser apagada eletricamente.

Ele utiliza o brilho da luz ultravioleta acima do chip de armazenamento, que apaga os dados armazenados. EEPROM veio como substituto para EPROM e agora quase não é usado em qualquer dispositivo eletrônico.

Não confunda Memória Flash com EEPROM:

Uma memória flash é um semicondutor e uma memória não volátil que também pode ser apagada e eletricamente programável; na verdade, a memória flash é derivada da EEPROM. Mas o acesso à memória em bloco ou em outras palavras, a forma de acesso da memória e sua construção diferenciam-se da EEPROM.

O Arduino Uno (microcontrolador ATmega328P) também possui 32 KB de memória flash para armazenamento de programas.

Vida útil da EEPROM:

Como qualquer outro meio de armazenamento eletrônico, a EEPROM também possui ciclos finitos de leitura, gravação e exclusão. Mas o problema é que ele tem uma vida útil menor em comparação com qualquer outro tipo de memória semicondutora.

No EEPROM do Arduino, Atmel afirmou cerca de 100.000 (um lakh) de ciclo de gravação por célula. Se a temperatura da sua sala for mais baixa, maior será a vida útil da EEPROM.

Observe que a leitura de dados da EEPROM não afeta significativamente a vida útil.

Existem CIs EEPROM externos que podem ser integrados ao Arduino com facilidade, com capacidade de memória variando de 8 KB, 128 KB, 256 KB, etc., com vida útil de cerca de 1 milhão de ciclos de gravação por célula.

Isso conclui a EEPROM, agora você terá obtido conhecimento teórico suficiente sobre EEPROMs.

Na seção a seguir, aprenderemos como testar a EEPROM no arduino de maneira prática.

Como testar EEPROM no Arduino

Para implementar isso, tudo que você precisa é um cabo USB e uma placa Arduino Uno, você está pronto para começar.

Pelas explicações acima, entendemos que as EEPROMs possuem um endereço onde armazenamos nossos dados. Podemos armazenar de 0 a 1023 locais no Arduino Uno. Cada local pode acomodar 8 bits ou um byte.

Neste exemplo, vamos armazenar dados em um endereço. Para reduzir a complexidade do programa e mantê-lo o mais curto possível, vamos armazenar um número inteiro de um único dígito (0 a 9) em um endereço de 0 a 9.

Código do programa # 1

Agora, faça upload do código para o Arduino:
//------------------Program Developed by R.GIRISH-------------------//
#include
int inputAddress = 0
int inputValue = 0
int ReadData = 0
boolean Readadd = true
boolean Readval = true
void setup()
{
Serial.begin(9600)
Serial.println('Enter the address (0 to 9)')
Serial.println('')
while(Readadd)
{
inputAddress = Serial.read()
if(inputAddress > 0)
{
inputAddress = inputAddress - 48
Readadd = false
}
}
Serial.print('You have selected Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Enter the value to be stored (0 to 9)')
Serial.println('')
while(Readval)
{
inputValue = Serial.read()
if(inputValue > 0)
{
inputValue = inputValue - 48
Readval = false
}
}
Serial.print('The value you entered is: ')
Serial.println(inputValue)
Serial.println('')
delay(2000)
Serial.print('It will be stored in Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Writing on EEPROM.....')
Serial.println('')
EEPROM.write(inputAddress, inputValue)
delay(2000)
Serial.println('Value stored successfully!!!')
Serial.println('')
delay(2000)
Serial.println('Reading from EEPROM....')
delay(2000)
ReadData = EEPROM.read(inputAddress)
Serial.println('')
Serial.print('The value read from Address ')
Serial.print(inputAddress)
Serial.print(' is: ')
Serial.println(ReadData)
Serial.println('')
delay(1000)
Serial.println('Done!!!')
}
void loop()
{
// DO nothing here.
}
//------------------Program Developed by R.GIRISH-------------------//

RESULTADO:

Assim que o código for carregado, abra o monitor serial.

Ele pedirá que você insira o endereço que varia de 0 a 9. A partir da saída acima, eu inseri o endereço 3. Portanto, estarei armazenando um valor inteiro no local (endereço) 3.

Agora, ele solicitará que você insira um valor inteiro de dígito único variando de 0 a 9. A partir da saída acima, eu inseri o valor 5.

Portanto, agora o valor 5 será armazenado na localização do endereço 3.

Depois de inserir o valor, ele gravará o valor na EEPROM.

Ele mostrará uma mensagem de sucesso, o que significa que o valor está armazenado.

Depois de alguns segundos, ele lerá o valor que está armazenado no endereço comentado e o mostrará no monitor serial.

Em conclusão, escrevemos e lemos os valores da EEPROM do microcontrolador do Arduino.

Agora, vamos usar a EEPROM para armazenar a senha.

Estaremos inserindo uma senha numérica de 6 dígitos (nem menos nem mais), ela será armazenada em 6 endereços diferentes (cada endereço para cada dígito) e um endereço adicional para armazenar “1” ou “0”.

Depois de inserir a senha, o endereço adicional armazenará o valor “1” indicando que a senha está definida e o programa solicitará que você insira a senha para ligar o LED.

Se o valor armazenado do endereço adicional for “0” ou qualquer outro valor estiver presente, será solicitado que você crie uma nova senha de 6 dígitos.

Pelo método acima, o programa pode identificar se você já definiu uma senha ou precisa criar uma nova senha.

Se a senha inserida estiver correta, o LED embutido no pino 13 acende, se a senha inserida estiver incorreta, o LED não acenderá e o monitor serial avisará que sua senha está errada.

Código do programa # 2

Agora faça upload do código:
//------------------Program Developed by R.GIRISH---------------//
#include
int passExistAdd = 200
const int LED = 13
int inputAddress = 0
int word1 = 0
int word2 = 0
int word3 = 0
int word4 = 0
int word5 = 0
int word6 = 0
int wordAddress1 = 0
int wordAddress2 = 1
int wordAddress3 = 2
int wordAddress4 = 3
int wordAddress5 = 4
int wordAddress6 = 5
int passwordExist = 0
boolean ReadVal1 = true
boolean ReadVal2 = true
boolean ReadVal3 = true
boolean ReadVal4 = true
boolean ReadVal5 = true
boolean ReadVal6 = true
int checkWord1 = 0
int checkWord2 = 0
int checkWord3 = 0
int checkWord4 = 0
int checkWord5 = 0
int checkWord6 = 0
void setup()
{
Serial.begin(9600)
pinMode(LED, OUTPUT)
digitalWrite(LED, LOW)
passwordExist = EEPROM.read(passExistAdd)
if(passwordExist != 1)
{
Serial.println('Enter a new 6 number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
Serial.println('')
Serial.print(word1)
Serial.print(word2)
Serial.print(word3)
Serial.print(word4)
Serial.print(word5)
Serial.print(word6)
EEPROM.write(wordAddress1, word1)
EEPROM.write(wordAddress2, word2)
EEPROM.write(wordAddress3, word3)
EEPROM.write(wordAddress4, word4)
EEPROM.write(wordAddress5, word5)
EEPROM.write(wordAddress6, word6)
EEPROM.write(passExistAdd,1)
Serial.println(' Password saved Sucessfully!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
if(passwordExist == 1)
{
Serial.println('')
Serial.println('Please enter the 6 digit number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
checkWord1 = EEPROM.read(wordAddress1)
if(checkWord1 != word1)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord2 = EEPROM.read(wordAddress2)
if(checkWord2 != word2)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord3 = EEPROM.read(wordAddress3)
if(checkWord3 != word3)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord4 = EEPROM.read(wordAddress4)
if(checkWord4 != word4)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord5 = EEPROM.read(wordAddress5)
if(checkWord5 != word5)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord6 = EEPROM.read(wordAddress6)
if(checkWord6 != word6)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
digitalWrite(LED, HIGH)
Serial.println('')
Serial.println('LED is ON')
Serial.println('')
Serial.println('Press Reset Button.')
}
}
void loop()
{
}
//------------------Program Developed by R.GIRISH---------------//

RESULTADO:

Abra o monitor serial, ele solicitará que você crie uma senha numérica de 6 dígitos.

Digite qualquer senha de 6 dígitos, anote-a e pressione enter. Agora a senha foi armazenada.

Você pode pressionar o botão reset ou desconectar o cabo USB do PC, o que torna o fornecimento para a placa Arduino interrompido.

Agora, reconecte o cabo USB, abra o monitor serial, que solicitará que você insira a senha de 6 dígitos salva.

Digite a senha correta e o LED acenderá.

Se você quiser alterar a senha, altere o dígito do código:

int passExistAdd = 200

A linha acima é o endereço adicional que discutimos antes. Mude de 6 a 1023. Os endereços de 0 a 5 são reservados para armazenar a senha de 6 dígitos.

A alteração desse endereço adicional enganará o programa, dizendo que a senha ainda não foi criada e solicitará que você crie uma nova senha de 6 dígitos.

Se você tiver alguma dúvida sobre este tutorial EEPROM no Arduino, por favor, expresse nos comentários, você receberá uma resposta rápida.




Anterior: Fonte de alimentação com corte de corrente excessiva usando Arduino Próximo: Carro robô controlado por telefone celular usando módulo DTMF