Pessoal, bom dia...

Tenho a seguinte necessidade e gostaria de saber se alguém pode me ajudar ou dar uma luz para iniciar, já que nunca fiz nada parecido;

 - tenho este scketch anexo relativamente simples. É um contador de produtos que informa para o usuário quantas unidades que passaram e o que vai precisar de caixas e nr.camadas para paletizar.

- porém os valores de qtde_caixa e camada_caixa mudam com relativa constância. Daí preciso reprogramar mudando direto no scketch.

Gostaria de criar um funcionalidade onde, ao pressionar o botao_menu por 5 segundos, me abriria um menu perguntando qual a qtde_caixa. Usando os botões botao_mais e botao_menos alteraria este valor, apertando agora novamente o botão botao_menu apareceria a opção para alterar camada_caixa repetindo o processo de incrementar e decrementar, salvando ou atualizando estes valores na EPROM.

Estes me retornariam o valor da eprom no início do void setup justamente para não haver mais a necessidade de alterar no programa.

Desde já agradeço.

Att.:Reinaldo de Souza

Exibições: 142

Anexos

Responder esta

Respostas a este tópico

Veja, para fins de entendimento, um "menu" nada mais é do que um mapa de botões.

1- Se eu segurar um botão por 5 segundos, habilita algo.

2- Se eu apertar novamente, ele desabilita.

3- Se estiver habilitado, ele gera recurso para outros 2 botões.

4- Estes novos botões tem recursos.

Então vamos começar por partes.

A primeira etapa é fazer uma função onde seu código seja capaz de identificar quando um botão é pressionado por 5 segundos. Neste processo, o uso da função "millis()" é recomendada, seja pela flexibilidade ou seja pela eficiência (comparado a função delay), não é tão fácil quando digitar "delay(valor)", mas continua sendo fácil.

Obs- Se você não conhece a função millis(), recomendo fortemente que interrompa esta leitura e pesquise sobre ela. O entendimento da função é simples, e sua aplicação também é simples, além de ser uma função MUUUUUUUUUUUUUITO, mas MUUUUUUUUUITO e EXAUSTIVAMENTE MUUUUUUUUUUUUITO utilizada. Considero obrigatório o entendimento dela, caso contrário, você ficará travadão.

Continuando...

Veja ESTE CÓDIGO (LINK) que fiz para você entender, a ideia dele é justamente cumprir os requisitos do item 1 ("Se eu segurar um botão por 5 segundos, habilita algo."), que neste caso, é habilitado a mensagem: "Botão Pressionado por 5 segundos ou mais".

A partir de agora, já temos um espaço onde podemos trabalhar!

A SEGUNDA ETAPA, que também complementa a primeira etapa, é referente a (des)ativação de algo. Que também podemos interpretar como algo sendo "verdadeiro" ou "falso". Exemplo:

- Se verdadeiro, exibe algo.

- Se falso, Exibe outra coisa, ou não exibe nada...

Concorda comigo?

Então, poderíamos criar uma "chave" para isso? poderíamos! Podemos! vamos! 

Então vamos definir um nome bonito para nossa variável(chave), que combine com o código? Vamos pensar... Que tal..."chave do menu" ? Legal! E vamos definir este tipo de variável como "bool" (que na verdade se chama "boolean").

Já ia esquecendo! As variáveis não podem conter espaços ok? Então iremos substituir os espaços por "_" (mas se você preferir, pode colocar tudo junto) e declarar nossa variável assim:

  • bool chave_do_menu; 

Obs- O "boolean" é um tipo de variável que só pode armazenar 2 valores, que são: "0" ou "1". E para melhorar nosso entendimento, também podemos dizer: 0 = falso/desligado/off/false e 1 = verdadeiro/ligado/on/true

Pronto. O nome da variável está definida. Mas como iremos mudar o valor dela?

Existem várias formas, desde as menos simples e enormes, até as minúsculas e de grande performance. Para seu entendimento, irei trazer uma forma de fácil visualização.

Veja... "se pressiono o botão por 5 segundos, ele muda o valor.", logo, se o valor da nossa "chave_do_menu" é 1, então ele se tornará "0", e se for "0", ele será igual a "1". Concorda comigo?

