volviendome loco con los decimales

Hola, resumen de lo que quiero hacer, tengo dos sensores IR para calcular la velocidad del objeto que pasa entre ellos, lo tengo puesto en interrupcion de hardware, y calculando en microsegundos, de forma de que cuando se interrumpe el primer sensor calcula el mmicrotiempo, y cuando se interrumpe el otro calcula su microtiempo, luego resto el primero al segundo y me da los microsegundos que ha tardado, pues bien quiero convertirlo a segundos y no me lo calcula, solo me pone en print numeros enteros:

variables:
unsigned long tiempo1 = 0;  
unsigned long tiempo2 = 0;  
unsigned long segundos1;//microsegundos
float segundos2;//segundos

en el loop:
if ((conta==1) && (contador==1)){
 segundos1=tiempo2-tiempo1;
 segundos2=segundos1/1000000;
}
Serial.print(segundos1);
Serial.println(" microsegundos");
Serial.print(segundos2);
Serial.println(" segundos");

lo necesito en segundos (y horas) para luego calcular los metros/segundos y los km/hora

Hola, Pon el código en su sitio (``); es uno de los iconos. (Ya verás cuando se levante Surbyte ...). Mira esto: https://www.arduino.cc/reference/en/language/variables/data-types/float/ y, en general, todo lo referente a las variables.

Saludos

vale si, no sabia que se podia cambiar el tipo de variable en medio de la operación... ya lo hice y funciona thz. una pregunta aunque en la pantalla serial no salgan decimales(lo de poner var,7 para que salgan 7 decimales) se sigue calculando no?

Que tal si prensentas asi?

char buffer[30], str[7]; // controla el tamaño de str para mas decimales

if ((conta==1) && (contador==1)){
   segundos1 = tiempo2-tiempo1;
   segundos2 = segundos1/1000000;
}
// supongo que segundos2  esta definida como float.
dtostrf(segundos2 , 6, 4, str);   // 4 decimales mas el . decimal mas 1 entero = 6 digitos
sprintf(buffer,"T1 = %ld uSeg T2 = %s uSeg", segundos1, str1);
Serial.println(buffer);

ebsigma:
vale si, no sabia que se podia cambiar el tipo de variable en medio de la operación… ya lo hice y funciona thz. una pregunta aunque en la pantalla serial no salgan decimales(lo de poner var,7 para que salgan 7 decimales) se sigue calculando no?

Que yo recuerde si pones la variable “a pelo” sale con sus decimales, ¿no?

Saludos

Si pero con solo 2, mi sugerencia es por si quiere mas.

surbyte:
Si pero con solo 2, mi sugerencia es por si quiere mas.

OK.
Saludos.

al final lo hice así:

volatile int contador = 0;   
volatile int conta = 0; 
byte temp=0;
  
int OutPin7 = 7;
int OutPin9 = 9;
unsigned long tiempo1 = 0;  //guarda tiempo de referencia para comparar
unsigned long tiempo2 = 0;  //guarda el tiempo que resta por contar cuando presionamos la pausa
unsigned long segundos1;//microsegundos
float segundos2;//segundos
float hora;
float metros=0.0675;
float km=0.0000675;
float metrosegundo;
float kmhora;
float kmhora2;

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

 //-------------------------------------------------------------- 
void setup() {
   lcd.init();
    lcd.backlight();
  pinMode(OutPin7, OUTPUT);
   digitalWrite(OutPin7, HIGH);
     pinMode(OutPin9, OUTPUT);
   digitalWrite(OutPin9, HIGH);
  Serial.begin(9600);
  attachInterrupt(1,interrupcion1,RISING);  // Interrupcion 0 (pin3) 
    attachInterrupt(0,interrupcion0,RISING);  // Interrupcion 0 (pin2) 
   // LOW, CHANGE, RISING, FALLING
     lcd.setCursor(0,0);
  lcd.print(" Mide velocidad");
  lcd.setCursor(2,1);
  lcd.print("(m/s y Km/h)");
  delay(2000);
  lcd.clear();
}                                          
 //-----------------------------------------------------------------------------------
 
