Vai al contenuto
Inviato

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

Featured Replies

Inviato

Salve

Ho provato con Arduino questo programma ma ho notato che manca la variabile stato.

quindi ho aggiunto int stato=0;

riepilogo:

int tastoprecedente=LOW;

int tasto=LOW;

int statoled=LOW;

int stato=0;

 

Ciao

Inviato
  • Autore

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.

Crea un account o accedi per lasciare un commento