Para isso, podemos escrever algo como:

  • if (chave_menu == 0){         // Se chave_menu for igual a zero
  • chave_menu = 1;                 // chave menu será igual a 1
  • }                                        // finaliza o if.
  • else if (chave_menu == 1){ // Se a condição anterior for falsa, mas chave_menu for igual a 1
  • chave_menu = 0;                // chave_menu será igual a 0.
  • }                                       // finaliza o elseif.

Veja como fica agora no código que mostrei anteriormente: (LINK DO CÓDIGO)

O que mudou do código anterior para este:

- Linha 5

- Linha 15 foi comentada, pois não iremos precisar mais dessa informação (ela pode ser apagada)

- Linha 16 á 29

Tente compreender ao máximo o código e as funções que citei, isso vai lhe ajudar MUUUUUUUUUUUUUIIIIIIIIIIITTTTTTOOOOOOOOOO, independente de você está aprendendo sobre elétrica/eletrônica e micro controladores, seja no meio profissional apenas por diversão.

Até este ponto, você conseguiu entender? consegue reproduzir?

(to be continued...)

Se você chegou até aqui, e testou as coisas direitinho, perceberá que o valor de "chave_menu" se repete infinitamente. E isso é um problema! Afinal, o nosso menu iria ficar "aparecendo e sumindo" toda hora! vish... trágico. Temos que arrumar isso!

Novamente, existem inúmeras formas de fazer isso mas, novamente, vamos fazer de uma forma que não seja difícil visualizar, ok? Vamos utilizar o método da "variável velha", ou "VarOld". Desta forma, iremos criar uma variável chamada "chave_menu_old" (old = velha), mas você pode chamar de qualquer coisa. 

A ideia desta "chave_menu_old" é que a gente armazene o valor de "chave_menu" enquanto o botão NÃO ESTIVER PRESSIONADO, ou seja, se chave_menu for igual a 0, chave_menu_old também será igual a zero. Mas quando a gente pressionar o botão por 5 segundos, chave_menu será igual a 1, e chave_menu_old continuará sendo igual a zero. Quando soltar o botão, ambas ficarão igual a 1, e assim suscetivelmente... 

Ou seja, nosso "chave_menu_old" vai ser a nossa "trava" para evitar que exista um "loop infinito e descontrolado" na mudança do "chave_menu". E para isso, deveremos criar uma condição, onde o valor de "chave_menu" só possa ser alterado se for igual ao de "chave_menu_old". Ficou confuso? calma... vamos explicar de forma mais simples.

Condição 1: (SE chave_menu for igual a chave_menu_old) ---> Condição 2

Condição 2: (SE chave_menu for igual a 0) ---> (chave_menu = 1). Se falso ---> Condição 3

Condição 3: (SE chave_menu for igual a 1) ---> chave_menu = 0;

O que vai acontecer nessa situação? Sempre que chave_menu for igual a chave_menu_old, será possível alterar o valor de "chave_menu". Entretanto, quando alterar o valor de "chave_menu", a condição 2 e 3 estarão "desativadas". Para ativa-las, obrigatoriamente, você terá que SOLTAR o botão (que teve que ficar segurando por 5 segundos), e pressiona-lo novamente!

PERFEITO! Problema resolvido!

Veja o código (LINK DO CÓDIGO AQUI).

As adições neste código foram:

- Linha 6  -> bool chave_menu_old;

- Linha 20 -> if (chave_menu == chave_menu_old) { 

- Linha 32 -> }   // fechar a condição da linha 20

- Linha 37 -> chave_menu_old = chave_menu;

ATENÇÃO: Veja que no SEU código, você utiliza o INPUT_PULLUP, isso força a leitura do botão, no estado "desligado" como "1", o que não tem problema nenhum, e você já tem conhecimento disso e definiu, NO SEU CÓDIGO, na linha 49, a verificação quando o sinal vai para 0 (low/baixo). "linha 49:  if(digitalRead (conta)==LOW) "

Para o meu exemplo, você pode adicionar resistore de pulldown, ou simplesmente alterar a linha 10 e 14.

Até este ponto, você conseguiu entender? consegue reproduzir?

(to be continued...)

ETAPA 3 (Se estiver habilitado, ele gera recurso para outros 2 botões)

