Sei sulla pagina 1di 3

#include <LiquidCrystal.

h> // Incluye la Libreria LiquidCrystal

LiquidCrystal lcd(1, 3, 4, 5, 6, 7); // Crea un Objeto LC. Parametros: (rs, enable, d4, d5, d6, d7)

/// Variables
////////////////////////////////////////////////////////////////////////////////////////////////////
//////////

int encoder_pin = 2; //Pin 2, donde se conecta el encoder

int Pot = A0;

int Motor = 11;

int ValPot = 0;

int pwm1;

unsigned int rpm = 0; // Revoluciones por minuto calculadas.

float velocidad = 0; //Velocidad en [Km/h]

volatile byte pulsos = 0; // Número de pulsos leidos por el Arduino en un segundo

unsigned long timeold = 0; // Tiempo

unsigned int pulsesperturn = 20; // Número de muescas que tiene el disco del encoder.

const int wheel_diameter = 64; // Diámetro de la rueda pequeña[mm]

static volatile unsigned long debounce = 0; // Tiempo del rebote.

//// Configuración del Arduino /////////////////////////////////////////////////////////

void setup(){

//Serial.begin(9600); // Configuración del puerto serie

lcd.begin(16,2); // Inicializa la interface para el LCD screen, and determina sus dimensiones
(ancho y alto) del display

Serial.println("inok");

lcd.print(" ESPE"); // Imprime "LCD Tutorial" sobre el LCD

delay(3000); // 3 segundos de espera

lcd.setCursor(0,1); // Seteamos la ubicacion texto 0 linea 1 que sera escrita sobre el LCD

lcd.print(" Andrea Ortiz");

delay(4000);

lcd.clear(); // Limpia la pantalla

delay(1500);
lcd.print("Proyecto: Fisica");

delay(3000);

lcd.clear();

pinMode(Motor, OUTPUT);

pinMode(encoder_pin, INPUT); // Configuración del pin nº2

attachInterrupt(0, counter, RISING); // Configuración de la interrupción 0, donde esta


conectado.

pulsos = 0;

rpm = 0;

timeold = 0;

/*Serial.print("Segundos ");

Serial.print("RPM ");

Serial.print("Pulsos ");

Serial.println("Velocidad[Km/h]");}*/

//// Programa principal ///////////////////////////////////////////////////////////////////////

void loop(){

ValPot= analogRead(Pot);

pwm1= map(ValPot, 0, 1023, 0, 255);

analogWrite(Motor,pwm1);

if (millis() - timeold >= 1000){ // Se actualiza cada segundo

noInterrupts(); //Don't process interrupts during calculations // Desconectamos la


interrupción para que no actué en esta parte del programa.

rpm = (60 * 1000 / pulsesperturn )/ (millis() - timeold)* pulsos;

rpm=rpm/2;// Calculamos las revoluciones por minuto

velocidad = rpm * 3.1416 * wheel_diameter * 60 / 1000000; // Cálculo de la velocidad en


[Km/h]

timeold = millis(); // Almacenamos el tiempo actual.

/*Serial.print(millis()/1000); Serial.print(" ");// Se envia al puerto serie el valor de


tiempo, de las rpm y los pulsos.

Serial.print(rpm,DEC); Serial.print(" ");


Serial.print(pulsos,DEC); Serial.print(" ");

Serial.println(velocidad,2);*/

lcd.clear();

lcd.print("RPM=");

lcd.print(rpm);

lcd.setCursor(0,1);

lcd.print("Velocidad=");

lcd.print(velocidad);

lcd.print("Km/h");

pulsos = 0; // Inicializamos los pulsos.

interrupts(); // Restart the interrupt processing // Reiniciamos la interrupción

////Fin de programa principal


//////////////////////////////////////////////////////////////////////////////////

///////////////////////////Función que cuenta los pulsos buenos


///////////////////////////////////////////

void counter(){

if( digitalRead (encoder_pin) && (micros()-debounce > 500) && digitalRead (encoder_pin) ) {

// Vuelve a comprobar que el encoder envia una señal buena y luego comprueba que el
tiempo es superior a 1000 microsegundos y vuelve a comprobar que la señal es correcta.

debounce = micros(); // Almacena el tiempo para comprobar que no contamos el rebote


que hay en la señal.

pulsos++;} // Suma el pulso bueno que entra.

else ; }

Potrebbero piacerti anche