Está en la página 1de 3

// CONSTANTES: Aquí se declaran las constantes que no cambian de valor a lo largo del

programa. Se usan para activar los pines y librerías:


#include <LiquidCrystal.h>;                     // Librería del display LCD:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);          // declaración de los pines usados por el LCD;
 byte barra0[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000 }; //
defino el nuevo carácter 0 para el tacómetro
 byte barra1[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 }; //
defino el nuevo carácter 1 para el tacómetro
 byte barra2[8] = { B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 }; //
defino el nuevo carácter 2 para el tacómetro
 byte barra3[8] = { B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 }; //
defino el nuevo carácter 3 para el tacómetro
 byte barra4[8] = { B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 }; //
defino el nuevo carácter 4 para el tacómetro
 byte barra5[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 }; //
defino el nuevo carácter 5 para el tacómetro
const int hallPin = 10;                               // Número de pin usado por el sensor de efecto hall
const int ledPin =  13;                               // Número de pin del led testigo del sensor
const int rpmmax = 4000;                         // Número de revoluciones máximas para el tacómetro
const int revbarra = rpmmax/80;              // Numero de revoluciones por cada barra del
tacómetro, hay 80 barras en una línea de lcd

2º Añadimos a lo  anterior la declaración de variables:


// VARIABLES: Aquí se declaran las variables que cambian de valor a lo largo del programa;
int hallState = 0;                                        // variable para leer el estado del sensor hall
unsigned long time = millis();                    // variable de tiempo
int RPM = 0;                                              // variable para guardar las revoluciones por minuto
int Limpiart1 = 0;                                       // variable para contar una vuelta completa del eje
int KMh = 0;                                              // variable para contar Kilómetros/hora
float perisensor = 6 * 3.1416;                   // perímetro del eje milímetros
float factorescala = perisensor * 87 *60 / 1000; // perímetro del sensor a escala 1:87 en
metros/hora
long t1 = millis();                                     // variable para medir el tiempo al primer paso del eje
por el sensor
long t2 = millis();                                     // variable para medir el tiempo al segundo paso del eje
por el sensor
int barras = 0;                                         // variable para guardar el número de barras a imprimir
en el tacómetro
int numcar = 0;                                       // Variable para guardar el numero de caracter a
imprimir en el tacómetro

3º Añadimos a lo anterior la  inicialización de Arduino:


// INICIALIZACION: Se inicializan todos los valores en Arduino para su calibración
void setup() {                                               
  lcd.begin(16, 2);                                    // se inicializa el display LCD
  lcd.print("Inicializando!");                      // se muestra un texto en pantalla
  lcd.createChar(0, barra0);                    // crea el carácter 0 en la memoria de Arduino
  lcd.createChar(1, barra1);                    // crea el carácter 1 en la memoria de Arduino
  lcd.createChar(2, barra2);                    // crea el caracter 2 en la memoria de Arduino
  lcd.createChar(3, barra3);                    // crea el carácter 3 en la memoria de Arduino
  lcd.createChar(4, barra4);                    // crea el carácter 4 en la memoria de Arduino
  lcd.createChar(5, barra5);                    // crea el carácter 5 en la memoria de Arduino
  lcd.setCursor(0, 1);                              // posiciona el cursor del display en la línea 2
          for (int x = 0; x < 16; x++){           // Bucle para imprimir 16 caracteres del tacómetro
gráfico
          lcd.write (byte(5));                        // imprimir el carácter 5 que tiene 5 barras equivalente a
un carácter completo
          }                                                    // fin del bucle
  pinMode(ledPin, OUTPUT);                 // Inicializar el pin del LED como SALIDA:
  pinMode(hallPin, INPUT);                    // Inicializar el pin del sensor como ENTRADA:
  Serial.begin(9600);                              // Establecer el puerto serie en 9600
  lcd.print("            ");                              // se borra el texto de "Inicializando":
  while (millis() < 5000) {}                       // Espera calibración durante 5 segundos
  time = millis();                                      // se toma el valor de tiempo del reloj de Arduino en
milisegundos
  lcd.begin(16, 2);                                  // Se inicializa el display
  lcd.print("            ");                             // se envían espacios al LCD para borrar el texto anterior
}                                                             // Fin de la inicialización

