Materials necessaris
- Placa arduino uno
- Protoboard
- Led monocromo
- Resistència 220Ω ±5%
- Botó
- Resistència 10KΩ ±5%
- Cablejat
Circuit
El circuit té dues parts:- LED amb resistència, igual a l'entrada anterior
- Botó: d'una banda està conectat a la font de 5v. i per altra a terra mitjançant una resistència. D'aquesta manera l'Arduino llegeix 5v quan el botó està pressionat i llegeix terra al soltar-lo
Esquema del circuit fet amb Fritzi:
Programa
El programa presenta dos novetats respecte a l'anterior, d'una banda definirem variables abans del void setup. D'altra part farem servir el comando IF per fer accions si es compleixen determinades condicions.En primer lloc fem un programa que encén el LED quan el botó està pressionat:
const int LED = 12; // el pin del LED
const int BUTTON = 7; // el pin d'entrada on es conecta el botó
int estat = 0; // valor per a quardar l'estat del pin d'entrada
void setup()
{
pinMode(LED, OUTPUT); // LED-----> sortida
pinMode(BUTTON, INPUT); // BUTTON--> entrada
}
void loop()
{
estat = digitalRead(BUTTON); // llegir el valor d'entrada
if (val == HIGH)
{
digitalWrite(LED, HIGH); // encendre el LED
}
else
{
digitalWrite(LED, LOW); // apaga el LED
}
}
Veiem que el circuit funciona però es poc pràctic. Per això modifiquem el programa per tal de que al prémer el botó encenem el LED i al tornar-lo a pressionar s'apaga.
Hem d'introduir una nova variable ESTAT que "recorda" si el LED està apagat o encès per tal de poder canviar-lo al prémer el botó:
const int LED = 12; // el pin del LED
const int BUTTON = 7; // el pin d'entrada on es conecta el botó
int estat = 0; // valor per a quardar l'estat del pin d'entrada
int sortida = 0; // 0 = LED apagat y 1=LED ences
void setup()
{
pinMode(LED, OUTPUT); // LED-----> salida
pinMode(BUTTON, INPUT); // BUTTON--> entrada
}
void loop()
{
estat = digitalRead(BUTTON); // llegir el valor d'entrada
// comprobar si l'entrada es HIGH (botó pulsat)
if (estat == HIGH)
{
sortida = 1 - sortida;
}
if (sortida == 1) {
digitalWrite(LED, HIGH); // encender el LED
} else {
digitalWrite(LED, LOW);
}
}
Es pot observar que funciona a vegades. Això està en relació amb el fet de que el LOOP s'executa a molta velocitat i es canvia la variable ESTAT moltes vegades mentre mantenim el botó pressionat. Per aixó hem de modificar el programa per tal de millorar-lo.
Afegim una altra variable per comparar si l'estat del botó canvia respecte a l'anterior.
const int LED = 12;// el pin del LED
const int BUTTON = 7;// el pin de entrada on es conecta el botó
int estat = 0; // guarda l'estat del botó
int EstatPrevi = 0; // guardar el estado anterior del botón
int sortida = 0; // 0 = LED apagado y 1=LED encendido
void setup() {
pinMode(LED, OUTPUT); // LED-----> salida
pinMode(BUTTON, INPUT); // BUTTON--> entrada
}
void loop(){
estat = digitalRead(BUTTON); // llegir el valor d'entrada
// comprobar si la entrada es HIGH (botó apretat)i es diferent
if ((estat == HIGH) && (EstatPrevi == LOW))
{
sortida = 1 - sortida;
}
EstatPrevi = estat; // guarda el valor actual
if (sortida == 1) {
digitalWrite(LED, HIGH); // encendre el LED
} else {
digitalWrite(LED, LOW);
}
}
Veiem que funciona millor però a vegades falla. Això es degut al rebot que es produeix en els botons, ja que son elements mecànics amb una certa imprecisió, com es veu a la figura:
Solucionarem el problema d'una manera senzilla afegint un retard d'uns microsegons. Existeixen sistemes més complexes però aquest, de moment, ens funciona:
const int LED = 12; // el pin del LED
const int BUTTON = 7; // el pin d'entrada on es conecta el botó
int estat = 0; // guarda l'estat del botó
int EstatPrevi = 0; // guarda l'estat anterior del botó
int sortida = 0; // 0 = LED apagat i 1=LED encès
void setup() {
pinMode(LED, OUTPUT); // LED-----> sortida
pinMode(BUTTON, INPUT); // BUTTON--> entrada
}
void loop(){
estat = digitalRead(BUTTON); // llegir el valor d'entrada
// comprovar si l'entrada es HIGH (botó apretat)
if ((estat == HIGH) && (EstatPrevi == LOW))
{
sortida = 1 - sortida;
delay(20);
}
EstatPrevi = estat; // guarda el valor actual
if (sortida == 1) {
digitalWrite(LED, HIGH); // encender el LED
} else {
digitalWrite(LED, LOW);
}
}



No hay comentarios:
Publicar un comentario