Resistenza di pull-up ok, ma...

Buona sera a tutti, per semplificare un circuito realizzato con arduino, ho pensato bene di non utilizzare un a resistenza esterna ma la resistenza di pull-up interna. Quello che voglio fare è accendere un led se premo un pulsante collegato ad arduino. quindi ho attivto la resistenza di pull-up interna, ma il led di conseguenza si accende... a me servirebbe che si accendesse solo quando viene premuto il pulsante. Potreste darmi un consiglio su come risolvere questo problema? Grazie!

// Esempio 01: accendi il led appena è premuto il pulsante  
  
#define LED 3                // LED collegato al pin digitale 13  
#define BUTTON 8              // pin di input dove è collegato il pulsante  
int  val = 0;                 // si userà val per conservare lo stato del pin di input  
  
void setup() {  
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output  
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
  digitalWrite(BUTTON, HIGH);
}  
  
void loop() {  
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  
  
  // controlla che l'input sia HIGH (pulsante premuto)  
  if (val == HIGH) {  
    digitalWrite(LED, HIGH);  //accende il led  
  }  
  else {  
    digitalWrite(LED, LOW);   //spegne il led  
  }  
}

L aresistenza di pull-UP porta il pin HIGH, quindi il pulsante va collegato fra il pin e massa, e va controllato che sia LOW quando premuto … :wink:

Se vuoi il contrario, devi lasciare disattivate le resistenze interne di pull-up e metterci delle resistenze esterne di pull-DOWN ( verso massa :wink: )

Ciao, ti ringrazio, a dir la verità ho confuso i due concetti, ma da adesso in poi sicuramente non succederà più :stuck_out_tongue_closed_eyes:

Adesso avei da chiedere un altra piccola cosa... ]:) Sto realizzando un sistema che tramite la pressione di un pulsante diminuisce un valore presente in memoria. Tutto funziona bene, tranne che per un piccolo problema... a me servirebbe che nel momento in cui viene premuto il pulsante (non da cs, ma un normale interruttore) il numero scali soltanto di un valore. Quì si presente il problema in quanto ogni tot secondi controlla se il pulsante è premuto, e nel caso in cui esso è premuto, scala di un valore (-1). A me non serve che effettui questo controllo ogni "tot" secondi, ma che scala questo valore solo una volta d quando lo premo fino quando viene rilasciato. Avreste per caso un consiglio anche per questo? Ringrazio in anticipo a tutti coloro che possono aiutarmi a comprendere questa funzione. Grazie, Ivan 8)

A livello di sketch non lo so (sto imparando anch'io :P) ... a livello di sequenza logica, la soluzione piu ovvia che mi viene in mente e' di controllarlo in questo modo:

controlla il pulsante -> rileva il pulsante premuto -> decrementa di uno -> continua a controllare il pulsante -> finche' non viene rilasciato, non modificare niente altro ... e cosi via ... in questo modo, ti dovrebbe decrementare il valore di uno, poi aspettare che tu lasci il pulsante e lo prema di nuovo, per decrementarlo di nuovo ...

Attenzione ai rimbalzi, se usi un pulsante meccanico, metti una resistenza da, tipo, 1K fra il pulsante ed il pin, ed un condensatore da 100n fra il pin e massa, in parallelo alla resistenza di pull-down (se la usi, puo andare bene da 22K o simile), cosi ti cancella la maggior parte dei rimbalzi del pulsante senza bisogno di aggiungere routines di debounce, e fa anche da antidisturbo ...

Guarda l'esempio dell'IDE "Statechangedetection". Lo trovi in File --> Esempi --> 02.Digital

Per attivare la pull-up interna puoi sostituire questa porzione di codice:

pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
  digitalWrite(BUTTON, HIGH);

con quest’unica istruzione:

pinMode(BUTTON, INPUT_PULLUP);     // imposta il pin digitale come input

Grazie, non ho avuto più nessun problema