DÚVIDA: Recarregar dados da IHM pós reset via watchdog do arduino. - RESOLVIDO

Boa tarde pessoal, estou testando usar um watchdog para fazer o reset de um Arduino que deixo ligado por vários semanas, para caso ele trave por exemplo.

Esse projeto tem alguns dados que são setados via IHM Nextion, são todos dados inteiros, quando efetuo o reset do Arduino o microcontrolador perde os dados, mas eles permanecem na IHM pois esta não é resetada.

O problema é que para que a IHM envie esses dados preciso estar nas telas que possuem esses valores (são 4 telas diferentes), ai os dados são atualizados e tudo funciona, mas quero que esses valores sejam carregados sem necessidade de interação externa.

Como são dados que podem vir a mudar dependendo das minhas necessidades não gostaria de usar a EEPROM para isso.

Uso um Arduino mega2560.

Exibições: 333

Responder esta

Respostas a este tópico

Olá, João Carlos!

   Como programador, sou um cara muito preguiçoso, então, ao invés de escrever o que deveria, copiei e colei abaixo uma resposta do minerin RV a um post recente aqui no Fórum:

"precisamos saber com mais clareza sua dificuldade 

e claro o seu código para o Arduino.

Ao postar aqui seu código, não cole ele na área de texto do tópico.

Anexe-o como um arquivo. "

Basicamente é isto: Precisamos de mais detalhes.

D.T. Ribeiro.

"

Entendo, e não seja por isso segue em anexo Programa.txt

O que ocorre é que eu coloco alguns dados via variáveis na IHM nos campos N8, N9, N10 . . . N24 estas variáveis ficam na tela pois ela não desliga com o reset do watchdog do arduino, porem elas somente recarregam se eu acessar a tela pela IHM (mudar de tela) onde estão gravadas, e essa interação que quero que faça sem necessidade de minha interferência. Não sei se ficou claro.

Olá, João Carlos!

   Se o Arduino for apenas resetado e não desligado, talvez possa ser utilizada a abordagem de definir que estas variáveis não devam ser inicializadas.

   Por exemplo, para implementar um contador de vezes que o Arduino foi resetado, usa-se

   uint16_t contadorDeResets __attribute__ ((section (".noinit")));

   Escrevi em negrito e itálico após uma dica do minerin RV, e também para ele não me xingar por postar código na área do post.   :-)

   Definindo o atributo da variável como pertencente à secção no_init faz com que ela não seja inicializada, mantendo o valor que possuía antes do reset.

   Não analisei o teu código a ponto de saber onde estão as variáveis cujos valores pretendes preservar, mas se puderes colocá-las na memória do µControlador, acho que o truque mencionado resolve.

   Espero ter ajudado.

D. T. Ribeiro.

Olá sim o arduino será resetado, não desligado.  As variáveis que não quero perder são as das linhas 222 a 239, estão entre parênteses.

Ex: NrPorcao

Vou coloca-las num TXT anexo para facilitar, Variaveis.txt 

Poderia me dar um exemplo de onde e como posso implementar esse código que mencionou? 

Olá, João Carlos!

Nunca trabalhei com a biblioteca Nextion, então por favor, diga-me o que fazem as seguintes instruções:

        NexNumber(2, 3, "n10");

e

         n10.getValue(&Hora_Porcao[0]);

D. T. Ribeiro.

Olá D.T. Ribeiro segue abaixo a explicação:

NexNumber(2, 3, "n10");

NexNumber - Tipo de variável para valores numéricos inseridos na IHM;

entre parênteses:

2 - ID da pagina onde se localiza o componente na IHM 

3 - ID do componente (no caso o N10 na IHM)

n10 - nome do componente na IHM onde se insere a informação.

n10.getValue(&Hora_Porcao[0]);

pegue o valor de n10 e grave na variável Hora_Porcao[0] na primeira posição do array.

Não sei se ficou claro.


Olá João Carlos!

   Desculpa a longa demora em responder, mas tive umas emergências na empresa em que trabalho e não me sobrou muito tempo.

   Com relação ao problema da inicialização das variáveis, caso ainda não o tenhas resolvido, tenta trocar o que está nas linhas 90 a 94 pelo que segue para ver se funciona.

uint32_t N_MinRacao __attribute__ ((section (".noinit"))), // Nivel minimo de ração
NrPorcao __attribute__ ((section (".noinit"))), // Armazena o numero de porções diarias
QtdPorcao __attribute__ ((section (".noinit"))), // Armazena a quantidade das porções diarias
Hora_Porcao[6] __attribute__ ((section (".noinit"))), // armazena a hora da primeira porção
Min_Porcao[6] __attribute__ ((section (".noinit"))); // armazena o minuto da primeira porção

Explicação: Estas variáveis estão declaradas na memória do Arduino e, portanto, a menos que seja informado ao compilador que não se deseja inicializá-las, elas o serão.

Quem informa isto é a diretiva __attribute__ ((section (".noinit"))).

D. T. Ribeiro.

Olá, obrigado pelo retorno. Quanto a demora não se preocupe eu tbm estive fora todos esses dias. Já está implementado, vou acompanhar e ver como se comporta e dou um retorno assim que tiver o resultado.

Olá, apenas atualizando, a modificação funcionou já não perco mais os dados ao efetuar o reset via watchdog, do arduino.

Muito obrigado pela ajuda.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço