collapse

* Posts Recentes

+ LASERs por dropes
[03 de Julho de 2025, 19:35]


Cerca eléctrica por SerraCabo
[14 de Junho de 2025, 23:26]


Alguém arranja motores? por almamater
[10 de Junho de 2025, 22:34]


Condensador 4.7uF 0603 por brunus
[09 de Junho de 2025, 15:52]


Lenovo IdeaPad 3 Não liga por jm_araujo
[07 de Maio de 2025, 19:10]


Identificar Diodo Zenner por filjoa
[01 de Maio de 2025, 23:07]


Meu novo robô por dropes
[18 de Março de 2025, 14:51]


JBL partybox On-The-Go por almamater
[21 de Fevereiro de 2025, 23:32]


Talking Reverse Engineering with an Absolute Legend! por SerraCabo
[13 de Fevereiro de 2025, 09:56]


Motoserra Stihl 120C por brunus
[11 de Fevereiro de 2025, 16:29]

Autor Tópico: temporizador+lcd  (Lida 16386 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re:temporizador+lcd
« Responder #30 em: 26 de Julho de 2009, 03:00 »
A função setup() só é executada 1 vez, quando o programa arranca.

Normalmente os botões têm que ser "debounced". Quando carregas ou largas um botão, electricamente ele não passa directo de carregado para solto ou vice-versa; o que acontece é que há uma série de variações carregado/solto até estabilizar no novo valor, e muitos programas não se dão bem com isso. O botão "faz bounce" ("saltita") algumas vezes até que estabiliza.
No teu programa, um possível efeito do "bounce" do botão é cada vez que carregas 1 vez no botão ele contar várias vezes 10 seg (é como se tivesses carregado várias vezes seguidas muito depressa).
O "debounce" de um botão é eliminar, por exemplo em software, esses saltos que ocorrem durante a transição. Uma técnica possível é apenas considerar que o botão mudou de estado se já se manteve no novo estado durante por exemplo 100 ms.

Os pinos do Arduino têm pull-ups internos que podem ser ligados. Se os usares, não precisas da resistência cá fora.

Offline ghostbuster

  • Mini Robot
  • *
  • Mensagens: 339
Re:temporizador+lcd
« Responder #31 em: 26 de Julho de 2009, 03:03 »
e como é que ligo os pullups internos?

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re:temporizador+lcd
« Responder #32 em: 26 de Julho de 2009, 03:03 »
Por exemplo, um delay(100); a seguir a leitura do estado do botão pode resolver o problema como o Njay disse.

Offline ghostbuster

  • Mini Robot
  • *
  • Mensagens: 339
Re:temporizador+lcd
« Responder #33 em: 26 de Julho de 2009, 03:16 »
sim agora com o delay funciona 5 estrelas mas no lcd so adiciona caracteres depois do 0 se tiver o lcd print no main e se o tiver no loop ele monsttrame os dados uns atras dos outros...
« Última modificação: 26 de Julho de 2009, 03:24 por ghostbuster »

Offline tcustodio

  • Mini Robot
  • *
  • Mensagens: 344
  • "beware of programmers who carry a soldering iron"
    • Youtube
Re:temporizador+lcd
« Responder #34 em: 26 de Julho de 2009, 05:06 »
e como é que ligo os pullups internos?

ligas os pull-ups definindo os pinos como input, e logo de seguida declarando

pinMode( pinoX , HIGH);

desta maneira estás a "ligar uma tensão" no pino, independentemente do pino ser input ou output,
no caso de ser input, estás a definir-lhe o estado "por defeito". Se o deixares a flutuar, ele vai estar sempre nos 5V, pois ligaste o pull-up.
Tiago Custódio,
- Não me dêem álcool se estiver um piano por perto.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re:temporizador+lcd
« Responder #35 em: 26 de Julho de 2009, 06:25 »
Não sei onde colocaste o delay(100) mas dependendo de como o fizeste a coisa pode ou não funcionar sempre. Já não estou em grandes condições de fazer código mas podes tentar estas alterações:

Citar
... void ShowTime()
{
    lcd.setCursor(0,0);
    lcd.print(hour);
    lcd.print(":");
    lcd.print(min);
    lcd.print(":");
    lcd.print(sec);
}

boolean  oldButtonState = false;

void loop()
{
    delay(100);

    boolean  somethingChanged = false;

    buttonState = digitalRead(buttonPin);
    if (buttonState == oldButtonState)
    {
        if (buttonState == HIGH && !botaoPressionado)
        {
            botaoPressionado = true;
            digitalWrite(ledPin, HIGH);
            sec = sec + 10;
            somethingChanged = true;
        }
        else if(buttonState == LOW && botaoPressionado)
        {
            botaoPressionado = false;
            digitalWrite(ledPin, LOW);
            somethingChanged = true;
        }
    }
    oldButtonState = buttonState;

    if (somethingChanged)
    {
        ShowTime();
        // e fazer aqui + qq coisa q seja preciso qdo alguma coisa muda...
    }
}

A setup() fica vazia.
Quando é detectada uma mudança no estado do botão, ela só é considerada se 100ms depois essa mudança se mantiver.
Como tinhas, só estavas a escrever 1 vez no LCD, no arranque do programa. No excerto acima, escreves sempre que há "alterações", e apenas quando as há.

p.s.: Não é preciso chamar nenhuma função no setup() para inicializar o LCD?...

Offline ghostbuster

  • Mini Robot
  • *
  • Mensagens: 339
Re:temporizador+lcd
« Responder #36 em: 26 de Julho de 2009, 17:39 »
pois ele assim nao monstra nada no lcd e nem o butao funciona, mas eu ja vou ver o codigo com atençao, obrigado