Ajuda com projeto de pai e filho (LCD + variável)

Boa tarde pessoal
Meu pai possui um Motorhome e com o razoável conhecimento que ele tem de elétrica/eletrônica ele criou uma caixinha com vários leds, onde cada led acende caso algo esteja errado, por exemplo: toldo aberto, escada aberta, carro ligado e farol desligado, carro desligado e lanterna ligada, válvula de água ligada, gerador ligado etc etc.
Cada vez ele coloca mais leds nessa caixinha e está ficando complicado de lembrar o que é cada coisa, então dei a sugestão pra ele de colocar um LCD com as informações, os alarmes (por exemplo: “Toldo aberto, farol desligado”) substituindo a caixinha com leds. Ele acabou me dando a missão de pesquisar como faria.

Minha formação é Sistemas de Informação mas trabalho com redes, então do curso eu aproveitei apenas o básico de lógica de programação.

Antes de comprar um Arduino para fazer os testes, baixei o Proteus (e depois achei um site chamado Tinkercad) e comecei a fazer os labs básicos acendendo led e depois comecei a criar o código do que pretendo usar.

O esboço inicial está pronto, mas gostaria da ajuda de vocês para ver se cometi alguma falha grave (gambiarra propriamente dita) e também orientações quanto ao print no LCD, não estou satisfeito com a solução que encontrei.

Do jeito que consegui fazer, com os ifs dentro do while, o sistema precisa exibir toda a mensagem no LCD para depois repetir a verificação. Com dois ou três itens em desacordo, igual o código, OK. Mas e quando eu tiver, por exemplo, 10 itens em desacordo? Vamos supor que levaria sei lá, 30 segundos passando os itens no LCD. Se eu resolver um item nos três primeiros segundos (ligar o farol) demoraria mais 27 segundos até que o print do LCD terminasse e o while e consequentemente if se repetisse para aí sim ver que o farol foi apagado.

Não sei se existe alguma solução mais prática para isso. Obrigado!!

edit: não sei porque não consegui colocar o código todo no < code >, ficou apenas metade.
Para não poluir o tópico, segue o código: https://pastebin.com/pULnCQ50

  int contador = 0; // Fixa contador em 0 para while repetir pra sempre (gambiarra??)
  lcd.setCursor(0,0); // Posiciona cursor do lcd no início

  // Realiza verificação do estado do pin de cada acessório em loop infinito
  while (contador < 1) {

o loop() do arduido já é um while infinito, pq vc não coloca o lcd.setCursor(0,0); no setup() e tira essa “adaptação técnica” de contador?

no mais o código está muito bonito, parabéns!

1 curtida

Hummm interessante. Então eu não preciso ficar constantemente verificando se pin X está HIGH ou LOW porque desde que ele esteja no loop() já vai rodar em loop? Legal, obrigado. Vi tantos lugares dizendo que no loop() é onde entraria o código que acabei não relacionando o nome à função de loop propriamente dita.

Obrigado pelo elogio do código! Eu sinceramente não estou muito feliz, mas já é algo muito bom pra quem até semana passada nem sabia o que era Arduino

Isso, exato!

Setup() roda só na inicialização da placa e
loop() roda em loop para sempre!

outra coisa:

 if (digitalRead(pinToldo) == HIGH) {
  estToldo = "Toldo ";
 } else if (digitalRead(pinToldo) == LOW) {
  estToldo = " ";
 }

vc concorda que se o pino não está HIGH então ele está em LOW?
Não daria para simplificar esse pedaço do código então?

Concordo e daria, mas eu fiz isso para poder escrever " " na variável caso esteja LOW, assim caso esse item esteja ok (toldo fechado) o nome do toldo não apareceria no LCD quando eu fizer print de todas as variáveis estXXXX
Não sei se tem algum outro jeito…
Talvez definir as variáveis estXXX dentro do loop() e incializá-las como " "? Assim sempre que o loop voltar ao início a váriável seria zerada; se estiver HIGH ela é escrita e se estiver LOW continua zerada.
Funciona declarar as variáveis no loop()? Elas serão zeradas igual imaginei?

ou só simplificar para algo assim:

if (digitalRead(pinToldo)) {
  estToldo = "Toldo ";
 } else {
  estToldo = " ";
 }
1 curtida