Capteur de distance VL6180
Dependencies: TS_DISCO_F746NG mbed LCD_DISCO_F746NG BSP_DISCO_F746NG VL6180x BUTTON_GROUP
main.cpp
- Committer:
- azerty000
- Date:
- 2020-06-26
- Revision:
- 2:ffdb56ed9b36
- Parent:
- 1:126b6cd0f4f5
File content as of revision 2:ffdb56ed9b36:
#include "mbed.h" #include <stdlib.h> #include <VL6180x.h> #include "stm32746g_discovery_lcd.h" #include "stm32746g_discovery_ts.h" #include "button_group.hpp" #include <string> #include "iut.h" //Adresse du capteur #define VL6180X_ADDRESS 0x29 // Procéde à l'identification du capteur VL6180xIdentification identification; // mbed uses 8bit addresses shift address by 1 bit left VL6180x sensor(D14, D15, VL6180X_ADDRESS<<1); //Communication avec le pc par USB Serial pc(USBTX, USBRX); //Mikami : pour la gestion des boutons using namespace Mikami; TS_DISCO_F746NG ts_; LCD_DISCO_F746NG lcd_; //fonction printIdentification qui permet l'identification du capteur et l'affichage de ces caréctéristiques(modéle , version) void printIdentification(struct VL6180xIdentification *temp) { printf("\rModel ID = "); printf("%d\n",temp->idModel); printf("\rModel Rev = "); printf("%d",temp->idModelRevMajor); printf("."); printf("%d\n",temp->idModelRevMinor); printf("\rModule Rev = "); printf("%d",temp->idModuleRevMajor); printf("."); printf("%d\n",temp->idModuleRevMinor); printf("\rManufacture Date = "); printf("%d",((temp->idDate >> 3) & 0x001F)); printf("/"); printf("%d",((temp->idDate >> 8) & 0x000F)); printf("/1"); printf("%d\n",((temp->idDate >> 12) & 0x000F)); printf(" \rPhase: "); printf("%d\n",(temp->idDate & 0x0007)); printf("\rManufacture Time (s)= "); printf("%d\n",(temp->idTime * 2)); printf("\n\n"); } //Logo iut void drawImage_iut(int offsetX, int offsetY) { int x = 0; int y = 0; uint32_t* dataPtr = (uint32_t*)iut.data; while(y < iut.height) { while(x < iut.width) { BSP_LCD_DrawPixel(x + offsetX, y + offsetY, *dataPtr); dataPtr++; x++; } x = 0; y++; } } int main() { wait_ms(2000); pc.baud(115200);//Pour régler la vitesse pc.printf("\r\nRUN\r\n");//envoie un message //unsigned int Button_reset = 0 ; unsigned int valeur_capteur ; char buffer [50] ; unsigned int valeur_min = 30 ; unsigned int valeur_max = 150 ; int etat = 0 ; //si etat = 0 alors rien ne se passe / si etat =1 alors c'est la valeur min / si etat = 2 alors c'est la valeur max //Initialisation de l'ecran BSP_LCD_Init(); BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS); BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER); BSP_LCD_Clear(LCD_COLOR_BLUE); BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font16); //Affichage de chaines de caréctérs (message de bienvenue et mesure) BSP_LCD_DisplayStringAt(35, 30, (uint8_t *)"BIENVENUE SUR UN CAPTEUR DE DISTANCE", CENTER_MODE); BSP_LCD_DisplayStringAt(5, 90, (uint8_t *)"Mesure", CENTER_MODE); //affichage du logo de l'iut drawImage_iut(0,0); //affichage des carectéristiques du capteur sensor.getIdentification(&identification); printIdentification(&identification); //test pour vérifier si le capteur a été bien initialisé if(sensor.VL6180xInit() != 0) { printf("FAILED TO INITALIZE\n"); }; sensor.VL6180xDefautSettings(); wait_ms(1000); // delay 1s //Switch : bouton min , max const string STR_SW[2] = {"MIN", "MAX"}; BSP_LCD_SetFont(&Font20); ButtonGroup sw(lcd_, ts_, 10, 160, 66, 40, LCD_COLOR_DARKBLUE, LCD_COLOR_DARKBLUE, 2, STR_SW, 5, 0, 2); while(1) { //affichage de la lumiére ambiante en LUX printf("\r\nAmbient Light Level (Lux) = "); printf("%f",sensor.getAmbientLight(GAIN_1) ); //Affichage de la distance en milimétres printf("\r\nDistance measured (mm) = "); printf("%d\n", sensor.getDistance() ); //Stocker la distance dans la variable "valeur_capteur" valeur_capteur = sensor.getDistance() ; //Conversion sprintf(buffer, "%d", valeur_capteur); //paramétrage de l'écran et affichage de la distance BSP_LCD_SetBackColor(LCD_COLOR_BLUE); BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)255, CENTER_MODE); //condition pour tester si le switch "MIN" est appuyé if (sw.Touched(0, LCD_COLOR_GREEN)) { BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 210, (uint8_t *)"MIN = 30 ", CENTER_MODE); etat = 1 ; // etat 1 = etat MIN } //condition pour tester si le switch "MAX" est appuyé else if (sw.Touched(1, LCD_COLOR_RED)) { BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 210, (uint8_t *)"MAX = 150 ", CENTER_MODE); etat =2 ; // etat 2 = etat MAX } else { // si etat=0 alors on affiche la mesure en continu if(etat == 0) { BSP_LCD_SetBackColor(LCD_COLOR_YELLOW); BSP_LCD_SetTextColor(LCD_COLOR_BLACK); BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)buffer, CENTER_MODE); wait_ms(500); //sinon si etat=1 on teste alors si la valeur du capteur est supérieure ou égale à la valeur min } else if (etat ==1) { if(valeur_capteur >= valeur_min) { BSP_LCD_SetBackColor(LCD_COLOR_GREEN); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)buffer, CENTER_MODE); } else { BSP_LCD_SetBackColor(LCD_COLOR_RED); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)buffer, CENTER_MODE); } //sinon si la valeur=2 n teste alors si la valeur du capteur est inférieure à la valeur max } else if(etat == 2) { if(valeur_capteur <= valeur_max) { BSP_LCD_SetBackColor(LCD_COLOR_GREEN); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)buffer, CENTER_MODE); } else { BSP_LCD_SetBackColor(LCD_COLOR_RED); BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font20); BSP_LCD_DisplayStringAt(0, 120, (uint8_t *)buffer, CENTER_MODE); } } } } }