Aplicación con la matriz de LEDs y sensores

Hemos usado el Arduino Basic Shield de Kiwibot y la Librería Matriz de LEDs  para realizar una aplicación que muestra varios sensores por la Matriz de LEDs.

Tiene tres funciones:

  • Termómetro:  Con el sensor de temperatura exacta (LM35) la matriz de led representa la temperatura que hace.
  • Gráfica de luz:  Gracias al sensor de luz (LDR), se muestra una gráfica en la matriz de leds, según la luz que capte el sensor.
  • Sensor de distancia:  Al presionar el pulsador derecho capta la distancia entre el sensor y el objeto más cercano gracias al sensor de distancia (HC-SR04), y lo refleja en la matriz de leds.
    Si el valor captado da más de 99, la matriz de leds representa un signo + y si capta, 0 representa una E (Error).

Para cambiar de una función a otra, se presiona el botón izquierdo, y antes de empezar, se imprimirá una letra según la función que sea: T temperatura, L luz y D distancia.

/* SENSORES
 Tiene tres funciones:
 -Sensor de distancia
 -sensor de temperatura
 -Sensor de luz (grafica)
 Desarrollado por Carlos Pumar
 Marzo de 2015
 */

#include <Matriz.h>
Matriz matriz(6, 9, 5);
int i=0;
int contador = 1;

//temperatura:

//Variables para leer el Sensor de temperatura
int temperaturaPin=A1;
long temperaturaValue=0;    
long temperatura=0;

//Variables para sustituir delay
long tiempoInicial = 0;
long tiempoActual = 0;

//luz:

int sensorLDR = A0;
int sensorValue = 0;

//distancia:

//TIMER
volatile uint8_t columna=0;

volatile int a = 0;

int buzzerPin = 10;

//Variables para sustituir delay
long previousMillis = 0;
long currentMillis = 0;
long interval = 1000;

//Variables necesarias para imprimir en la matriz
int numero=0;

//Variables relacionadas al botón
int estadoBoton=0;
int botonPin = 3;
long TInicial = 0;
long TActual = 0;
int onOff=1;

//Variables para sustituir delay
volatile long tiempo;

//Variables para leer del LDR
int ldrPin=A0;
int ldrValue=0;

//Variables para leer el Sensor de distancia HC-SN04
volatile int trigPin=11;
volatile int echoPin=12;

//Variables para sustituir delay
long tiempoI = 0;
long tiempoA = 0;

void setup() {

  pinMode(botonPin, INPUT);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  pinMode(buzzerPin, OUTPUT);

  attachInterrupt(0, suma, FALLING);
}

void temp() {

  tiempoA = millis();
  //se sustituye un delay de 500
  if (tiempoA - tiempoI > 500) {
    tiempoI = tiempoA;
    //lectura de la temperatura   
    temperaturaValue = analogRead(temperaturaPin);
    //formula de la temperatura    
    temperatura = (temperaturaValue * 5 * 100) / 1024;
  }
  matriz.printNumber(temperatura);
}

