Advertisement
DuboisP

RPM Counter by IR and BT on ESP32

May 4th, 2024 (edited)
966
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.89 KB | Source Code | 0 0
  1. // RPM counter by IR on ESP32, transmit values to smartphone by bluetooth
  2.  
  3. #include "time.h"
  4. #include "BluetoothSerial.h"
  5.  
  6. // #include <MovingAveragePlus.h>
  7.  
  8. #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
  9. #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
  10. #endif
  11.  
  12. #define MIN_LOOP           16                   // nombre minimal de mesures avant de calculer une moyenne
  13. #define IR_detection_pin   12                   // digital input  
  14.  
  15. volatile double IR_time;
  16. volatile double IR_last_time = 0;
  17. unsigned long start_time4min, start_time4sec;
  18. unsigned long nLoop = 0;
  19. int NbRPM, prevNbRPM = 0;
  20. int nSec;
  21.  
  22. BluetoothSerial BT_Serial;                      // declaring second serial port.
  23.  
  24. // Create an Arithmetic Moving Average object of unsigned int type,
  25. // 10 in size
  26. // MovingAveragePlus<unsigned> Median(16);
  27.  
  28.  
  29. // déclarations anticipées de fonctions
  30. word Median_filter(word t);                     // filtre lissage sur 8 mesures comptage-tours
  31. void readBT_Serial();
  32.  
  33.  
  34. void IRAM_ATTR onInfraRedD3Event() {
  35.  
  36.    IR_time = micros() - IR_last_time;
  37.    IR_last_time = micros();
  38. }
  39.  
  40.  
  41. void setup() {
  42.  
  43.    Serial.begin(115200);
  44.    
  45.    //   bool begin(String localName=String(), bool isMaster=false);
  46.    //BT_Serial.begin(9600);         // not existing
  47.    //BT_Serial.setPin("9753");      // not existing
  48.    BT_Serial.begin("Esp32_rpm");    //Bluetooth device name
  49.    Serial.println("The device started, now you can pair it with bluetooth!");    
  50.    
  51.    // initialize IR pins
  52.    pinMode(IR_detection_pin, INPUT_PULLUP);
  53.    attachInterrupt(digitalPinToInterrupt(IR_detection_pin), onInfraRedD3Event, RISING);
  54.    
  55.    start_time4min = start_time4sec = millis();
  56. }
  57.  
  58.  
  59. void loop() {
  60.    String msg = "";
  61.    char BT_msg[20];
  62.    unsigned long nDivide;
  63.    unsigned long elapsed_time4min, elapsed_time4sec;
  64.  
  65.    readBT_Serial();
  66.    
  67.    if (IR_time > 0){
  68.       nDivide = 60 * 1000000.0 / IR_time;
  69.       if ((nLoop < MIN_LOOP) || ((nDivide > NbRPM * 0.75) && (nDivide < NbRPM * 1.25))){
  70.         // Median.push(nDivide);
  71.          NbRPM = Median_filter(nDivide);
  72.          // NbRPM = Median.get();
  73.          nLoop = nLoop < MIN_LOOP ? ++nLoop : nLoop;
  74.       }
  75.    }
  76.    
  77.    elapsed_time4min = elapsed_time4sec = millis();
  78.    nSec = int((elapsed_time4min - start_time4min) / 1000);
  79.    // remise à zéro du comptage sur la minute
  80.    if ((elapsed_time4min - start_time4min) > 60000) {
  81.       start_time4min = elapsed_time4min;
  82.       prevNbRPM = NbRPM;
  83.    }
  84.    // envoi des mesures toutes les secondes vers le périphérique externe ordi ou smartphone
  85.    if ((elapsed_time4sec - start_time4sec) > 1000) {        
  86.       start_time4sec = elapsed_time4sec;
  87.       sprintf(BT_msg, "%5d,%3d,%5d", NbRPM, nSec, prevNbRPM);
  88.       BT_Serial.println(BT_msg);
  89.    }
  90.    
  91.    delay(250);
  92. }
  93.  
  94.  
  95. void readBT_Serial(){
  96.    String msg = "";
  97.  
  98.    while (BT_Serial.available()){
  99.       delay(10);
  100.       if(BT_Serial.available() > 0 ) {
  101.          char c = BT_Serial.read();
  102.          msg += c;
  103.       }
  104.       //Serial.println(msg);
  105.       // reset de l'Esp32 si commande reçue
  106.       if (msg == "RESET"){
  107.          ESP.restart();
  108.       }
  109.    }
  110. }
  111.  
  112.  
  113. //
  114. // Glow Hott pour télémesure Graupner Hott
  115. //
  116. // Filtrage pour valeur compte-tours
  117. //
  118. // Auteur : www.thyzoon.fr 2015
  119. //
  120. // modifié à 8 compteurs par Patrick en 2022-01
  121.  
  122. // Filtre pour compte-tours moteur
  123. // Filtrage median = : tri de 3 valeurs, pris en compte de la valeur mediane.
  124. // Moyenne de 8 valeurs consécutives.
  125. //
  126. word Median_filter(word v) {
  127.  
  128.   byte i,j;
  129.   word mini;
  130.   word temp;
  131.  
  132.   static word t0=0,t1=0,t2=0;                // Variables de memorisation car le tableau ne peut pas etre static
  133.   word t[3];                                 // tableau utilise pour le tri des valeurs
  134.   static long fi0=1536,fi1=1536,fi2=1536,fi3=1536,fi4=1536,
  135.    fi5=1536, fi6=1536, fi7=1536; // variables du filtre
  136.   long filtre;                               // resultat du filtrage
  137.  
  138.   // Decalage des 3 echantillons (2 memorisées et nouvelle valeur)
  139.   t2 = t1;
  140.   t1 = t0;
  141.   t0 = v;
  142.  
  143.   // Transfert des 3 valeurs dans le tableau pour faire le tri
  144.   t[0] = t0;
  145.   t[1] = t1;
  146.   t[2] = t2;
  147.  
  148.   // Tri des valeurs par ordre croissant
  149.   for (i=0; i<=1; i++) {
  150.     mini = i;
  151.     for (j=i+1; j<=2; j++) {
  152.       if (t [j] < t [mini])
  153.         mini = j;        
  154.     }
  155.     if (mini != i) { // échange
  156.       temp = t [i];
  157.       t [i] = t [mini];
  158.       t [mini] = temp;
  159.     }  
  160.   }
  161.  
  162.   // Valeur médiane => t[1]
  163.   fi0 = (long) t[1];
  164.   // Moyenne des 8 dernieres valeurs
  165.   filtre = (fi0 + fi1 + fi2 + fi3 + fi4 + fi5 + fi6 + fi7) / 8;
  166.   fi7 = fi6;  // Décalage  
  167.   fi6 = fi5;  // Décalage  
  168.   fi5 = fi4;  // Décalage  
  169.   fi4 = fi3;  // Décalage  
  170.   fi3 = fi2;  // Décalage
  171.   fi2 = fi1;  // Décalage
  172.   fi1 = fi0;  // mémorisation valeur mediane
  173.  
  174.   return ((word)filtre);
  175. }
  176.  
  177.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement