lunes, 6 de enero de 2014

Encendre un LED amb un botó

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