Menu para gravar valores na eprom.-[resolvido] - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-28T10:50:53Zhttps://labdegaragem.com/forum/topics/menu-para-gravar-valores-na-eprom?commentId=6223006%3AComment%3A884335&feed=yes&xn_auth=noAnexo o código final.
Achei '…tag:labdegaragem.com,2022-06-25:6223006:Comment:8843712022-06-25T20:52:49.427ZReinaldo de Souzahttps://labdegaragem.com/profile/ReinaldodeSouza
<p>Anexo o código final.</p>
<p>Achei 'muito fácil a parte da gravação e leitura na eeprom, mesmo sabendo que a biblioteca que faz tudo.</p>
<p>Críticas e sugestões são bem vindas.</p>
<p>Abraço a todos...</p>
<p>Att.:Reinaldo de Souza</p>
<p>Anexo o código final.</p>
<p>Achei 'muito fácil a parte da gravação e leitura na eeprom, mesmo sabendo que a biblioteca que faz tudo.</p>
<p>Críticas e sugestões são bem vindas.</p>
<p>Abraço a todos...</p>
<p>Att.:Reinaldo de Souza</p> Que bom que você conseguiu de…tag:labdegaragem.com,2022-06-24:6223006:Comment:8843702022-06-24T16:39:52.401Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p>Que bom que você conseguiu desenvolver seu código, e que bom que consegui ser útil.</p>
<p>Caso tenham mais dúvidas, pode postar.</p>
<p></p>
<p>Quando todas as dúvidas referentes a este tópico estiverem sanadas, não esqueça de adicionar um "resolvido".</p>
<p>Que bom que você conseguiu desenvolver seu código, e que bom que consegui ser útil.</p>
<p>Caso tenham mais dúvidas, pode postar.</p>
<p></p>
<p>Quando todas as dúvidas referentes a este tópico estiverem sanadas, não esqueça de adicionar um "resolvido".</p> Bom dia D.T.
Um flag no loop…tag:labdegaragem.com,2022-06-24:6223006:Comment:8843682022-06-24T11:53:16.534ZReinaldo de Souzahttps://labdegaragem.com/profile/ReinaldodeSouza
<p>Bom dia D.T.</p>
<p>Um flag no loop que vai me indicar e controlar em qual menu estou. Qdo estiver no setup pretendo fazer um temporizador com o millis e caso atinja um tempo pré determinado este mudara a flag voltando ao menu da rotina normal. Até então não estava compreendendo bem essa situação no loop, mas acho que agora entendi direito.</p>
<p>Att.:Reinaldo de Souza</p>
<p>Bom dia D.T.</p>
<p>Um flag no loop que vai me indicar e controlar em qual menu estou. Qdo estiver no setup pretendo fazer um temporizador com o millis e caso atinja um tempo pré determinado este mudara a flag voltando ao menu da rotina normal. Até então não estava compreendendo bem essa situação no loop, mas acho que agora entendi direito.</p>
<p>Att.:Reinaldo de Souza</p> Bom dia Tiago..
Você me ajudo…tag:labdegaragem.com,2022-06-24:6223006:Comment:8845222022-06-24T11:48:30.380ZReinaldo de Souzahttps://labdegaragem.com/profile/ReinaldodeSouza
<p>Bom dia Tiago..</p>
<p>Você me ajudou muito mesmo. Abriu minha cabeça para coisas que não tinha percebido.</p>
<p>Diante deste último post seu consegui destravar o que me prendia na etapa final do entendimento.</p>
<p>Acho que agora vou conseguir terminar esta primeira parte que é do menu. Paralelo a isso já estou vendo a parte da gravação/leitura ma EEPROM.</p>
<p>Vou informando sobre o andamento.</p>
<p>Novamente obrigado.</p>
<p>Bom dia Tiago..</p>
<p>Você me ajudou muito mesmo. Abriu minha cabeça para coisas que não tinha percebido.</p>
<p>Diante deste último post seu consegui destravar o que me prendia na etapa final do entendimento.</p>
<p>Acho que agora vou conseguir terminar esta primeira parte que é do menu. Paralelo a isso já estou vendo a parte da gravação/leitura ma EEPROM.</p>
<p>Vou informando sobre o andamento.</p>
<p>Novamente obrigado.</p> Veja... eu entendo que é comu…tag:labdegaragem.com,2022-06-24:6223006:Comment:8842952022-06-24T04:21:17.654Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p>Veja... eu entendo que é comum essa agonia por ver algo pronto, todo mundo em algum momento é assim, e quando me deparo com algo que foge muito do meu conhecimento, eu também penso assim (o trabalho com os cores separados, por exemplo, estou tendo dificuldades).</p>
<p></p>
<p>Com relação a eu ter me confundido, não, não me confundi. Não vim fazer seu código, vim te ensinar uma linha lógica para você fazer o seu código da forma mais bacana que você acreditar que fique e, se deus permitir,…</p>
<p>Veja... eu entendo que é comum essa agonia por ver algo pronto, todo mundo em algum momento é assim, e quando me deparo com algo que foge muito do meu conhecimento, eu também penso assim (o trabalho com os cores separados, por exemplo, estou tendo dificuldades).</p>
<p></p>
<p>Com relação a eu ter me confundido, não, não me confundi. Não vim fazer seu código, vim te ensinar uma linha lógica para você fazer o seu código da forma mais bacana que você acreditar que fique e, se deus permitir, que você possa passar o conhecimento para outras pessoas no futuro (virando um efeito dominó).</p>
<p></p>
<p>Outra coisa, esse negócio de "Sair do loop()", dentro da estrutura básica do arduino IDE, <span style="text-decoration: underline;"><strong>até onde sei</strong></span>, não existe. A não ser que fizesse um loop infinito no setup(), mas ai nunca iria entrar no loop().</p>
<p></p>
<p><strong>-Te confesso que mesmo lendo o que vc postou não entendi o pq nesta minha situação, mas não estou dizendo que fiz certo, continuo a tentar aprofundar..</strong></p>
<p></p>
<p><span>Eu desconheço uma forma de alterar o "menu", sem uma variável para definir o menu que será exibido. No caso em questão, seria para produzir 2 menus. (bool possui 2 números, 1 e 0, logo, 2 menus). E se tiver 10 menus? vai precisar, no minimo, de um byte (255 var). e se tiver 5000 janelas de menu? ai vai precisar definir como int.... No final, até onde tenho conhecimento, você precisará de uma referência </span></p>
<p></p>
<p>As opções, a partir desta, são infinitas. exemplo:</p>
<p>variavel = 0, menu 0;</p>
<p>variavel = 1, menu 1;</p>
<p>variavel = 2, menu 2;</p>
<p>variavel = 3, menu 3;</p>
<p>variavel = 4, menu 4;</p>
<p>variavel = 5, menu 5;</p>
<p></p>
<p></p>
<p><strong>-sobre o while + delay();</strong></p>
<p></p>
<p>Entendi sua ideia. É funcional.</p>
<p></p>
<p></p>
<p><strong>Vou tentando mais aqui, mas se você puder ajudar de uma forma mais direta nesta situação, pois como pode ver já tenho um certo nível de conhecimento, agradeceria muitoooooo.</strong></p>
<p></p>
<p>Realmente, entendo que me esforcei para ser didático e que, direeeeeeeeeto direeeeeeeto eu não fui, mas é uma estrutura bem simples. Mas tudo bem, vou ser BEM direto.</p>
<p></p>
<p>Eu gosto de fazer assim nos meus códigos, pois me possibilita um número grande de quadros, sem deixar bagunçado.</p>
<p></p>
<p>0- crie uma função "menu" e jogue no loop().</p>
<p>1- Dentro dela, crie um switch/case.</p>
<p>2- defina a variável da mesma para o número de menus do seu interesse</p>
<p>3- dentro dos cases, chame a função correspondente a cada menu</p>
<p>4- dentro das funções, crie o visual e defina o recurso para os botões.</p>
<p>5- Caso esteja tendo algum tipo de gargalo, provavelmente será em relação a tela.</p>
<p>6- neste caso, crie uma condição para atualizar a tela apenas quando tiver alteração do visual.</p>
<p></p>
<p>indicação de leitura:</p>
<p><a rel="nofollow noopener" href="https://www.arduino.cc/reference/pt/language/structure/control-structure/switchcase/" target="_blank">https://www.arduino.cc/reference/pt/language/structure/control-stru...</a></p>
<p></p>
<p>Essa mesma estrutura tem em um desses vídeos que postei anteriormente, é em português. Se não for exatamente desse jeito, é MUITO parecido.</p>
<p></p>
<p>Caso ainda tenha ficado alguma dúvida, pode perguntar.</p> Olá, Reinaldo!
Eu não sei…tag:labdegaragem.com,2022-06-23:6223006:Comment:8844272022-06-23T01:34:26.073ZD. T. Ribeirohttps://labdegaragem.com/profile/DanielTozziRibeiro
<p>Olá, Reinaldo!</p>
<p></p>
<p> Eu não sei se entendi direito, mas será que você não teria que definir primeiro qual é a condição de saída do Menu? Tempo? Uma outra tecla específica?</p>
<p></p>
<p> Sem definir isto não tem como saber que o usuário deseja encerrar a entrada de dados e que os dados poderão ser gravados.</p>
<p></p>
<p> Quando isto for definido, você poderá usar um <em>while</em> para se manter no Menu até que a condição do <em>while</em> indique que terminou a entrada de…</p>
<p>Olá, Reinaldo!</p>
<p></p>
<p> Eu não sei se entendi direito, mas será que você não teria que definir primeiro qual é a condição de saída do Menu? Tempo? Uma outra tecla específica?</p>
<p></p>
<p> Sem definir isto não tem como saber que o usuário deseja encerrar a entrada de dados e que os dados poderão ser gravados.</p>
<p></p>
<p> Quando isto for definido, você poderá usar um <em>while</em> para se manter no Menu até que a condição do <em>while</em> indique que terminou a entrada de dados.</p>
<p></p>
<p> É isto ou chutei muito longe?</p>
<p></p>
<p>Abração.</p>
<p></p>
<p>D. T. Ribeiro.</p>
<p></p>
<p></p> Olá Tiago.
O que eu tentei fo…tag:labdegaragem.com,2022-06-22:6223006:Comment:8844162022-06-22T21:18:31.993ZReinaldo de Souzahttps://labdegaragem.com/profile/ReinaldodeSouza
<p>Olá Tiago.</p>
<p>O que eu tentei foi aplicar suas instruções e ver o resultado prático, já que tenho todo este montado.</p>
<p></p>
<p>Agora acho que vc se confundiu um pouco, minhas chaves estão na configuração INPUT_PULLUP, portanto quando acionadas vão para o nível LOW para fazer verdadeiro a condição. Verifique..</p>
<p></p>
<p><strong>Da linha 63 a 68</strong><span>, você removeu a chave mágica que.....</span></p>
<p><span>-Te confesso que mesmo lendo o que vc postou não entendi o pq…</span></p>
<p>Olá Tiago.</p>
<p>O que eu tentei foi aplicar suas instruções e ver o resultado prático, já que tenho todo este montado.</p>
<p></p>
<p>Agora acho que vc se confundiu um pouco, minhas chaves estão na configuração INPUT_PULLUP, portanto quando acionadas vão para o nível LOW para fazer verdadeiro a condição. Verifique..</p>
<p></p>
<p><strong>Da linha 63 a 68</strong><span>, você removeu a chave mágica que.....</span></p>
<p><span>-Te confesso que mesmo lendo o que vc postou não entendi o pq nesta minha situação, mas não estou dizendo que fiz certo, continuo a tentar aprofundar..</span></p>
<p></p>
<p><span><strong>Na linha 75</strong>, você cria um if referenciando o GPIO, mas logo a baixo, cria um while com a mesma..</span></p>
<p><span>-Este while é muito usado neste caso, pois é para evitar que a variável incremente ou decremente repetidamente, isso obriga o usuário a soltar e apertar novamente a tecla caso queira mais de um.</span></p>
<p></p>
<p><span><strong>Na linha 91 e 95</strong> você repete o mesmo erro que acabei de citar...</span></p>
<p><span>-mesma caso acima, novamente repare que meus botões são do tipo PULLUP, ou seja, LOW que é verdadeiro.</span></p>
<p><span>if (digitalRead(botao_mais) == LOW) { // se botao_mais foi pressionado </span></p>
<p><span>Variavel_de_dados = Variavel_de_dados + 1; //incremente +1.<br/> while(digitalRead(botao_mais)==LOW) delay(100); //enquanto botao_mais estiver pressionado, fique aqui.</span></p>
<p></p>
<p><span>Vou tentando mais aqui, mas se você puder ajudar de uma forma mais direta nesta situação, pois como pode ver já tenho um certo nível de conhecimento, agradeceria muitoooooo.</span></p>
<p>Att.:Reinaldo de Souza</p>
<p></p> Olá Reinaldo de Souza
O que…tag:labdegaragem.com,2022-06-22:6223006:Comment:8843412022-06-22T15:48:20.416Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p>Olá <span> </span><a class="fn url" href="https://labdegaragem.com/forum/topic/listForContributor?user=2n11w48jvml99">Reinaldo de Souza</a></p>
<p></p>
<p>O que estou te passando é quase um passo-a-passo simplista de como criar o código que você precisa. "Simplista" pois o objetivo é lhe possibilitar a <span style="text-decoration: underline;"><strong>compreensão</strong></span> de como produzir aquilo que você sugeriu, e para isso, eu ignorei performance geral e…</p>
<p>Olá <span> </span><a href="https://labdegaragem.com/forum/topic/listForContributor?user=2n11w48jvml99" class="fn url">Reinaldo de Souza</a></p>
<p></p>
<p>O que estou te passando é quase um passo-a-passo simplista de como criar o código que você precisa. "Simplista" pois o objetivo é lhe possibilitar a <span style="text-decoration: underline;"><strong>compreensão</strong></span> de como produzir aquilo que você sugeriu, e para isso, eu ignorei performance geral e armazenamento..</p>
<p></p>
<p>Veja que não me aprofundei em vários pontos (pois iria ter que fazer um tópico dedicado só para isso), e deixei a seu critério fazer algumas pesquisas, <span style="text-decoration: underline;">CASO fosse necessário</span>, de itens como: debounce e type data.</p>
<p></p>
<p>Com relação a seu novo código.... veja, vamos fazer uma análise rápida.</p>
<p></p>
<p><strong>Da linha 63 a 68</strong>, você removeu a chave mágica que tínhamos criado. Não tem problema, entretanto, do jeito que está, isso fará a chamada da nova função 10...50...100...1000....50000 vezes (a depender do poder de processamento do seu controlador) dentro de 1 segundo. Isso é desejado? Se sim, ok. Caso contrário, seria bom rever isso.</p>
<p></p>
<p>A solução que apresentei é a mais simples que tem. Caso queira seguir dessa forma, recomendo adicionar um delay após a chamada da função, mas, ainda assim, você precisará trabalhar em uma nova lógica para alternar entre os menus. Talvez criar uma chave interna.</p>
<p></p>
<p><strong>Na linha 75</strong>, você cria um if referenciando o GPIO, mas logo a baixo, cria um while com a mesma condição e colocando um delay atrelada a ela. Esse while é redundante. Se entendi direito, caso você remova-o, mas mantenha o "delay()", nada irá mudar. Pelo que fui capaz de entender, a lógica que você fez, está parecida com essa:</p>
<ul>
<li>if (gpio == true){</li>
<li>if (gpio == true){</li>
<li>// conteúdo</li>
<li>} }</li>
</ul>
<p></p>
<p>Não importa o que você faça, as duas condições serão iguais. Se uma for verdadeira, a outra também será (a não ser que você vá par um nível mais baixo de programação, para alterar registros ou algo assim, mas é um caminho bem ruim).</p>
<p></p>
<p><strong>Na linha 91 e 95</strong> você repete o mesmo erro que acabei de citar.</p>
<p></p>
<p></p>
<p>Veja... Uma dica que dou é: por mais desconfortável que possa parecer no início, mas não tente atropelar o processo. Para que você faça o que precisa, você precisa entender como o código funciona. Para isso, temporariamente, esqueça seu código e tente entender como a lógica funciona. Desta forma, você poderá sempre editar seu código do jeito que lhe for mais conveniente e sem precisar da ajuda de terceiros. </p>
<p></p>
<p>Já pensou se você tem uma necessidade em uma hora qualquer, e a cabeça da um "branco total" por desconhecimento? Ai você terá que pedir que alguém faça o serviço. Mas e se não tiver ninguém para fazer? Ai complica.</p>
<p></p>
<p>Recomendo que veja as postagens anteriores novamente e tente compreender o que foi passado. Caso tenha dúvidas, <span style="text-decoration: underline;"><strong>PODE PERGUNTAR A VONTADE</strong></span>. O fórum serve justamente para que as pessoas possam se ajudar e aprender.</p>
<p></p>
<p></p>
<p>Caso não simpatize com o método sugerido, não tem problema (isso pode acontecer, pois nem todo mundo vibra da mesma forma). Podemos aguardar outro membro aqui do fórum contribuir com a postagem. Outra alternativa é que existem vários vídeos no youtube que trazem uma forma de produzir um menu. Dentre os canais, tem 2 que recomendo.</p>
<p></p>
<p>1- Brincando com ideias</p>
<p>2- WrKits channel</p>
<p></p>
<p>O primeiro é mais "introdutório", para usuários que tem pouco conhecimento ou nenhum. O segundo já é para quem tem alguma base da coisa (mas ele também é bem simples e didático! trás alguns conteúdos do absoluto zero. muito bom!)</p>
<p></p>
<p>Links do Wrkits (referencia para estudo):</p>
<p>- <a href="https://www.youtube.com/watch?v=Swr2Q1IFiBM" target="_blank" rel="noopener">Menu para display LCD | Curso de Arduino #029</a></p>
<p>- <a href="https://www.youtube.com/watch?v=1XO13niGXps" target="_blank" rel="noopener">Sub Menu para display LCD | Curso de Arduino #061</a></p>
<p>- <a href="https://www.youtube.com/watch?v=tRoznRBYQHA" target="_blank" rel="noopener">Menu em formato de lista para LCD | Curso de Arduino #134</a></p>
<p>- <a href="https://www.youtube.com/watch?v=4jL05SpD8lM&t=23s" target="_blank" rel="noopener">Menu em lista horizontal para LCD | Curso de ARduino #138</a></p>
<p>- <a href="https://www.youtube.com/watch?v=Z1UGGcB4fYo" target="_blank" rel="noopener">Menu em forma de lista profissional | Curso de Arduino #281</a></p>
<p>- <a href="https://www.youtube.com/watch?v=W2jvVSR1Kj0" target="_blank" rel="noopener">Menu Profissional em lista e ajuste de parâmetros | Curso de Arduino #282</a></p>
<p> </p>
<p></p>
<p>No mais, de forma menos simples, podemos escrever um menu baseado num aglomerado de funções, com chamadas gerenciadas através de um switch/case, utilizando uma variável global para alternar sua posição. Eu uso desta forma, também é simples, mas é menos simples que a opção que lhe sugeri.</p>
<p></p>
<p>Sobre o eeprom, eu não cheguei neste ponto com você, pois penso que você primeiro precisa construir a lógica, para depois fechar com chave de ouro. Mas isso não quer dizer que você não possa saber sobre o assunto, muito pelo contrário, conhecimento é sempre válido.</p>
<p></p>
<p>Qualquer dúvida, estou as ordens.</p> Bom dia Tiago. Primeiramente…tag:labdegaragem.com,2022-06-22:6223006:Comment:8841952022-06-22T12:33:06.164ZReinaldo de Souzahttps://labdegaragem.com/profile/ReinaldodeSouza
<p>Bom dia Tiago. Primeiramente muito obrigado por ajudar..</p>
<p></p>
<p>Porém não é bem isso, isso que vc me mostrou eu já faço mas não é o que eu preciso.</p>
<p>Eu preciso que quando a condição de void menu_ativo(); seja verdadeira que saia do void loop e fique somente nela para alterar e gravar duas variáveis inteiras na eprom. Quando reinicializar o void setup pegue os novos valores anteriormente gravado no void menu_ativo, entendeu ?</p>
<p></p>
<p>Eu até atualizei o código para você…</p>
<p>Bom dia Tiago. Primeiramente muito obrigado por ajudar..</p>
<p></p>
<p>Porém não é bem isso, isso que vc me mostrou eu já faço mas não é o que eu preciso.</p>
<p>Eu preciso que quando a condição de void menu_ativo(); seja verdadeira que saia do void loop e fique somente nela para alterar e gravar duas variáveis inteiras na eprom. Quando reinicializar o void setup pegue os novos valores anteriormente gravado no void menu_ativo, entendeu ?</p>
<p></p>
<p>Eu até atualizei o código para você ver.</p>
<p></p>
<p>Obrigado.</p> ETAPA 3 (Se estiver habilitad…tag:labdegaragem.com,2022-06-22:6223006:Comment:8843352022-06-22T04:24:18.043Ztiago merceshttps://labdegaragem.com/profile/tiagomerces
<p><span style="font-size: 14pt;"><strong>ETAPA 3</strong></span> (<span>Se estiver habilitado, ele gera recurso para outros 2 botões)</span></p>
<p></p>
<p><span>Aqui, é mais fácil ainda, e você vai concordar comigo!</span></p>
<p><span>Lembra que temos uma variável responsável por uma chave? a nossa "chave_menu" ? Então... ela não vai ser usada agora. </span></p>
<p></p>
<p><span>Como nosso objetivo é colocar 2 botões para funcionar, que até então não funcionavam (pois precisava apertar o…</span></p>
<p><span style="font-size: 14pt;"><strong>ETAPA 3</strong></span> (<span>Se estiver habilitado, ele gera recurso para outros 2 botões)</span></p>
<p></p>
<p><span>Aqui, é mais fácil ainda, e você vai concordar comigo!</span></p>
<p><span>Lembra que temos uma variável responsável por uma chave? a nossa "chave_menu" ? Então... ela não vai ser usada agora. </span></p>
<p></p>
<p><span>Como nosso objetivo é colocar 2 botões para funcionar, que até então não funcionavam (pois precisava apertar o botão por 5 segundos, correto?), e também para fugir de muita "poluição visual", iremos criar uma nova função. </span></p>
<p></p>
<p>Essa nova função, iremos chamar de... "botoes_ativos", ou "menu_ativo", ou o que você achar melhor. Eu irei usar o "menu_ativo", pois combina mais. <span style="text-decoration: underline;">E o objetivo dela é mudar os valores de uma variável ao pressionar um determinado botão.</span></p>
<p></p>
<p>obs- Vale lembrar, que a criação de uma nova função fica FORA da função setup() e loop(), ok?</p>
<p></p>
<ul>
<li>void menu_ativo(){} // assim será chamada nossa função.</li>
</ul>
<p></p>
<p>Obs2- o conteúdo de uma função fica sempre dentro das chaves! "{}"</p>
<p></p>
<p>Agora precisamos de 2 novos botões para trabalhar dentro da função "menu_ativo". Para isso, vamos seguir o exemplo da primeira etapa, e <span style="text-decoration: underline;"><strong>ADICIONAR</strong></span>, na função <span style="text-decoration: underline;"><strong>SETUP()</strong></span> os pinos que receberão os sinais dos botões utilizando o "pinMode(pin, status)"</p>
<ul>
<li>void setup(){ </li>
<li>pinMode(Def_NumBotao_2, INPUT); // define um pino como entrada</li>
<li>pinMode(Def_NumBotao_3, INPUT); // define outro pino como entrada</li>
<li>// outros itens adicionados anteriormente </li>
<li>}</li>
</ul>
<p></p>
<p>Em seguida, iremos até o nosso "void menu_ativo(){}" e criaremos novas condições de leitura dos botões.</p>
<ul>
<li>void menu_ativo(){</li>
<li>if (digitalRead(Def_NumBotao_2) == HIGH){</li>
<li>// se verdadeiro</li>
<li>}</li>
<li>else if (digitalRead(Def_NumBotao_3) == HIGH){</li>
<li>// se verdadeiro</li>
<li>}</li>
</ul>
<p></p>
<p>Por fim, iremos criar uma variável qualquer, para alterar o valor dela. Vamos chama-la de "Variavel_de_dados", entretanto, diferente das anteriores, não podemos defini-la como "bool", caso contrário ela estaria limitada a apenas 0 e 1. Podemos declara-la como "byte", mas vai de 0 a 255... Mas no meu planejamento, eu quero que ele passe de "1000", então vou defini-lo como "int".</p>
<p></p>
<ul>
<li>int Variavel_de_dados;</li>
</ul>
<p></p>
<p><em>Para saber sobre o tamanho dos tipo de variáveis, você pode olhar <a href="https://robotresearchlab.com/2016/11/14/variable-data-types/" target="_blank" rel="noopener">ESTE SITE</a> ou <a href="https://www.arduino.cc/reference/pt/" target="_blank" rel="noopener">ESTE SITE</a> entretanto, alguns micro controladores tem um range um pouco diferente em alguns tipos de variáveis em específico (Arduino e Esp32, por exemplo). Então, caso haja a necessidade, você deverá buscar sobre o tipo que mais se adequa a sua realidade, ou então declarar como int ou long, e esquecer dos limites pequenos (ao custo de memória - Isso se torna um problema se seu código for grande, caso contrário... tanto faz).</em></p>
<p></p>
<p>Então, voltamos para a função "menu_ativo()", e iremos fazer o seguinte:</p>
<p>- Se o botãoA foi pressionado, ele irá adicionar "1" a "Variavel_de_dados"</p>
<p>- Se o botãoB foi pressionado, ele irá REDUZIR "1" da "Variavel_de_dados"</p>
<p></p>
<p>Ou seja, até o momento, o que <span style="text-decoration: underline;"><strong>ADICIONAMOS</strong></span> FOI ISSO (NA ETAPA 3) <a href="https://pastebin.com/h3FtEfnc" target="_blank" rel="noopener">(LINK DO CÓDIGO AQUI)</a></p>
<p></p>
<p>O código completo, até o momento, fica assim: <a href="https://pastebin.com/UdUdGgsY" target="_blank" rel="noopener">(LINK DO CÓDIGO AQUI)</a></p>
<p>Principais mudanças:</p>
<p>- Linha 3 e 4 (definições/links/atalhos)</p>
<p>- Linha 9 (declaração de variável)</p>
<p>- Linha 14 e 15 (definição do modo de funcionamento do GPIO)</p>
<p>- Linha 46 a 52 (função menu_ativo())</p>
<p></p>
<p></p>
<p>Se você chegou até aqui, ENTENDEU E TESTOU TUDO, perceberá uma coisa. Os botões novos não funcionam!!!!!!! E sabe o motivo? Pois não adicionamos o nosso recurso "mestre", a variável "<span>chave_menu", que criamos lááááááááá atrás!</span></p>
<p></p>
<p>E agora? o que faremos? Iremos usar esta variável (que é controlada pelo botão que precisa ser pressionado por 5 segundos), para (des)ativar a nossa função!</p>
<p></p>
<p><em>Novamente, existem várias formas de fazer isso, mas estou apresentando uma forma que, dentro do meu entendimento (que não é uma verdade absoluta), seja menos difícil de visualizar.</em></p>
<p></p>
<p>Então faremos o seguinte: Se "<span>chave_menu" for igual a 1, a função "menu_ativo" irá funcionar. Caso contrário, a função ficará desativada! Simples! Seria algo como:</span></p>
<ul>
<li><span>if (chave_menu == 1){</span></li>
<li><span>menu_ativo();</span></li>
<li><span>}</span></li>
</ul>
<p></p>
<p><span>só isso! E onde iremos colocar esse código? Dentro do "loop()". Só isso, mais nada. Fim. Absolutamente só, "só somente só assim vou lhe chamar, assim você vai ser, funçãozinha linda!"</span></p>
<p></p>
<p><span>Em que local do loop? em qualquer lugar que não seja interferido pelo resto do código! Veja o exemplo <a href="https://pastebin.com/VB5zj1tP" target="_blank" rel="noopener">(LINK DO CÓDIGO AQUI)</a></span></p>
<p></p>
<p><span>Principais mudanças (adições) no ultimo código em relação ao anterior:</span></p>
<p><span>- Linhas 19 a 28.</span></p>
<p></p>
<p></p>
<p><span>VIVA!!!!!!!! Temos um código que, ao pressionar um "botão principal" por 5 segundos, ele habilita outros dois botões secundários. Esses dois botões adicionam/reduzem o valor de uma variável!!! E se pressionar o "botão principal" por mais 5 segundos, os dois secundários ficam "desativados"!!! </span></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p><strong>Tudo pronto? SIIIIIIMMMMM!.... não.</strong></p>
<p><span>Se você testou o código, verá 2 problemas.</span></p>
<p><span>1- Os valores somam / subtraem de forma "descontrolada"</span></p>
<p><span>2- Se eu segurar por muito tempo, exibe erros/buga/trava/exibe valores errados...</span></p>
<p></p>
<p><span>Veja, <span style="text-decoration: underline;"><strong>o primeiro problema</strong></span> ocorre pois não existe um controle de "pausa" nos botões, então, se em 1 segundo ele fizer 1000 leituras, então ele irá contabilizar "+1" (ou "-1") mil vezes a variável!!! É o mesmo caso do problema que tivemos com o "chave_menu", lembra? Mas, neste caso, e devido a estrutura do código, podemos colocar um "delay(tempo)" após contabilizar o valor, além disso servir como um <strong>debounce (vale a pena pesquisar sobre)</strong>, dará uma corrigida neste problema além de uma nova funcionalidade.</span></p>
<p></p>
<p>Para isso, podemos colocar um delay(20) até delay(150) (o valor irá depender do SEU GOSTO) UMA LINHA <strong>APÓS</strong> a adição ou subtração do valor "1" na variável "Variavel_de_dados" (linha 58 e 61), que está na função menu_ativo() (linha 56).</p>
<p></p>
<p>Com esse delay, qual será o comportamento? Veja.. Agora, enquanto você manter o botão pressionado, ele continuará contabilizando + ou - 1, entretanto, existirá uma PAUSA entre as adições/remoções do "1". Se colocar um "delay(100)", você terá no máximo +10 ou -10 por segundo. Por isso, <strong>você</strong> precisará testar o valor que achar mais agradável para o SEU projeto. neste ponto, só você pode dizer qual o melhor tempo de espera.</p>
<p></p>
<p></p>
<p></p>
<p><span style="text-decoration: underline;"><strong>Até este ponto, você conseguiu entender? consegue reproduzir?</strong></span></p>
<p><span><strong>(to be continued...?)</strong></span></p>
<p></p>
<p><span><strong><em>Aguardarei o feedback do autor, para dar continuidade.</em></strong></span></p>