Medir el tiempo en un potenciometro

Hola soy nuevo en el mundo de arduino y tengo un problema con un codigo que me solicitaron en la universidad se trata de ver la rotacion de un potenciometro ya tengo el codigo de esa parte, lo que no se como hacer es que me pidieron medir en tiempo de que cuando el potenciometro se mueve marque el tiempo que tardo ese movimiento asi susesivamente cuando se gire de un lado a a otro
este es mi codigo si me pudieron auxiliar seria genial ya que ya llevo una semana buscando la solucion y no doy

// Variables
float grados = 3.1416;
int potenciomentro = A0; // Pin de lectura Potenciometro 1 - Lineal

unsigned long tiempo_actual;
unsigned long tiempo_anterior;
unsigned long tiempo_final;
int valorposicion = 0; // Almacena posicion Potenciometro 1



void setup() {
  Serial.begin(9600); // Configura e inicia comunicacion serie a 9600 Baudios

}

void loop() {
valorposicion = analogRead(potenciomentro); 
tiempo_actual = millis();
tiempo_final = tiempo_actual - tiempo_anterior;

for(tiempo_anterior = 0; tiempo_anterior >0 ;tiempo_anterior++){

 break; 
}


 
Serial.println("tiempo");
Serial.println(tiempo_final);
Serial.println("Potenciometro Lineal en grados: ");
Serial.println(valorposicion/grados);
// Envia posicion de Pot1
delay(1000);
}

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 </>


Cual crees que es el objetivo de esto?
Si un potenciómetro que no dices si es de 300 grados o multivuelta, realiza uno o mas giro(s), entonces ese giro puedes convertirlo por simple regla de 3 en una rotación en grados.
Puedes usar map para convertir directamente o recordar Analisis Matemático 1 de cualquier Universidad o mas atrás, la simple regla para hacerlo.
Al final es la ecuación de una recta en la que entras con tensión medida con analogRead(pin) y sales con grados.

Pero tiene que medir tiempo...

Lo que te marca @Surbyte claramente no te lleva a nada.

Pensemos...
Tienes que medir el tiempo en movimiento.
¿Cómo sabes que el potenciómetro se mueve?
Porque cambia el valor leído por el ADC.
¿Cómo sabes que no se está moviendo?
Porque el valor leído no cambia.

Entonces tomas el tiempo cuando se produce el primer cambio del valor leído y lo comparas con el tiempo cuando al menos 2 lecturas consecutivas devuelven el mismo valor.

Claramente debes guardar en una variable el valor de la/s lectura/s anterior/es para poder comparar.

Ten en cuenta que el micro hace su tarea miles de veces por segundo, tal vez tengas que comparar más de 2 mediciones o agregar algunos milisegundos de delay entre mediciones para que no detecte un movimiento lento como una detención.

Saludos

Lo entendí mal.
Pues mas simple.
Lees el valor del potenciómetro ya no importa la tensión, sino su valor. si se encuentra mas o menos estable cosa que harías simplemente así

valorposicionAnt = valorposicion;
valorposicion = analogRead(potenciomentro);
if (abs(valorposicion - valorposicionAnt) > 5) 
   // inicias el tiempo con millis()

lo vuelves a terminar del mismo modo usando un flag que controle inico y fin.
El valor 5 es relativo, puede ser mas o menos de acuerdo a que tan estable sea la medicion del potenciómetro.
Supongamos que estas en 300 cuentas del ADC. y oscila entre 298 a 301 por eso ver siempre el valor contra el anterior. Se mantendrá en 1 a 4 digamos sin importar su signo. Si supera 5 o sea un umbral es porque lo estas moviendo.
Activas un flag que inicia la cuenta y tomas el tiempo millis()
Luego esperas se repita pero ahora que quede estable o sea que deje de moverse.
Y ahi terminas la cuenta.
Ahi armé algo que necesita trabajo pero funciona

int potenciomentro  = A0; // Pin de lectura Potenciometro 1 - Lineal

unsigned long tiempo_inicial;
unsigned long tiempo_final, tiempoAnterior;
unsigned int valor, valorAnt; // Almacena posicion Potenciometro 1
bool flag = false;

void setup() {
  Serial.begin(9600); // Configura e inicia comunicacion serie a 9600 Baudios
}

void loop() {
  valorAnt = valor;
  valor = analogRead(potenciomentro);
  if (abs(valor-valorAnt)> 5 && millis() - tiempoAnterior > 50UL) {
      flag = !flag;
           
      if (flag) {
          Serial.println("Inicia medicion.");
          tiempo_inicial = millis();  
      }
      
      else  {
          tiempo_final = millis() - tiempo_inicial;
          Serial.println("Tiempo :" + String(tiempo_final) );
      }
      tiempoAnterior = millis(); 
  }  
}

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