Interrupciones usadas en el calculo de la velocidad de un movil

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");
 }
 
}

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.