void luz() {

  sensorValue = analogRead (sensorLDR);
  //Serial.println (sensorValue);
  //delay(500);

  //segun el valor del senor se representara una grafica

  if (sensorValue < 250) {
    matriz.cleanMatrix();
  }
  if (sensorValue >= 250 && sensorValue < 331) {
    matriz.printPixel(5, 1);
  }
  if (sensorValue >= 331 && sensorValue < 412) {
    matriz.printPixel(5, 1);
    matriz.printPixel(5, 2);
  }
  if (sensorValue >= 412 && sensorValue < 494) {
    matriz.printLine(5, 1, 5, 3);
    matriz.printLine(5, 3, 4, 3);
  }
  if (sensorValue >= 494 && sensorValue < 575) {
    matriz.printLine(5, 1, 5, 4);
    matriz.printLine(4, 3, 4, 4);
    matriz.printPixel(3, 4);
  }
  if (sensorValue >= 575 && sensorValue < 656) {
    matriz.printLine(5, 1, 5, 5);
    matriz.printLine(4, 3, 4, 5);
    matriz.printLine(3, 4, 3, 5);
    matriz.printPixel(2, 5);
  }
  if (sensorValue >= 656 && sensorValue < 738) {
    matriz.printLine(5, 1, 5, 6);
    matriz.printLine(4, 3, 4, 6);
    matriz.printLine(3, 4, 3, 6);
    matriz.printLine(2, 5, 2, 6);
  }
  if (sensorValue > 738) {
    matriz.printLine(5, 1, 5, 7);
    matriz.printLine(4, 3, 4, 7);
    matriz.printLine(3, 4, 3, 7);
    matriz.printLine(2, 5, 2, 7);
    matriz.printPixel(1, 7);
  }
}
void dist() {

  estadoBoton = digitalRead(botonPin);
  if (estadoBoton == HIGH) {
    a = estadoBoton;
  }

  if (a == HIGH) {
    for (int x; x < 128; x++) {
      int x1 = x / 16;
      matriz.printLine(3, 1, 3, x1);
    }
    for (int i = 0; i < 5; i++) {
      digitalWrite(buzzerPin, HIGH);
      delayMicroseconds(956);
      digitalWrite(buzzerPin, LOW);
      delayMicroseconds(956);
    }
    digitalWrite(trigPin, LOW);
    delayMicroseconds(5);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    tiempo = pulseIn(echoPin, HIGH);
    numero = int(0.017 * tiempo);
    a = LOW;
  }
  while (estadoBoton == HIGH) {
    estadoBoton = digitalRead(botonPin);
  }
  if (numero > 0 && numero <= 99) {
    matriz.printNumber(numero);
    //si el numero esta entre 99 y 2 se imprime numero
  }
 
 //si el numero si es igual a 0 se imprime una E
 if (numero == 0) {
  
    matriz.printLine (5, 4, 5, 5);
    matriz.printLine (3, 4, 3, 5);
    matriz.printLine (1, 4, 1, 5);
    matriz.printLine (1, 3, 5, 3);
    matriz.printPixel (5, 3);
  }


  //si el numero mayor a 99 se imprime un +
  if (numero > 99) {

     matriz.printLine (3, 2, 3, 6);
     matriz.printLine (1, 4, 5, 4);
     matriz.printPixel (5, 4);
  }
 }

void loop() {

  while (contador == 1) {

//Mientras que el contador sea igual a 1, primero crea una T y luego hace la función tiempo
    for (i; i<250;i++){
      matriz.printLine (1, 2, 1, 6);
      matriz.printLine (2, 4, 5, 4);
      matriz.printPixel (2,4);
      matriz.printPixel (3,4);
      matriz.printPixel (4,4);
      matriz.printPixel (5,4);
      
      delay(1);
    }
    temp();
  }
  
  while (contador == 2) {
    
//Mientras que el contador sea igual a 2, primero crea una L y luego hace la función luz
    for (i; i<500;i++){
      matriz.printLine (1, 3, 5, 3);
      matriz.printLine (5, 4, 5, 5);
      matriz.printPixel (5,3);
      delay(1);
    }
    luz();
  }
  
  while (contador == 3) {
    
//Mientras que el contador sea igual a 3, primero crea una D y luego hace la función distancia
    for (i; i<250;i++){
      matriz.printLine (1, 3, 1, 5);
      matriz.printLine (5, 3, 5, 5);
      matriz.printPixel (2,3);
      matriz.printPixel (3,3);
      matriz.printPixel (4,3);
      matriz.printPixel (2,6);
      matriz.printPixel (3,6);
      matriz.printPixel (4,6);
      delay(1);
    }
    dist();
  }
}

//Interrupción
void suma(){

  contador ++;

  if (contador > 3) {
    contador = 1;
  }
  i=0;
delay(200);
}



Deja un comentario