Asdf

Dependencies:   mbed HC_SR04_Ultrasonic_Library

main.cpp

Committer:
brunostgr
Date:
2019-12-17
Revision:
0:c4844dc380b9

File content as of revision 0:c4844dc380b9:

/*
 * Le 16 decembre 2019
 * Bruno St-Georges et Nicolas Brochu
 * Instrumentation en systemes ordines
 * 
 * Laboratoire 8 - Capteur ultrasonique
 * Ce programme permet de mesurer une distance (mm) ou une vitesse (mm/s) a l'aide d'un capteur ultrasonique.
 * Un bouton-poussoir permet de changer le mode de fonctionnement (correction d'erreur) selon la table suivante:
 * - Mode 0: Correction par plafonnement
 * - Mode 1: Correction par omission des donnees erronees
 * - Mode 2: Correction par extrapolation
 * - Mode 3: Affichage de la vitesse
 *
 * LPC1768
 * Connexions externes:
 * Broche 21 - Bouton-poussoir
 *
 */

// Librairies
#include "mbed.h"
#include "ultrasonic.h"

// Bornes statiques du capteur
#define I_MIN_RANGE 20        // en mm; Integer
#define I_MAX_RANGE 4000      // en mm; Integer

// Variables
uint8_t uiMODECORRECTION = 0;
int iData[5] = {0, 0, 0, 0, 0};
int iI = 0;
int iDISTANCE1, iDISTANCE2, iVITESSE;

// Bouton-poussoir
DigitalIn bouton(p21);

// Fonctions periodiques
Timer t;
Ticker flipper;
void dist(int iDistance)
{
    if(uiMODECORRECTION == 0){              // Plafonnement
        if(iDistance < I_MIN_RANGE){     
            iDistance = I_MIN_RANGE;        // Remplacement par valeur minimale
        }else if(iDistance > I_MAX_RANGE){
            iDistance = I_MAX_RANGE;        // Remplacement par valeur maximale
        }
        printf("Distance %d mm\r\n", iDistance);
    }else if(uiMODECORRECTION == 1){        // Omission des valeurs erronees
        if(!(iDistance < I_MIN_RANGE || iDistance > I_MAX_RANGE)){    // Ignore les valeurs à l'extérieur de la plage
            printf("Distance %d mm\r\n", iDistance);
        }
    }else if(uiMODECORRECTION == 2){        // Extrapolation
        iData[4] = iData[3];    // FIFO pour calcul de variation moyenne
        iData[3] = iData[2];
        iData[2] = iData[1];
        iData[1] = iData[0];
        iData[0] = iDistance;   // Assignation de la valeur presente
        int iVariationMoyenne = ((iData[1] - iData[2]) + (iData[2] - iData[3]) + (iData[3] - iData[4])) / 3;
        if(!(iDistance < I_MIN_RANGE || iDistance > I_MAX_RANGE)){    // Valeurs à l'intérieur de la plage
            printf("Distance %d mm\r\n", iDistance);
        } else {
            iData[0] = iData[1] + iVariationMoyenne;    // Ajoute la variation moyenne a la derniere valeur valide
            printf("Distance %d mm\r\n", iData[0]); 
        }
    }
}

// Objet capteur ultrasonique
ultrasonic sonar(p17, p18, .1, 1, &dist);   // trig, echo, update speed, timeout, fonction a appeler

// Fonction de vitesse
void check(void){
    if(uiMODECORRECTION == 3){
        if(iI == 0){
            iDISTANCE1 = sonar.getCurrentDistance();    
            iI++;
        }
        else if(iI == 1){
            iDISTANCE2 = sonar.getCurrentDistance();    
            iI++;
        }
        else{
            iI = 0;
            iVITESSE = abs(iDISTANCE2 - iDISTANCE1) * 10;   // Vitesse en mm/s
            printf("\n\rVitesse: %i mm/s",iVITESSE);
        }
    }
}
 
// Programme principal
int main(){
    flipper.attach(&check, 0.2);
    sonar.startUpdates(); // Active le capteur
    while(1)
    {
        sonar.checkDistance();  // Mesure de la distance
        if(bouton == 0){        // Choix du mode de fonctionnement
            uiMODECORRECTION++;
            if(uiMODECORRECTION == 4){
                uiMODECORRECTION = 0;
            }
            printf("\n\rMode de correction: %u\n\r",uiMODECORRECTION);
            while(bouton == 0);
            wait_ms(25);
        }
        wait_ms(60);    // Debounce
    }
}