Aqui, é mais fácil ainda, e você vai concordar comigo!

Lembra que temos uma variável responsável por uma chave? a nossa "chave_menu" ? Então... ela não vai ser usada agora. 

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. 

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. E o objetivo dela é mudar os valores de uma variável ao pressionar um determinado botão.

obs- Vale lembrar, que a criação de uma nova função fica FORA da função setup() e loop(), ok?

  • void menu_ativo(){} // assim será chamada nossa função.

Obs2- o conteúdo de uma função fica sempre dentro das chaves! "{}"

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 ADICIONAR, na função SETUP() os pinos que receberão os sinais dos botões utilizando o "pinMode(pin, status)"

  • void setup(){          
  • pinMode(Def_NumBotao_2, INPUT); // define um pino como entrada
  • pinMode(Def_NumBotao_3, INPUT); // define outro pino como entrada
  • // outros itens adicionados anteriormente 
  • }

Em seguida, iremos até o nosso "void menu_ativo(){}" e criaremos novas condições de leitura dos botões.

  • void menu_ativo(){
  • if (digitalRead(Def_NumBotao_2) == HIGH){
  • // se verdadeiro
  • }
  • else if (digitalRead(Def_NumBotao_3) == HIGH){
  • // se verdadeiro
  • }

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".

  • int Variavel_de_dados;

Para saber sobre o tamanho dos tipo de variáveis, você pode olhar ESTE SITE ou ESTE SITE 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).

Então, voltamos para a função "menu_ativo()", e iremos fazer o seguinte:

- Se o botãoA foi pressionado, ele irá adicionar "1" a "Variavel_de_dados"

- Se o botãoB foi pressionado, ele irá REDUZIR "1" da "Variavel_de_dados"

Ou seja, até o momento, o que ADICIONAMOS FOI ISSO (NA ETAPA 3) (LINK DO CÓDIGO AQUI)

O código completo, até o momento, fica assim: (LINK DO CÓDIGO AQUI)

Principais mudanças:

- Linha 3 e 4 (definições/links/atalhos)

- Linha 9 (declaração de variável)

- Linha 14 e 15 (definição do modo de funcionamento do GPIO)

- Linha 46 a 52 (função menu_ativo())

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 "chave_menu", que criamos lááááááááá atrás!

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!

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.

Então faremos o seguinte: Se "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:

  • if (chave_menu == 1){
  • menu_ativo();
  • }

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!"

Em que local do loop? em qualquer lugar que não seja interferido pelo resto do código! Veja o exemplo (LINK DO CÓDIGO AQUI)

Principais mudanças (adições) no ultimo código em relação ao anterior:

- Linhas 19 a 28.

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"!!! 

Tudo pronto? SIIIIIIMMMMM!.... não.

Se você testou o código, verá 2 problemas.

1- Os valores somam / subtraem de forma "descontrolada"

2- Se eu segurar por muito tempo, exibe erros/buga/trava/exibe valores errados...

Veja, o primeiro problema 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 debounce (vale a pena pesquisar sobre), dará uma corrigida neste problema além de uma nova funcionalidade.

Para isso, podemos colocar um delay(20) até delay(150) (o valor irá depender do SEU GOSTO) UMA LINHA APÓS 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).

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, você 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.

Até este ponto, você conseguiu entender? consegue reproduzir?

(to be continued...?)

Aguardarei o feedback do autor, para dar continuidade.

Bom dia Tiago. Primeiramente muito obrigado por ajudar..

Porém não é bem isso, isso que vc me mostrou eu já faço mas não é o que eu preciso.

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 ?

Eu até atualizei o código para você ver.

Obrigado.

Anexos

Olá  Reinaldo de Souza

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 compreensão de como produzir aquilo que você sugeriu, e para isso, eu ignorei performance geral e armazenamento..

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, CASO fosse necessário, de itens como: debounce e type data.

Com relação a seu novo código.... veja, vamos fazer uma análise rápida.

Da linha 63 a 68, 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.

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.

Na linha 75, 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:

  • if (gpio == true){
  • if (gpio == true){
  • // conteúdo
  • } }

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).

Na linha 91 e 95 você repete o mesmo erro que acabei de citar.

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. 

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.