void loop() {
  delay(1000);               // retardo de casi 1 segundo

if (conta==1){

}

if(contador==1){
 // contador=0;
}
if ((conta==1) && (contador==1)){
  segundos1=tiempo2-tiempo1;
  segundos2=(float)segundos1/1000000;
  hora=segundos2/3600;
  metrosegundo=metros/segundos2;
  kmhora=metrosegundo/1000;
  kmhora2=kmhora*3600;
}
//Serial.print(segundos1);
//Serial.println(" microsegundos");
//Serial.print(segundos2,6);
//Serial.println(" segundos");

     lcd.setCursor(0,0);
  lcd.print("  m/s    Km/h");

     
     
     lcd.setCursor(2,1);
  lcd.print(metrosegundo);
       lcd.setCursor(9,1);
  lcd.print(kmhora2);
}

//----------------------------------------------------------------------------------

void interrupcion1()    // Funcion que se ejecuta durante cada interrupion
{
   tiempo1=micros(); 
  conta=0;
  conta++;           // Se incrementa en uno el contador
}

 
void interrupcion0()    // Funcion que se ejecuta durante cada interrupion
{
    tiempo2=micros();
  contador=0;
  contador++;           // Se incrementa en uno el contador
}

ya le metí la pantalla y tal,

No entiendo muy bien lo de los "contadores" del final, porque mas q contadores son variables booleanas. Primero las pones a 0 y luego le sumas 1, y al siguiente ciclo las vuelves a poner a cero y le vuelves a sumar uno.

No veo qeu contador sea booleano

volatile int contador = 0;

pero esto si que no lo entiendo

  contador=0;
  contador++;           // Se incrementa en uno el contador

para eso simplemente le pones

  contador=1;

porque jamas tomará otro valor que ese.

Lo mismo con conta

A eso mismo me refiero, que según tiene puesto los 2 contadores solo pueden ser 1 o 0, así que al final lo utiliza como si fuera una variable booleana.

No sé es un poco rara esa parte del código, a ver si dice que pretende hacer para que nos aclaremos :)

Today at 11:40:31
A eso mismo me refiero, que según tiene puesto los 2 contadores solo pueden ser 1 o 0, así que al final lo utiliza como si fuera una variable booleana.

Te comprendo pero el único valor efectivo de conta y contador es 1.
No importa que pase, siempre vale 1 salvo cuando arranca que por untiempo el compilador lo pone en 0. Luego con cada interrupción vale 1 siempre a los efectos prácticos.
No me digas que lo pone a 0, porque cuando la interrupción termina siempre valdra 1 cualquiera de los dos contadores.

surbyte: Te comprendo pero el único valor efectivo de conta y contador es 1. No importa que pase, siempre vale 1 salvo cuando arranca que por untiempo el compilador lo pone en 0. Luego con cada interrupción vale 1 siempre a los efectos prácticos. No me digas que lo pone a 0, porque cuando la interrupción termina siempre valdra 1 cualquiera de los dos contadores.

Pero si te fijas mas arriba en el código también le tiene puesto para q valga 0, aunque lo tiene anulado, si que lo tiene escrito

if(contador==1){
 // contador=0;
}

no sé, esta parte del código no tiene mucho sentido...

la idea era como variable boleana pero la puse volatil... para que no se pongan los dos a la vez y se ejecute el IF del bucle todo el rato, así primero la "bala" pasa por un punto y guarda el valor del tiempo y luego igual por el punto dos y espera... pero... nosé yo le encontré la lógica así, haré mas pruebas quitandolo a ver si funciona igual pero bueno la duda que tenia ya la solucioné. gracias por toda la info y por ser una comunidad tan activa!