Bom dia, estou a alguns meses quebrando a cabeça nesse problema,
Estou trabalhando num projetinho de Webserver para ESP8266 onde é utilizado um temporizador com NTP programável para acionar um rele, esta quase pronto, bem leve e rápido, mas me falta a parte de armazenar as variáveis de tempo e o status da GPIO, fiquei empacado nessa parte.
O código que estou disponibilizando esta disponível nesse link
https://github.com/jhon2c/WifiRTC/blob/master/C%C3%B3digo/firmware/...
As variáveis que preciso armazenar em caso de falta de energia ou reinicio da placa por enquanto são:
21 int horaLiga;
22 int minutoLiga;
23 int horaDesl;
24 int minutoDesl;
33 boolean stateRelay;
Qual a melhor forma de armazenar estas variáveis, seria EEPROM ou SPIFFS?
Abaixo como esta ficando a pagina do WebServer
desde de já agradeço
Tags:
Olá,
Tente usar a biblioteca EEPROM, para armazenar poucos dados ela serve.
Aqui um conceito bem claro https://gist.github.com/dogrocker/f998dde4dbac923c47c1
Abs.
CK
CK bom dia,
Obrigado pela dica, vou dar uma estudada para ver se consigo adaptar esse código.
Pelo que já li a respeito do ESP8266 ele não possui EEPROM interna como o Atmega328.
Me corrijam se eu estiver errado. Acho que a biblioteca que o amigo Carlos enviou, possa ser para armazenar dados em uma EEPROM externa (outro chip).
Mas sei que na memória Flash do ESP8266 tem espaço reservado para o usuário.
E o espaço é bem grande! Não sei ainda como usar esse pedaço de memória não volátil.
User parameter area:store user parameters in application, in IOT_Demo, it is the 16KBytes
starting from 0x3C000 , users can RW this area.
Manual = ESP8266 Flash RW Operation
https://espressif.com/sites/default/files/documentation/99a-sdk-esp...
Manual = ESP8266 SDK Getting Started Guide
https://espressif.com/sites/default/files/documentation/2a-esp8266-...
Todos os manuais:
https://espressif.com/en/products/hardware/esp8266ex/resources
Olá amigo J. Gustavo,
você tem razão neste sentido, mas aqui um esclarecedor documento do colega Pedro Minatel para ajudar, acho que isso vai esclarecer melhor o tópico, mas você tem razão EEPROM realmente não tem, mas tem artifícios. Eu pessoalmente emulo esta "EEPROM" nas minhas aplicações IoT usando MQTT.
Link: http://pedrominatel.com.br/pt/esp8266/utilizando-eeprom-do-esp8266/
Abraços!
CK.
Ah bom !
" EEPROM (emulação)
O ESP não tem EEPROM, mas sim uma emulação na memoria flash. Isso significa que a vida útil de escritas na memoria será a mesma da flash, cerca de 10.000 ciclos, e não de uma EEPROM que pode passar de 1 Milhão de ciclos de escrita (no mesmo endereço)."
Corrigindo o Pedro Minatel sobre memórias Flash :
More than 100,000 erase/program cycles
http://www.winbond.com/hq/product/code-storage-flash-memory/serial-...
pois é o Esp tem uma gambiarra de EEPROM emulada, mas não estava muito animado com a historia dos 10.000 ciclos, mas com essa informação ja melhora um pouco.
CK , muito interessante.
Eu estudei postagem do Pedro, mas não entendi a parte dos endereços, por exemplo eu tenho 5 variáveis, como faço para endereça-las usando esse exemplo? funcionaria com strings?
TA,
Sim vai poder usar string, para endereçar o melhor a fazer é estudar o conceito, e aplicar, leia este tópico de 2015
http://labdegaragem.com/forum/topics/salvar-datas-no-eeprom-do-ardu...
E este legado do colega Wiechert:
http://labdegaragem.com/profiles/blog/show?id=6223006%3ABlogPost%3A...
Abs.
CK
CK muito instrutivos os materiais, acho que entendi um pouco mais sobre o tema, o material do Wiechert foi bem esclarecedor.
Tiago, boa noite!
Com as funções disponibilizadas na biblioteca padrão, você só consegue armazenar bytes (0 a 255) . Para gravar Strings você vai ter que usar um artifício.
http://playground.arduino.cc/Code/EepromUtil
Mas no seu caso você quer armazenar somente os horários, correto?
Então as funções padrão já são suficientes.
O que você tem que fazer criar uma variável com endereço inicial da memória e incrementando o endereço cada vez que vai gravar.
Exemplo:
int addr = 0; //endereço inicial
byte var1 = 10;
byte var 2 = 5;
EEPROM.write(addr++, var1); //Grava variável var1 e incrementa o endereço
EEPROM.write(addr, var2); //Grava variável var2
Para ler vai ser a mesma coisa.
Mas o programador tem que saber que var1 está no endereço 0, var2 no 1 e assim por diante.
Para facilitar, você pode definir os nomes das variáveis de endereço com nomes que indiquem o valor que estão armazenando
Se quiser, informe as variáveis que quer armazenar que poderemos ajudar melhor...
Cintra, acho que entendi, modifiquei o meu Sketch, mas ainda não fiz o upload, aparentemente se entendi a logica apresentada por vocês é para estar correta.
por sorte minhas variaveis neste caso são inteiros, e um booleano sendo elas as seguintes:
int horaLiga;
int minutoLiga;
int horaDesl;
int minutoDesl;
boolean stateRelay;
Aonde eu fiz inserção do eeprom eu coloquei o comentario //***eeprom***
segue o link do pastebin, se puder dar uma olhada se estruturei corretamente
Tiago, parece que está OK.
Somente algumas observações:
- Com a EEPROM emulada do ESP, é necessário reservar a memória antes de usar.
EEPROM.begin(5);
No setup
- Depois de gravar, ou quando não estiver usando o recurso.
faça um END
EEPROM.end();
- Não sei se vai ser necessário converter os valores para byte ante de gravar. Faça um teste. Se for necessário, use CAST para cada write:
EEPROM.write(addr, (byte) horaLiga);
- A parte abaixo não entendi. Acho que pode retirar do código:
//***eeprom***
// avança para o próximo endereço indo até o byte 512 da
// EEPROM, quando então retorna para o byte 0.
addr = addr + 1;
if (addr == 512)
addr = 0;
}
Depois nos fale se deu certo!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por