Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // RPM counter by IR on ESP32, transmit values to smartphone by bluetooth
- #include "time.h"
- #include "BluetoothSerial.h"
- // #include <MovingAveragePlus.h>
- #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
- #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
- #endif
- #define MIN_LOOP 16 // nombre minimal de mesures avant de calculer une moyenne
- #define IR_detection_pin 12 // digital input
- volatile double IR_time;
- volatile double IR_last_time = 0;
- unsigned long start_time4min, start_time4sec;
- unsigned long nLoop = 0;
- int NbRPM, prevNbRPM = 0;
- int nSec;
- BluetoothSerial BT_Serial; // declaring second serial port.
- // Create an Arithmetic Moving Average object of unsigned int type,
- // 10 in size
- // MovingAveragePlus<unsigned> Median(16);
- // déclarations anticipées de fonctions
- word Median_filter(word t); // filtre lissage sur 8 mesures comptage-tours
- void readBT_Serial();
- void IRAM_ATTR onInfraRedD3Event() {
- IR_time = micros() - IR_last_time;
- IR_last_time = micros();
- }
- void setup() {
- Serial.begin(115200);
- // bool begin(String localName=String(), bool isMaster=false);
- //BT_Serial.begin(9600); // not existing
- //BT_Serial.setPin("9753"); // not existing
- BT_Serial.begin("Esp32_rpm"); //Bluetooth device name
- Serial.println("The device started, now you can pair it with bluetooth!");
- // initialize IR pins
- pinMode(IR_detection_pin, INPUT_PULLUP);
- attachInterrupt(digitalPinToInterrupt(IR_detection_pin), onInfraRedD3Event, RISING);
- start_time4min = start_time4sec = millis();
- }
- void loop() {
- String msg = "";
- char BT_msg[20];
- unsigned long nDivide;
- unsigned long elapsed_time4min, elapsed_time4sec;
- readBT_Serial();
- if (IR_time > 0){
- nDivide = 60 * 1000000.0 / IR_time;
- if ((nLoop < MIN_LOOP) || ((nDivide > NbRPM * 0.75) && (nDivide < NbRPM * 1.25))){
- // Median.push(nDivide);
- NbRPM = Median_filter(nDivide);
- // NbRPM = Median.get();
- nLoop = nLoop < MIN_LOOP ? ++nLoop : nLoop;
- }
- }
- elapsed_time4min = elapsed_time4sec = millis();
- nSec = int((elapsed_time4min - start_time4min) / 1000);
- // remise à zéro du comptage sur la minute
- if ((elapsed_time4min - start_time4min) > 60000) {
- start_time4min = elapsed_time4min;
- prevNbRPM = NbRPM;
- }
- // envoi des mesures toutes les secondes vers le périphérique externe ordi ou smartphone
- if ((elapsed_time4sec - start_time4sec) > 1000) {
- start_time4sec = elapsed_time4sec;
- sprintf(BT_msg, "%5d,%3d,%5d", NbRPM, nSec, prevNbRPM);
- BT_Serial.println(BT_msg);
- }
- delay(250);
- }
- void readBT_Serial(){
- String msg = "";
- while (BT_Serial.available()){
- delay(10);
- if(BT_Serial.available() > 0 ) {
- char c = BT_Serial.read();
- msg += c;
- }
- //Serial.println(msg);
- // reset de l'Esp32 si commande reçue
- if (msg == "RESET"){
- ESP.restart();
- }
- }
- }
- //
- // Glow Hott pour télémesure Graupner Hott
- //
- // Filtrage pour valeur compte-tours
- //
- // Auteur : www.thyzoon.fr 2015
- //
- // modifié à 8 compteurs par Patrick en 2022-01
- // Filtre pour compte-tours moteur
- // Filtrage median = : tri de 3 valeurs, pris en compte de la valeur mediane.
- // Moyenne de 8 valeurs consécutives.
- //
- word Median_filter(word v) {
- byte i,j;
- word mini;
- word temp;
- static word t0=0,t1=0,t2=0; // Variables de memorisation car le tableau ne peut pas etre static
- word t[3]; // tableau utilise pour le tri des valeurs
- static long fi0=1536,fi1=1536,fi2=1536,fi3=1536,fi4=1536,
- fi5=1536, fi6=1536, fi7=1536; // variables du filtre
- long filtre; // resultat du filtrage
- // Decalage des 3 echantillons (2 memorisées et nouvelle valeur)
- t2 = t1;
- t1 = t0;
- t0 = v;
- // Transfert des 3 valeurs dans le tableau pour faire le tri
- t[0] = t0;
- t[1] = t1;
- t[2] = t2;
- // Tri des valeurs par ordre croissant
- for (i=0; i<=1; i++) {
- mini = i;
- for (j=i+1; j<=2; j++) {
- if (t [j] < t [mini])
- mini = j;
- }
- if (mini != i) { // échange
- temp = t [i];
- t [i] = t [mini];
- t [mini] = temp;
- }
- }
- // Valeur médiane => t[1]
- fi0 = (long) t[1];
- // Moyenne des 8 dernieres valeurs
- filtre = (fi0 + fi1 + fi2 + fi3 + fi4 + fi5 + fi6 + fi7) / 8;
- fi7 = fi6; // Décalage
- fi6 = fi5; // Décalage
- fi5 = fi4; // Décalage
- fi4 = fi3; // Décalage
- fi3 = fi2; // Décalage
- fi2 = fi1; // Décalage
- fi1 = fi0; // mémorisation valeur mediane
- return ((word)filtre);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement