Boas a todos,
tenho o seguinte problema:
ESP32S com aplicação Blynk.
Tudo funciona bem através da aplicação. Tenho uma entrada Push Button que funciona mais ou menos bem. Se tiver um botão fisico com ligação de cabo até +- 10 cm, liga e desliga muito bem. No caso do comprimento dos 2 fios for superior aos ditos 10 cm, passado uns tempos (20 min +-) a luz acende ou apaga, sem eu ter dado alguma ordem para tal.
Já troquei os pinos de entrada mas acontece o mesmo.
Porque é que o comprimento dos fios interfere com o sistema?
Agradecia ajuda
Obrigado
Ventura
Tags:
olá Mário.
Vi rapidamente seu código "4_Relay_OTA.ino", mas já posso afirmar que ele tem problemas sim com a detecção do acionamento do Push-Button. Vc não está implementando da forma como sugeri no meu último post, e isso é um problema, devido à forma como seu código flui (ou seja, devido à forma como ele é executado).
Mas é de fácil solução.
Assim que possível irei alterar seu código minimamente (mas funcionalmente comentado e organizado), dando o tratamento adequado para a detecção confiável do Push-Button.
Ah, vi que são 4 Push-Button, e caso necessário, aplicarei o tratamento para todos os quatro.
abrçs,
Elcids
Olá Elcids,
muito obrigado.
Eu uso esse sketch tanto para 1 relé como para 4.
Tem estado a funcionar perfeitamente bem. Tanto com o Blynk como com Push Button.
Com a dica do Murta, tem estado estável (desde ontem), coisa que não acontecia.
Agradeço desde já a melhoria que irá fazer no sketch.
Cumprimentos
Mário Ventura
olá Mário.
Analisei com mais detalhes o seu código original.
Sobre o que apontei anteriormente a respeito de como seu código detecta os acionamentos dos Push-Buttons, confirmei depois dessa análise. De fato a forma que vc está detectando os acionamentos, não é a mais adequada. Porém também encontrei no seu código, alguns pontos que ajudaram a diminuir o impacto disso (sem esses pontos, seu código não teria funcionado corretamente). Estes pontos são alguns "delays" inseridos nas funções "relayOnOff" e "with_internet". No entanto, a forma como isso foi feito nestas funções não é das mais adequadas. Então eu acredito que estes "delays" foram "colocados" ali daquela forma, justamente na tentativa de "corrigir" um mal comportamento do código (mas por alguém que não tinha a experiência própria para isto).
Como seu código é bastante simples, achei que seria adequado apenas inserir os "delays" na posição "correta". Por isso, não acrescentei um tratamento mais "sofisticado" para a detecção do acionamento dos Push-Buttons. Este tratamento seria detectar a passagem de "HIGH" para "LOW" e então posteriormente aguardar um tempo de "debouncing" de forma assíncrona (ou seja, sem usar a função "delay" ).
Então o que fiz foi:
1) documentei o código, acrescentando comentários funcionais. Também organizei o código, respeitando a Hierarquia "Top/Down" da Linguagem C/C++ (isso quase não foi necessário, pois seu código estava bem nesta questão).
2) inseri de forma apropriada os "delays" para garantir "debouncing" dos Push-Buttons, e ao mesmo tempo garantir funcionamento adequado ao fluxo da execução. Não se preocupe com o valor de 1 segundo para os delays, pois esse tempo não causa problemas com o Blynk (haveria problema no caso de delays muito altos).
3) para evitar "overflow" no Buffer da Serial (sim isto pode ocorrer no seu código, embora não se perceba), acrescentei uma lógica simples para o "print" que havia no "loop" do Arduino, e dessa forma este "print" só será executado se de fato ocorreu alguma mudança no estado do "Rele 1". Apenas esclarecendo: o problema com o "overflow" do Buffer da Serial, é que quando ele ocorre, ele "trava" a execução do código, pois a execução fica aguardando que o Buffer tenha espaço para novos dados, e a ocorrência deste "travamento" é de certa forma irregular, temporizando forçadamente a execução de uma forma não muito previsível.
4) mínima alteração na ordem de configuração dos Ports na função "setup", de forma a ter uma sequência com mais sentido.
5) também "inverti" a lógica do indicador "wifiFlag". Vc estava usando "lógica negativa", a qual é muito comum em Hardware, mas deve ser evitada em Software. Assim ajustei o código para que o indicador "wifiFlag" trabalhe em "lógica positiva", que faz muito mais sentido. Veja na figura a seguir como estava e como ficou:
(clique na figura para "zoom")
Devido a essa "inversão", a lógica de teste do indicador "wifiFlag" na função "loop", também teve que ser invertida.
Acredito que estas alterações irão te ajudar na manutenção do código. Mas o uso ou não das mesmas, fica a seu critério, pois não são essenciais. Mas peço que vc analise, e considere usá-las.
Segue o código "ajustado": "4_Relay_OTA_02.zip"
E claro, caso em alguma versão posterior do seu Sistema vc conecte Push-Buttons a uma maior distância, siga as recomendações que fiz anteriormente. Os diagramas estão bem detalhados, e assim podem ser facilmente usados.
Encerro aqui minha participação.
abrçs aos patrícios de além mar,
Elcids
Viva Elcids,
muito obrigado pela ajuda e explicação do código.
Irei testar e posteriormente darei feedback.
Desde já o meu muito obrigado a todos
Mário Ventura
Bom dia a todos:
Sugestão para leitura.
O Efeito Bouncing e as técnicas para Debouncing
Vivas a Todos,
muito obrigado ao Murta e Elcids,
Deixo aqui o Link do sistema a funcionar.
Desculpem a qualidade do video e da apresentação mas, foi só para vocês verem como o sistema está a funcionar.
Os módulos fui eu que desenvolvi mas, terei que acrescentar o condensador que o Murta falou. Tenho tido em teste e funciona a 100%.
Obrigado Murta, Obrigado Elcids, Obrigado a todos os que ajudaram.
PS: Aceito criticas :)
Os módulos são de 220v Directos com Saída 220v, ou apenas Relé (Contacto seco). Mas sempre com entrada de 220v.
Mário Ventura
olá Mário.
Vi seu vídeo, e ficou muito legal sua implementação, muito mais do que poderia parecer a questão de um simples "botão". Parabéns pelo resultado alcançado.
Aproveito para algumas observações finais.
Como vc está usando o Pullup interno do ESP32, e conforme vc mesmo constatou, de fato apenas o acréscimo do Capacitor já pode resolver o problema que vc relatou.
No entanto observe que se a distância do "Botão" até o ESP for relativamente grande, é aconselhável seguir as orientações que passei. Estou reforçando isso novamente. Note que além do tratamento em relação à interferência (vc pode conferir em todos os Diagramas que aqui postei que o Capacitor "C1" faz exatamente a mesma coisa que aquele que vc acrescentou), há também cuidados em relação a "spikes" de tensão nos fios do Botão, caso o comprimento desses fios seja longo. Naqueles Diagramas, o Resistor "R2" foi incluído para não depender-se do Resistor de Pullup interno do ESP (que é muito mais "frágil" e pode danificar-se com mais facilidade, pois na realidade não é bem um Resistor). Os demais Resistores, são para proteção dos circuitos, assim como os demais componentes (no caso, Diodos de sinal).
Uma vez confirmado que vc "ligou" o Pullup interno e que a sua ação de apenas acrescentar o Capacitor resolveu o problema relatado, já posso afirmar a origem do problema. O que causava o problema, era o acionamento de algum outro dispositivo ligado à rede elétrica AC. Este outro dispositivo certamente vc conseguiria identificar aí, pois pode ser o liga/desliga de uma Lâmpada (principalmente as que tem algum Reator, como as "econômicas" ou as fluorescentes convencionais), ou o acionamento de um eletroímã de uma Porta elétrica (ou um solenoide associado a esta Porta), ou o liga/desliga automático de um Refrigerador/Freezer ou Condicionador de Ar, ou até mesmo um pequeno Motor (embora mais improvável). No exato momento que era ligado ou desligado este outro dispositivo (que seria o "culpado"), ele injetava um "spike" na rede elétrica AC, e via Fonte do Arduino este "spike" conseguia chegar ao terminal correspondente ao Botão, causando o "falso" acionamento. Na realidade, estes "spikes" ainda continuam sendo gerados, afinal o tal dispositivo ainda deve estar aí, porém agora o Capacitor acrescentado filtra o sinal no pino onde o Botão está conectado (esta filtragem é em relação à alimentação), e assim impede a ocorrência do problema.
Sucesso nos seus projetos.
abrçs,
Elcids
Boa noite Elcids,
detectei um problema neste sketch.
Funciona tudo muito bem mas SÓ quando o sistema está ligado ao Router. Caso tenha o router da net desligado, o Push Button não funciona. Dá a sensação que ele bloqueia enquanto tenta fazer a conexão.
Consegue dar uma ajuda, sff?
Obrigado
MJV
olá Mário.
Este "problema" a que vc se refere, é uma limitação de uma função interna do Blynk, que bloqueia a execução do código quando é perdida a conexão com o Servidor do Blynk hospedado na Internet. A função que causa o bloqueio é chamada a partir do "Blynk.run()" que está no "loop" do Arduino. Logo, este bloqueio ocorre em todos os códigos que usam a Biblioteca do Blynk.
Recentemente, um amigo daqui do LDG teve o mesmo problema. Por coincidência, ele também usava botões (também era uma automação residencial), e quando perdia a conexão com a Internet, o Blynk bloqueava a execução e com isso ele não conseguia controlar nada via botões. Então eu implementei um gerenciamento (via Máquina de Estados) para evitar este bloqueio na execução do código dele. Funcionou como planejado, e não ocorreu mais o "problema".
Claro, isto também é perfeitamente realizável no seu código.
Mas Mário, preciso que vc informe qual código vc está usando atualmente, pois isto não ficou completamente claro. Seria aquele que vc já usava, ou aquele que eu postei aqui com pequenos ajustes?
O que eu postei aqui, tem nome "4_Relay_OTA_02.ino". Se for exatamente este, basta que vc confirme. Mas se for este e vc alterou algo ou se for outro código, peço que post ele aqui para que eu possa fazer as tais implementações para impedir o bloqueio do Blynk.
Na realidade, seria facílimo impedir o bloqueio se a tal função na Biblioteca do Blynk fosse ligeiramente alterada (e sem prejuízo para o funcionamento interno do próprio Blynk). Mas eu particularmente sou contra alterar Bibliotecas dessa forma (somente em último caso, se não tiver uma solução alternativa).
Aproveito para desejar um grande 2022 para os patrícios de "além mar".
Fico no aguardo,
abrçs,
Elcids
Boa tarde Elcids,
muito obrigado pela resposta.
Sim, o código que estou a usar é o 4_Relay_OTA_02.ino.
Funciona bem para 1 ou mais Relés e tem aprovado muito bem com o acrescento do condensador cerâmico.
O único problema é mesmo este, se o Router tiver desligado, os Push Button não funcionam.
Fiz um teste com o sistema a funcionar completo. Depois desliguei o router. Funciona bem. Se fizer um reset ao ESP32 já bloqueia. Se por algum motivo o router avariar ou for trocado por outro com outras credenciais de acesso, o sistema fica inutilizado, não sendo possivel usar os Push Button.
A dúvida é só essa.
Entretanto, irei acrescentar a emissão de IR para controlar aparelhos tais como AC, TV, etc mas, queria resolver este problema primeiro.
Desde já muito obrigado e Feliz Ano Novo para si e para todos do LDG.
Mário Ventura
olá novamente Mário.
Irei postar duas implementações: uma clássica e uma específica para o ESP32. Inicialmente irei postar a clássica, que embora mais complexa, funcionará também para outros Arduinos, e é mais didática e por isso ajuda a se aprender a programar melhor.
Ambas as soluções permitirão depois que sejam acrescentados os controles IR de uma forma harmônica, sem conflitos.
Mas Mário, peço que acrescente aqui seu arquivo "Credenciais.h", onde estão algumas definições e certamente um ou outro "#include", pois isso me permitirá postar um solução completa e equalizar a formatação da implementação. Claro, antes não esqueça de alterar no arquivo os valores de suas credenciais pessoais, "WIFI_SSID", "WIFI_PASS", e "AUTH" do Blynk, para que não fiquem públicas aqui.
Fico no aguardo,
abrçs,
Elcids
Boa tarde Elcids,
Aqui fica o ficheiro completo bem como os respectivos ficheiros de apoio (.h)
Obrigado
Mário Ventura
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por