Medir tiempo entre condiciones

Buenas! tengo una pequeña duda que seguro vosotros sabreis resolverme rapidamente ya que no es muy complicado, pero a mi me esta costando sacarlo, ya he googleado mucho, pero aun asi no soy con la solucion...

Bueno, vereis, lo que quiero hacer es medir con arduino el tiempo que tarda un sensor de efecto hall en cambiar de estado, osea cuanto tiempo esta en estado 1 (HIGH) y cuanto tiempo esta en 0 (LOW) y luego reset de valores para volver a contar. Estoy a punto de conseguirlo, pero no consigo el reset para volver a contar, a ver si me podeis echar una mano.

Hasta ahora el codigo es este:

const int hall= 9; 
int hallv;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long t1m=0;
unsigned long t2m=0;


void setup() {
  Serial.begin(9600);
  pinMode(hall, INPUT);
}

void loop() {
  hallv = digitalRead(hall);

     if(hallv == 0){
        tiempo1 = millis();
     }
     if(hallv == 1){
        tiempo2 = millis();
     }

  
  if (tiempo1 > t1m) t1m = tiempo1;
    if (tiempo2 > t2m) t2m = tiempo2;
Serial.print(tiempo1);
Serial.print("....");
Serial.print(tiempo2);
Serial.print("....");
Serial.print(t1m);
Serial.print("....");
Serial.println(t2m);
delay(1);
  }

Gracias de antemano!!

quizas con un contador...

const int hall= 9; 
int hallv;
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long t1m=0;
unsigned long t2m=0;
unsigned long previousMillis = 0;
int cont =0;
int current =0;


void setup() {
  Serial.begin(9600);
  pinMode(hall, INPUT);
}

void loop() {

unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= 1) {   
    previousMillis = currentMillis;
    cont++;
    current=cont;
    }
    hallv = digitalRead(hall);
 
    if(hallv == 0){

       tiempo1 = current;
     }

     if(hallv == 1){
      
        tiempo2 = current;
     }
     if (hallv == 0 || hallv ==1) current = 0;


  
if (tiempo1 > t1m) t1m = tiempo1;
if (tiempo2 > t2m) t2m = tiempo2;
Serial.print(tiempo1);
Serial.print("....");
Serial.print(tiempo2);
Serial.print("....");
Serial.print(t1m);
Serial.print("....");
Serial.println(t2m);

delay(1);

  }

pero sigo sin conseguir reiniciarlo u.u

Guarda las lecturas obtenidas en una variable para poder diferenciar los cambios de estado en cada lectura del hall en el loop,por ejemplo, si lees 1 y en la anterior lectura tenias un 0 ,has cambiado de estado e inicias conteo de tiempo,si lees 1 y la lectura anterior es 1 ,no hay cambio de estado ,sigues contando.Lo del reset no lo entiendo,seria manual con un boton ? con un ciclo deteccion-no-deteccion? varios ciclos?

Gracias por responder jose!! El caso es que solo tengo dos estados, 1 y 0, los cambios solo son entre ellos, osea si tengo un 1 la lectura anterior siempre va a ser 0 o viceversa, la cosa es contar cuanto tiempo esta en cada estado, reiniciandose el contador cada vez que cambia de estado, sin ningun boton, solo cambio de estado

Gracias de antemano!!

int state,stateNow;
const int hall= 9; 
unsigned long oldTime,newTime;
void setup(){
  pinMode(hall,INPUT);
  Serial.begin(9600);
  state = digitalRead(hall);
  oldTime = millis();

}
void loop(){
  stateNow = digitalRead(hall);
  if(stateNow != state){
    state = stateNow;
    newTime = millis() - oldTime;
    oldTime = millis();
    Serial.println(newTime);
  }
}

usa esto como base,a ver que tal

1 Like

Bua jose! abrazo en la distancia tio!! es justo lo que andaba buscando! Gracias!!!! :slight_smile: