Continuar o funcionamento ao reestabelecer a energia [Resolvido]

Bom dia colegas

Estou com uma questão que ainda não consegui achar a solução, que é a seguinte:

Característica imaginária do projeto:

Um sistema que para seu funcionamento recebe valores e armazena na EEPROM.

Questão:

Imaginando o Sistema em funcionamento gostaria que se comportasse de forma diferente nas seguintes situações:

a) Ao apertar o botão RESET do arduino o sistema parasse de funcionar de fato

b) No caso de falta e o reestabelecimento da energia o sistema voltasse a funcionar normalmente. 

Alguém já implementou esta situação e/ou poderia me auxiliar com uma dica?

Exibições: 298

Responder esta

Respostas a este tópico

Bom dia, 

a) Ao apertar o botão RESET do arduino o sistema parasse de funcionar de fato

Implemente um outro botão que não seja o RESET. E faça o Arduino parar de registrar os valores. 

Funcionou com esta estrutura:

https://pastebin.com/5NNTiJL7

Obrigado!

Fiz acréscimo ao código, adicionando todo raciocínio para o contínuo funcionamento em caso de reestabelecimento da energia após sua "queda" .

Código alterado (mesmo link): https://pastebin.com/5NNTiJL7

Se alguém tiver uma solução mais simples ou melhor, compartilhe por favor.

Sugestões e observações:

Dependendo do cenário e do porte do código a ser implementando, pode haver um grande atraso até a leitura e verificação do estado do botão para então fazer a parada da execução.

Vamos supor o seguinte cenário: 

O dispositivo faz o controle de etapas da uma linha de produção na qual há uma esteira e os produtos passam por 3 processos. O primeiro procedimento é fazer uma furação na peça. O programa espera a conclusão de cada etapa para então dar continuidade no movimento da esteira. Assim, o item vai para o próximo estágio e outro entra no estágio anterior. Cada processo leva em média 30 segundos.


Suponhamos que no 1º processo (furação), a broca tenha ficado presa no objeto e travou o eixo da furadeira, que começa a esquentar rapidamente e precisa ser parada. Para isto, existe um botão de emergência!

Na implementação atual, o botão de parada só é verificado no início de cada ciclo:

void loop()

{

      parar();

      etapa1();  //30s

      etapa2();  //30s

      etapa3();  //30s

}

Conseguiu visualizar o problema?

A linha de produção vai continuar em operação por pelo menos mais 1 minuto, ignorando o apertar do botão de emergência já que a leitura dele só vai ocorrer no início do próximo ciclo. E somente vai parar SE o operador estiver com o botão pressionado na hora em que for realizada a leitura.

Isso no caso de haver a detecção de que a etapa1() foi concluída. Se, por exemplo, o fim dessa for determinada por um fim de curso quando a furadeira volta pra posição inicial e ela não conseguir subir por estar presa na peça, ficará travada na etapa1() ainda tentando realizar a tarefa.



Sugestão:

Trate o botão de parada como um evento de Interrupção. Botões de parada geralmente são utilizados em situações de urgência e precisam realizar a paralisação o mais rápido possível.

Documentação sobre Interrupções:
https://www.arduino.cc/reference/pt/language/functions/external-int...

Olá Joao Vitor 

Muito abrigado pela dica. Ainda não conhecia esta função.

Vou estuda-la, testar pra coloca-la em prática.

Obrigado mesmo!

Por nada! É uma função bem útil.

A critério de testes, caso queira, faça o seguinte procedimento no seu programa atual, adicionando esse trecho no loop. Pode ser dentro do seu else referente ao valor da eeprom:

for(int i=0; i < 100; i++) {

      Serial.println(i);  //Acompanhe a saída no terminal

      delay(500);

}


Verá que mesmo apertando o botão de parada, o programa continuará preso dentro do for até fazer as 100 iterações.

Já usando um attachinterrupt associado ao seu botão de parada, é possível implementar um código que de fato interrompa a rotina a qualquer instante, mesmo que esteja dentro de alguma tarefa ainda não finalizada (um for, um while, um delay, etc...)   :D

Sempre procurei por esta função e nunca tinha encontrado. Vou testar!
Vi que vc comentou no chat sobre estar usando a eeprom para gravar valores... Vou tentar explicar:

Como o objetivo é que o código entre em funcionamento assim que o arduino é ligado ou se houver queda e reestabelecimento da energia, para isso foi usado uma estrutura de seleção, que faz a leitura de um valor na eeprom. Então der um reset o valor não muda e consequentemente o botão RESET do arduino somente vai reinicializar, não vai conseguir parar o arduino e por isso tenho que criar um botão para parar o arduino, quer dizer; reiniciar o arduino mas antes mudar o valor da estrutura de seleção (valor na eeprom). Ai sim ele para!
Para colocar em funcionamento novamente ira precisar de um novo comando/estrutura/botão para mudar o valor na eeprom, mas desta forma se ele estiver em funcionamento e houver queda e reestabelecimento de energia ele ira continuar seu funcionamento.

Em tempo: Sobre a função que criei, de fato, dependendo do local que ela foi inserida no código, não interrompe o "fluxo de execução", precisa terminar, mas para isso chamo ela em vários pontos do código, já que ela só vai funcionar ao apertar o botão, e ai consigo obter o resultado esperado.

Tudo isso por não conhecer e que vou praticar agora com sua informação sobre a função: attachinterrupt.

Obrigado.

Bom dia, Ruyter!


Sobre o comentário da EEPROM no chat, foi baseado apenas no conceito inicial do problema. Depois que abri seu código que notei a necessidade de, uma vez parado, mantê-lo parado em caso de queda e restabelecimento da energia. Aí sim justificou-se o uso da gravação do valor na memória. 

Fui equivocado, de certa forma heheh

Realmente, como você sugeriu, uma das possíveis soluções seria adicionar o "parar()" em diversos locais do código e dentro de iterações (como dentro do for exemplificado). Mas gera uma poluição do código e ainda assim ao menos a iteração em vigência seria executada.

No mais, se tiver alguma dúvida na implementação do attachinterrupt, estamos à disposição.

Beleza!

Qualquer dificuldade quanto a implementação do attachinterrupt te falo.

Acho que este tópico trouxe alguns esclarecimento que possa servir para outros...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço