collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: temporizador+lcd  (Lida 11292 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