Hola, estoy empezando con arduino y guiandome de internet y algunas otras paginas intente usar interrupciones para calcular la velocidad y aceleracion con sensores IR , el problema es a veces me da valores muy altos , este es mi codigo:
const int Trigger=8;
const int Echo=9;
float valor;//angulo a ingresar
float pi=3.1415926553;
float aceleracion;
float aceleracion2;
float tiempo;
float tiempo2;
float tiempo_medio;
float aceleracion_media;
float u;// coeficiente de rozamiento
float u2;
float u_prom;
float velocidad;
float velocidad2;
float velocidad_media;
#include <LiquidCrystal.h>//libreria de la pantalla LCD 16x2
#include <math.h>//libreria de matematica
const int button= 10;
int buttonState = 0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 7, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
unsigned long t1 = 0;// variables iniciales para el tiempo 1
unsigned long t2 = 0;//variable inicial para el tiempo 2
unsigned long t3 = 0;// variable inicial para el tiempo 3
void sens1 () {if ((t1==0)&&(t2==0)) t1=micros(); } //funcion en la que se activa conteo del tiempo en microsegundos en el sensor1
void sens2 () {if ((t2==0)&&(t1!=0)) t2=micros(); }//funcion en la que se activa conteo del tiempo en microsegundos en el sensor2
void sens3 () {if ((t3==0)&&(t2!=0)) t3=micros(); }// t3 iagual al valor devuelto por la funcion micros si t1 y t2 no son 0
void setup() {
lcd.begin(20,4);
lcd.clear();
lcd.setCursor (0,0);
pinMode(Trigger, OUTPUT);// salida
pinMode(Echo, INPUT);// entrada de sensor proximidad
digitalWrite(Trigger, LOW);
pinMode(2,INPUT);//activar entrada del sensor infrarrojo IR sensor IR 1
pinMode(3,INPUT);//activar entrada del sensor infrarrojo IR sensor IR 2
pinMode(18,INPUT);//activar la entrada del sensor infrarojo IR sensor IR 3
pinMode(13,OUTPUT);//le indicador de trayecto de un cuerpo en el sistema
attachInterrupt(0,sens1,RISING);//activar la medida del tiempo del sensor 1
attachInterrupt(1,sens2,RISING);//activar la medida del tiempo del sensor 2
attachInterrupt(5,sens3,RISING);//activar la medida del tiempo del sensor 3
Serial.begin(115200);//monitor serial 115200 en el monitor serial
}
void loop() {
//*********PARTE DE CODIGO SENSOR DE PROXIMIDAD*************
long t; //tiempo que demora el sensor en llegar al eco
float d; // distancia en centimetros
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);//Enviamos un pulso de 10us
digitalWrite(Trigger, LOW);
t=pulseIn(Echo, HIGH);//obtenemos el ancho del pulso
d=t/59;
d=d/100;
//escalamos el tiempo a una distancia en cm
Serial.print("Distancia: ");
Serial.print(d); //Enviamos serialmente el valor de la distancia
Serial.print("m");
Serial.println();
delay(100);
lcd.setCursor(0,3);
lcd.print(d);
//*******************************************************************
// ***************CALCULO DEL ANGULO DEL PLANO*****************************
digitalWrite(13,t1?HIGH:LOW); //encender el led cuando el movil pase movil frente del primer sensor
buttonState = digitalRead(button);//convetimos la lectura del switch en señal analogica
valor= atan((float)((d)/(0.617)));
Serial.print("angulo de plano =");
Serial.print(valor);//el valor seleccionado de ppm que se muestra en el monitor serial
Serial.println(" ");
delay(2000);
lcd.setCursor(0,0);
lcd.print("ang=");
lcd.print(valor*180/pi);//el valor seleccionado de ppm que se muestra en el monitor serial
lcd.print(" ");
//************************************************************************
if (buttonState== HIGH){ //interruptor servira para empezar el proceso.
if(t3>0) {
tiempo=(t2-t1)*0.000001;// formula tiempo del sensor 2 (ultimo) menos tiempo del sensor 1 por 0.000001 (para transformar en segundos )
tiempo2=(t3-t2)*0.000001;
velocidad=0.331/tiempo;
Serial.print("velocidad=");
Serial.println(velocidad);
Serial.println( "m/s");
Serial.println(tiempo);
Serial.println(tiempo2);
Serial.println(t2);
Serial.println(t3);
Serial.println(t1);//imprimir en el monitor serial 115200
aceleracion=2*0.314/((tiempo)*(tiempo));
velocidad2=0.29/tiempo2;
Serial.print("velocidad2=");
Serial.println(velocidad2);
Serial.println( "m/s");
Serial.println("coeficiente de rozamiento=");
u =(9.8*sin(valor)-aceleracion)/(9.8*cos(pi*valor/180));
Serial.print("u=");
Serial.println(u);
aceleracion2=2*0.29/((tiempo2)*(tiempo2));
Serial.print("ac2=");
Serial.println(aceleracion2);
u2 =(9.8*sin(valor)-aceleracion2)/(9.8*cos(pi*valor/180));
Serial.print("u2=");
Serial.println(u2);
u_prom=(u+u2)/2;
Serial.print(u_prom);
Serial.println(" ");
lcd.setCursor(0, 2);
lcd.print("coef= ");
lcd.print(u_prom);//tiempo q pasa el movil en la distancia predeterminada
lcd.print(" ");
aceleracion_media=(aceleracion + aceleracion2)/2;
Serial.print("aceleracion = ");
Serial.print(aceleracion_media);
Serial.println("m/s^2 "); // posicion de la aceleracion
lcd.setCursor(0,1);
lcd.print("a=");
lcd.print(aceleracion_media);//tiempo q pasa el movil en la distancia predeterminada
lcd.print("m/s^2");
t1=t2=t3=0;
}
}
else {
Serial.println("apagado");
}
}