[RESOLVIDO] - Dúvida código servos e LCD

Beleza gente!

Seguinte, estava montando um projeto de uma espécie de "controle" para um insetorobô, simples. No Robô, existem 2 servos de 9g (1.3kg.cm) e um sensor ultrassônico (HC-SR04 - 4 pinos). No "controle" são 4 pushbuttons, a Arduino Uno R3, LCD 16x2, potenciômetro para contraste e só.

O problema é o seguinte. Fiz o código para que o sonar mostrasse a distancia no LCD, perfeito, funciona. Consegui até remover o ruído do servo da leitura (usando jumpers daqueles "premium"), apenas um problema (provavelmente resolvível por código, não sei como) de o LCD não apagar a casa das centenas qdo passa para dezenas de cm, inclusive peço uma força para isso tbém.

Para a locomoção do bichin, fiz as funções de locomoção (frente, virar direita, ré-esquerda e centralizar servo) e associei casa uma a uma leitura de HIGH de um pushbutton (por função). Mas, quando aperto o PushButton, nada acontece. Usei os pushbuttons no exato mesmo lugar no mesmo layout de montagem para acender LEDs, como prova de conceito, mas agora, necas de pitibirica de funfar... Quem sabe alguém pelas fotos tem uma ideia e pode me dar uma luz nessa.

Código: BugBot WiredLCD - Pastebin.com

Foto geral, que mostra o robô, "controle" e o LCD-que-não-apaga-a-centena:

Foto que mostra a conexão dos pushbuttons, para vcs verem se a ligação está correta:

Abraços e valeu a ajuda!!!

Eu dei só uma olhadinha no seu código.

O botão não funcionar, pode ser por causa do delay(1000) que tem no seu código e ele passar pelo digitalread só depois. o arduino não consegue fazer 2 coisas ao mesmo tempo, portanto pode ser que vc está apertando o botão muito rápido e ele não pega no digitalread.

Olhe este exemplo para usar millis() ao invés de delay: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Eu não entendi o problema que você está tendo no LCD direito.

Bem, este do millis()... qual é a diferença da função delay()?

E o LCD é o seguinte: Se meço 345cm, tranquilo. Se diminuo a distância, para, por exemplo, 50cm, o 5 do 345 fica e aparece 505. Não sei se expressei bem, mas, ele mantém um dígito da leitura anterior se ele tiver uma dimensão maior (dezenas para centenas, ex).

Valeu, Abs

tuliobaars:
Bem, este do millis()... qual é a diferença da função delay()?

a diferença é que vc pode fazer outra coisa enquanto aguarda. o delay "trava" seu arduino por 1 segundo. é 1 segundo sem fazer nada. olha o exemplo que te mandei, coloque em um arduino e leia o código para entender exatamente o que ele faz.

tuliobaars:
E o LCD é o seguinte: Se meço 345cm, tranquilo. Se diminuo a distância, para, por exemplo, 50cm, o 5 do 345 fica e aparece 505. Não sei se expressei bem, mas, ele mantém um dígito da leitura anterior se ele tiver uma dimensão maior (dezenas para centenas, ex).

entendi.

vc vai precisar limpar a linha antes de escrever alguma coisa. uma opção meio tosca é esta aí embaixo.

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distancia:");
lcd.setCursor(0, 1);
lcd.print(distancia);

outra opção é vc depois do lcd.print(distancia) colocar um outro lcd.print(" "). a mais limpa seria vc implementar um contador byte e contar quantos caracteres vc está escrevendo e limpar o resto da linha. enfim, é só programar mesmo.

"while reading a button press" o que é a preguiça, estava justamente ali... Bem, desculpe quanto a isso!

Pois, quanto ao LCD, o César Osaka do LAB de Garagem me sugeriu isso:

  lcd.setCursor(0, 1);
  if (distancia < 100)
    lcd.print(" ");
  if (distancia < 10)
    lcd.print(" ");
  lcd.print(distancia);

Que também acabou não funcionando. O lcd.clear também não funfou, nem printando espaço vazio. Quanto delay, não acho que seja necessário, afinal eu usava isso quando apenas lia da serial, sem o LCD. Acabou herdando do código antigo (falar de herança em C... vixe!!, haha)

No mais, obrigado pela ajuda!

Abraço

RESOLVIDO -

Em relação ao botão, o Cesar Osaka do LDG (Lab de Garagem) mostrou que meu circuito estava errado, eu estava fazendo o curto do botão do lado errado. Enfim, erro de iniciante. Este foi o layout que usei para que o BugBot respondesse corretamente:

Quanto ao LCD, o seguinte código, de autoria do Cesar Osaka, ajudou:

lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(distancia);

E na simulação pelo Simulino:

Para quem não conhece, o Simulino é uma ferramente para simulação de Arduino dentro do ambiente Proteus, desenvolvido aí pelo Cesar.

Obrigado a todos!