Recomendo que veja as postagens anteriores novamente e tente compreender o que foi passado. Caso tenha dúvidas, PODE PERGUNTAR A VONTADE. O fórum serve justamente para que as pessoas possam se ajudar e aprender.

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.

1- Brincando com ideias

2- WrKits channel

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!)

Links do Wrkits (referencia para estudo):

- Menu para display LCD | Curso de Arduino #029

- Sub Menu para display LCD | Curso de Arduino #061

- Menu em formato de lista para LCD | Curso de Arduino #134

- Menu em lista horizontal para LCD | Curso de ARduino #138

- Menu em forma de lista profissional | Curso de Arduino #281

- Menu Profissional em lista e ajuste de parâmetros | Curso de Arduin...

 

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.

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.

Qualquer dúvida, estou as ordens.

Olá Tiago.

O que eu tentei foi aplicar suas instruções e ver o resultado prático, já que tenho todo este montado.

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..

Da linha 63 a 68, você removeu a chave mágica que.....

-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..

Na linha 75, você cria um if referenciando o GPIO, mas logo a baixo, cria um while com a mesma..

-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.

Na linha 91 e 95 você repete o mesmo erro que acabei de citar...

-mesma caso acima, novamente repare que meus botões são do tipo PULLUP, ou seja, LOW que é verdadeiro.

if (digitalRead(botao_mais) == LOW) {                   // se botao_mais foi pressionado 

Variavel_de_dados = Variavel_de_dados + 1;          //incremente +1.
while(digitalRead(botao_mais)==LOW) delay(100); //enquanto botao_mais estiver pressionado, fique aqui.

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.

Att.:Reinaldo de Souza

Olá, Reinaldo!

   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?

   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.

   Quando isto for definido, você poderá usar um while para se manter no Menu até que a condição do while indique que terminou a entrada de dados.

   É isto ou chutei muito longe?

Abração.

D. T. Ribeiro.

Bom dia D.T.

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.

Att.:Reinaldo de Souza

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).

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ó).

Outra coisa, esse negócio de "Sair do loop()", dentro da estrutura básica do arduino IDE, até onde sei, não existe. A não ser que fizesse um loop infinito no setup(), mas ai nunca iria entrar no loop().

-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..

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 

As opções, a partir desta, são infinitas. exemplo:

variavel = 0, menu 0;

variavel = 1, menu 1;

variavel = 2, menu 2;

variavel = 3, menu 3;

variavel = 4, menu 4;

variavel = 5, menu 5;

-sobre o while + delay();

Entendi sua ideia. É funcional.

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.

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.

Eu gosto de fazer assim nos meus códigos, pois me possibilita um número grande de quadros, sem deixar bagunçado.

0- crie uma função "menu" e jogue no loop().

1- Dentro dela, crie um switch/case.

2- defina a variável da mesma para o número de menus do seu interesse

3- dentro dos cases, chame a função correspondente a cada menu

4- dentro das funções, crie o visual e defina o recurso para os botões.

5- Caso esteja tendo algum tipo de gargalo, provavelmente será em relação a tela.

6- neste caso, crie uma condição para atualizar a tela apenas quando tiver alteração do visual.

indicação de leitura:

https://www.arduino.cc/reference/pt/language/structure/control-stru...

Essa mesma estrutura tem em um desses vídeos que postei anteriormente, é em português. Se não for exatamente desse jeito, é MUITO parecido.

Caso ainda tenha ficado alguma dúvida, pode perguntar.

Bom dia Tiago..

Você me ajudou muito mesmo. Abriu minha cabeça para coisas que não tinha percebido.

Diante deste último post seu consegui destravar o que me prendia na etapa final do entendimento.

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.

Vou informando sobre o andamento.

Novamente obrigado.

Que bom que você conseguiu desenvolver seu código, e que bom que consegui ser útil.

Caso tenham mais dúvidas, pode postar.

Quando todas as dúvidas referentes a este tópico estiverem sanadas, não esqueça de adicionar um "resolvido".

Anexo o código final.

Achei 'muito fácil  a parte da gravação e leitura na eeprom, mesmo sabendo que a biblioteca que faz tudo.

Críticas e sugestões são bem vindas.

Abraço a todos...

Att.:Reinaldo de Souza

Anexos

RSS

© 2022   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço