Vai al contenuto

Accensione di un LED tramite pulsante


RyujiAndy

Messaggi raccomandati

Fino ad ora vi ho spiegato come si attivano i pin digitali in uscita quindi come interagire tra Arduino ed un led, ora vediamo come programmare un azione esterna nel nostro caso la pressione di un tasto.

arduino_tasto_ledv1.png

Come sempre per controllare la corrente che illumina il LED METTO UNA RESISTENZA DA 1 Kohm, questo perchè l'uscita di arduino fornisce una corrente massima di 40 mA e non voglio rischiare di rompere il microcontrollore AtMega328p di Arduino, tra il pulsante e la massa metto una resistenza da 10 Kohm e lo collego al pin 7 di arduino, l'altra estremità del pulsante va ai 5 V di uscita di Arduino, questo perchè arduino rivela la differenza di potenziale e non la circolazione di corrente, la resistenza è più elevata per ridurre la circolazione di corrente, per chi non lo sapesse è definita dalla legge di ohm che dice V = R*I, quindi avendo una differenza di potenziale nel nostro caso sempre costante (5 V), aumentando la resistenza diminuisco la Corrente.

Ora come sempre andiamo a definire nel programma i pin utilizzati:

void setup() {
 pinMode(13, OUTPUT);
 pinMode(7, INPUT);
}

Da notare al pin 7 ho impostato "INPUT" questo come logico per dirgli che è una lettura e non una scrittura, quindi arduino ora utilizza il piun 7 per rilevare la differenza di potenziale che si va a creare.

Per effettuare una lettura sul pin 7 si deve usare la funzione "digitalRead()" questo ci restituisce 2 valori "HIGH" se c'è tensione e "LOW" se questa non è presente, e quindi il nostro programma uscirà in questa maniera:

void loop() {
 digitalWrite(13, digitalRead(7));
}

Se si carica il nostro sketch su arduino si nota subito un piccolo problema, il nostro LED si illumina solo quando il pulsante risulta premuto, non appena lo rilasciamo il LED si spegne, questo lo si può usare solo quando si vuole rilevare lo stato, ma noi vogliamo poter accendere e spegnere il LED ad ogni pressione, quindi dobbiamo rivelare il cambiamento di stato del pulsante e quindi memorizzare lo stato del LED.

Una soluzione potrebbe essere:

int tastroprecedente = LOW;
int tasto = LOW;
int statoled = LOW;

void setup() {
 pinMode(13, OUTPUT);
 pinMode(7, INPUT);
}

void loop() {
 stato = digitalRead(7);
 if (stato != tastoprecedente && stato == HIGH) {
   statoled = 1 - statoled;
 }
 digitalWrite(13, statoled);
 tastoprecedente = stato;
}

Il confronto "if" va a rilevare il cambiamento di stato del pulsante su due letture del tasto quella attuale e quella precedente e controla se il pulsante risulta premuto quindi va ad assegnare lo stato del led grazie alla funzione "statoled = 1 - statoled;" questa grazie ad un semplice formula matematica va ad invertire il valore, infatti se lo stato del led è "1" o "HIGH" lo cambia in "0" o "LOW", infatti "1 - 1 = 0", viceversa se lo stato precedente è "0" o "LOW", "1 - 0 = 1".

 

Schema elettrico:

arduino_tasto_ledv2.png

R1 = 1K ohm

R2 = 10K ohm

Modificato da RyujiAndy
Link al commento
Condividi su altri siti

  • 1 mese dopo...

Ottima osservazione e ottima soluzione del problema, comunque il programma originale era:

int tastroprecedente = LOW;
int tasto = LOW;
int statoled = LOW;

void setup() {
 pinMode(13, OUTPUT);
 pinMode(7, INPUT);
}

void loop() {
 int stato = digitalRead(7);
 if (stato != tastoprecedente && stato == HIGH) {
   statoled = 1 - statoled;
 }
 digitalWrite(13, statoled);
 tastoprecedente = stato;
}

Nello scrivere mi sono dimenticato di aggiungere l'int davanti alla lettura dello stato del pulsante.

Mi complimento per l'acuta osservazione, questo dimostra che anche io sono umano.

Link al commento
Condividi su altri siti

Crea un account o accedi per lasciare un commento

Devi essere un membro per lasciare un commento

Crea un account

Iscriviti per un nuovo account nella nostra community. È facile!

Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.

Accedi Ora

Giochi in Uscita



×
×
  • Crea Nuovo...