debounce

Salve a tutti, mi serve una delucidazione sulla questione in oggetto. premessa: utilizzo arduino uno r3 Io ho un pulsante di soli 2 fili collegati rispettivamente al pin 6 (dichiarato input_pullup) e GND, alla pressione del pulsante succede la seguente cosa:

  int camp = digitalRead(suonaCampanello);
  //Serial.println(camp);
  if (camp == LOW)
    // Manda il messaggio se lo stato del pulsante è LOW (dichiarata in PULLUP è sempre HIGH fino a quando il pulsante non è premuto)
  {
    if (client.connect(remoteV,80))
    {
    Serial.println("Suono in Villa");
    client.println("PUT /suona/ HHTTP/1.1");
    client.println("Host: 192.168.0.47");
    client.println("Connection: close");
    client.println();
    client.stop();  
    delay(200);
    }

siccome ho parecchi rimbalzi vorrei utilizzare il debounce ma non riesco a capire come adattarlo perchè nell'esempio che c'è nella cartella esempi viene utilizzato un bottone a 4 pin collegati a GND con una resistenza ed a 5V (ma quell'esempio lo conoscerete meglio di me) e quando si preme il pulsante viene cambiato di volta in volta lo stato del led, premo (e rilascio) il pulsante il led si accende (se è spento), ri-premo il pulsante ed il led si spegne. Quello che serve a me invece è: premo il pulsante e mando il messaggio, e resto in attesa che il pulsante venga premuto di nuovo per rimandare il messaggio (è un campanello).

Mi spiegate come adattare il debouce dell'esempio a ciò che serve a me? nel frattempo ci ragiono anche io che mi piacerebbe trovare la soluzione in autonomia ma se non ci riesco.... :) grazie a chi avrà la pazienza di leggere e risponderà

io avrei pensato di risolvere in questo modo:

  int camp = digitalRead(suonaCampanello);
  if (camp != ultStatoPuls)
  {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay)
  {
    if (camp != statoPuls)
    {
      statoPuls = camp;   
      if (camp == HIGH)
    // Manda il messaggio se lo stato del pulsante è LOW (dichiarata in PULLUP è sempre HIGH fino a quando il pulsante non è premuto)
      {
        if (client.connect(remoteV,80))
        {
          Serial.println("Suono in Villa");
          client.println("PUT /suona/ HTTP/1.1");
          client.println("Host: 192.168.0.47");
          client.println("Connection: close");
          client.println();
          client.stop();  
          delay(200);
        }
        if (client.connect(remoteC,80))
        {
          Serial.println("Suono in Cantina");
          client.println("PUT /suona/ HTTP/1.1");
          client.println("Host: 192.168.0.48");
          client.println("Connection: close");
          client.println();
          client.stop();  
          delay(200);
        }
      }
    }
  }

secondo voi può funzionare?

Tecnica estremamente banale ma che funziona nel 95% dei casi :

valore = digitalRead(mioPin);
if ( valore == LOW ) {
  delay (75);  // questo lo puoi modificare fino a trovare il valore ottimale
  valore = digitalRead(mioPin);
  if ( valore == LOW ) {
    ...
    qui sei sicuro che il pulsante è stato premuto
    ...
    ...
  }
}

... ti basta aggiustare il delay() in funzione della "qualità" del pulsante ... se è di buona qualità bastano anche meno di 50 msec, se è di pessima ... magari ci vogliono anche più di 100 msec. ;)

Guglielmo

grazie, sei sempre tu che mi rispondi e mi dai le soluzioni giuste per me... dove abiti? che se siamo vicini un caffè è praticamente d'obbligo :)

:grin: :grin: :grin: ... abito oltre confine e ... ... salvo tu non stia vicino a Como o a Varese ... la vedo difficile, ma comunque grazie, come se lo avessi accettato ;)

Guglielmo

Peccato io adesso sono in toscana ma fino a inizio 2009 ero a Milano... se avessi conosciuto prima il mondo di arduino magari quel caffè te lo potevo offrire su serio :)

Vivi in Toscana? Beh, allora adesso sei mio conterraneo ;)

@leo dove sei tu? io in provincia di GR (mio babbo è nato qui)

Sono un pò più su, io sono di Firenze anche se ora vivo a Campi.

beh... magari se si organizza un lab arduino a firenze un salto ce lo faccio volentieri :)

Abbiamo fatto un incontro a Firenza 2 anni e mezzo fa, magari al prossimo... ci si incontra ;)