Capteur optique fourche vitesse de rotation moteur

Bonjour à tous,
J'ai pour projet de mesurer la vitesse d'un moteur et de l'afficher sur un écran oled.
Je ne veux aucune interaction en fonction de la vitesse, c'est juste un indicateur visuel.
Le programme fonctionne bien mais je reste dans la boucle "while" et du coup je ne peux pas avoir les infos de mes autres capteur, comme si le programme était en pause pendant 1 seconde et reprend.
Le capteur "fourche" Capteur optique
Je m'explique, lorsque je presse un bouton, si il n'est pas pressé en sortie de boucle "While" il n'en tient pas compte.
J'ai essayé la bibliothéque "freqcounter" et "timerOne" sans succés
Y a t-il une solution pour avoir la vitesse en temps réel et en même temps avec les infos de mes capteurs ?
Merci d'avance

int sensor = 4; // broche pour détection du capteur
int etatSensor ; // état du capteur (haut ou bas)
unsigned long start_time=0; //temps de début d'un comptage
unsigned long end_time =0; //temps de fin d'un comptage
int bouton = 2;

int clique;
int nb_trous =1 ; // nombre de trous de la roue codeuse
int etat_old= 1 ; // 
int  etat_new = 1; // les états vont changer à chaque chaque modiication de la valeu lue par le capteur (haut/5V ou bas/0V)
int compt=0; // comptage initialisé à 0
float rps=0; // vitesse intialisée à 0
float rpm=0;//rotation par minute 

void setup() 
{
  
  pinMode(sensor,INPUT_PULLUP); // la broche 3 est déclarée comme entrée
  pinMode(bouton,INPUT_PULLUP);
  Serial.begin(9600); // pour le moniteur série
}  
 
void loop()
{
 compt = 0;
 start_time=millis(); //on mesure le temps
 end_time=start_time+1000; // pour un comptage toutes les secondes
 clique = digitalRead(bouton);

while(millis()<end_time)
{ // comptage sur une seconde
  etat_new = digitalRead(sensor);
  
  if (etat_old  != etat_new) 
  { // petite boucle pour incrémenter le compteur à chaque changement d'état lu par le capteur
    etat_old = etat_new;
    compt = compt+1;
  }  
}

rps = float(compt)/(2*nb_trous) ; // il faut diviser par 2 car pour chaque trou , deux changements d'état vont être détectés
rpm = (rps)*60;
Serial.print(" rotation par seconde ");
Serial.println(rps);
Serial.print(" rotation par minute ");
Serial.println(rpm);

  if(clique==LOW)
  {
  Serial.println("click bouton");  
  }
   
}

Il faut faire un code non bloquant en utilisant millis

J'ai essayé avec la boucle if et cela ne fonctionne pas. Comment puis-je utiliser millis autrement qu'avec une boucle "while"?

Avec un if et en laissant tourner la loop()

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