4º Añadimos a lo anterior el bucle del programa que se ejecutará


indefinidamente:
// BUCLE DEL PROGRAMA
void loop(){                                                    // Inicio del bucle sin fin (loop)
      hallState = digitalRead(hallPin);              // Leer el estado del sensor de efecto hall:
      if (hallState == LOW) {                             // si el estado del sensor detecta el imán, o sea es
LOW, entonces:
         digitalWrite(ledPin, HIGH);                   // enciende el LED;   
          if (Limpiart1 == 1) {                              // si es la segunda vez que el eje pasa por el
sensor, entonces:
            t2 = millis();                                        // tomar en t2 el valor del reloj interno en
milisegundos,
            RPM = 60000 / (t2 - t1);                     // calcular las revoluciones por minuto
            barras = RPM / revbarra;                  // calcular cuantas barras hay que mostrar en el
display
          KMh = RPM * factorescala / 1000;      // calcular los Kilómetros/hora a escala 1:87
          t1 = t2;                                                 // dejar en t1 el valor del reloj tomado antes en t2
para iniciar otra cuenta
          Limpiart1 = 0;                                      // poner a cero el contador de pasos del eje por el
sensor
                                                           // Actualizar el display con los datos:  
                                                                      // Imprimir RPM;
                    lcd.setCursor(0, 0);                   // poner el cursor del LCD en el primer carácter de
la primera línea del lCD
                    lcd.print("RPM ");                      // escribir el texto RPM
                    lcd.print(RPM);                         // escribir el valor de RPM
                    lcd.print("    ");                          // escribir espacios a continuación para borrar
valores anteriores
                                                                     // Imprimir KMh;
                   lcd.setCursor(9, 0);                   // Ubicar el cusor del display en la posición 10 de la
la linea 1 (el cero es posición 1)
                   lcd.print("Kmh ");                      // escribir el texto Kmh
                   lcd.print(KMh);                         // escribir el valor Kmh
                   lcd.print("   ");                           // escribir espacios a continuación para borrar
valores anteriores
                                                                   // Imprimir barras del tacómetro
  lcd.setCursor(0, 1);                                   // poscicionar el cursor en linea posición 1 de la linea
2
  for (int x = 1; x < 17; x++){                        // Bucle para imprimir los 16 caracteres del tacómetro
    if (barras > (x * 5))                                  //  Si el número de barras a imprimir > el numero de
caracter x * 5 barras por carácter, entonces:
    {
    lcd.write (byte(5));                                  // imprimir un caracter de 5 barras en la posición
actual del display
    }
    else if (barras == 0)                               //  Si el número de barras a imprimir es igual a 0,
entonces:
    {
     lcd.write (byte(0));                                // Imprimir el caracter en blanco (número 0) en la
posición actual del display
    }
    else {                                                     //  Si el número de barras no es mayor que x * 5 ni
igual a 0, entonces:
      numcar = barras - ((x - 1) * 5);            // el Nº de carácter a imprimir será 1, 2, 3 o 4 barras
      lcd.write (byte(numcar));                     // Imprimir el carácter que corresponda
      barras = 0;                                          // en adelante todos los caracteres serán 0 así que
barras se iguala a 0.
          }
  }                                                              // fin del bucle para imprimir el tacómetro
          }                                                      // fin del if (Limpiart1...
          else {                                              // si el contador del eje aún no ha pasado 2 veces
seguidas por el sensor, entonces:
          }                                                     // no hacer nada
      }                                                         // fin del if (HallState == LOW, o sea imán detectado
      else {                                                  // si el estado del sensor no ha detectado el imán, o
sea el valor es HIGH, entonces:
          digitalWrite(ledPin, LOW);            // apagar el LED:
          Limpiart1 = 1;                                // poner el contador de paso del imán a 1, es
decir, empieza el segundo giro del eje
      }                                                        // fin del else 
}                                                              // vuelta al loop infinito del programa

También podría gustarte