Programme du projet interfacage : Detecteur de couleur QUINQUIRY Guillaume LPRO MECSE

Dependencies:   mbed APDS_9960 BSP_DISCO_F746NG

Committer:
guillaumequinquiry
Date:
Thu Jun 24 12:00:03 2021 +0000
Revision:
0:3d348423a518
Programme interfacage QUINQUIRY Guillaume

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guillaumequinquiry 0:3d348423a518 1 #include "mbed.h" // Bibliothèque mbed intialement dans le programme
guillaumequinquiry 0:3d348423a518 2 #include "stm32746g_discovery_lcd.h" // bibliothèque pour les fonctions de l’écran lcd (graphique)
guillaumequinquiry 0:3d348423a518 3 #include "stm32746g_discovery_ts.h" // bibliothèque pour les fonctions de l’écran lcd (tactile)
guillaumequinquiry 0:3d348423a518 4 #include "stm32746g_discovery.h" // bibliothèque pour les fonctions de la carte stm32746g
guillaumequinquiry 0:3d348423a518 5 #include "glibr.h" // bibiliothèque pour les fonctions des capteurs de l'APDS9960
guillaumequinquiry 0:3d348423a518 6
guillaumequinquiry 0:3d348423a518 7 // Masques pour le capteur de couleur donc la valeur est codée sur 16 bits
guillaumequinquiry 0:3d348423a518 8 #define HIGH 0xFF00
guillaumequinquiry 0:3d348423a518 9 #define LOW 0x00FF
guillaumequinquiry 0:3d348423a518 10
guillaumequinquiry 0:3d348423a518 11 int main()
guillaumequinquiry 0:3d348423a518 12 {
guillaumequinquiry 0:3d348423a518 13 glibr ColorSensor(PB_9,PB_8); // bus I2C broches sda, scl
guillaumequinquiry 0:3d348423a518 14 InterruptIn interrupt(PA_8); // broche d'interruption
guillaumequinquiry 0:3d348423a518 15 Serial pc(USBTX, USBRX); // définition du port usb
guillaumequinquiry 0:3d348423a518 16 uint16_t light, r, b, g; // Variable contenant les couleurs pour le rouge,vert,bleu
guillaumequinquiry 0:3d348423a518 17 uint8_t text[30], text1[30],text2[30], text3[30], text4[30],p;// Variable pour pouvoir afficher les valeurs sur l'écran LCD
guillaumequinquiry 0:3d348423a518 18 char rouge[500], vert[500], bleu[500];
guillaumequinquiry 0:3d348423a518 19 TS_StateTypeDef TS_State = {0}; // Variable comprenant l'état de l'écran tactile
guillaumequinquiry 0:3d348423a518 20 int touchScreen=1; //
guillaumequinquiry 0:3d348423a518 21
guillaumequinquiry 0:3d348423a518 22 BSP_LCD_Init(); // initialisation de l'écran LCD
guillaumequinquiry 0:3d348423a518 23 BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
guillaumequinquiry 0:3d348423a518 24 BSP_LCD_SelectLayer(0);
guillaumequinquiry 0:3d348423a518 25
guillaumequinquiry 0:3d348423a518 26 /* Initialisation de l'écran tactile */
guillaumequinquiry 0:3d348423a518 27 if (BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()) == TS_ERROR) {
guillaumequinquiry 0:3d348423a518 28 printf("BSP_TS_Init error\n");
guillaumequinquiry 0:3d348423a518 29 }
guillaumequinquiry 0:3d348423a518 30
guillaumequinquiry 0:3d348423a518 31 /* Mise à blanc de l'écran tactile */
guillaumequinquiry 0:3d348423a518 32 BSP_LCD_Clear(LCD_COLOR_WHITE);
guillaumequinquiry 0:3d348423a518 33
guillaumequinquiry 0:3d348423a518 34 /* Affichage de l'interface d'entrée */
guillaumequinquiry 0:3d348423a518 35 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
guillaumequinquiry 0:3d348423a518 36 BSP_LCD_FillRect(0, 0, BSP_LCD_GetXSize(), 40);
guillaumequinquiry 0:3d348423a518 37 BSP_LCD_SetTextColor(LCD_COLOR_DARKMAGENTA);
guillaumequinquiry 0:3d348423a518 38 BSP_LCD_FillRect(0, 40, BSP_LCD_GetXSize(), 40);
guillaumequinquiry 0:3d348423a518 39 BSP_LCD_SetTextColor(LCD_COLOR_DARKGREEN);
guillaumequinquiry 0:3d348423a518 40 BSP_LCD_FillRect(0, 80, BSP_LCD_GetXSize(), 45);
guillaumequinquiry 0:3d348423a518 41 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 42 BSP_LCD_SetBackColor(LCD_COLOR_GREEN);
guillaumequinquiry 0:3d348423a518 43 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 44 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Color Sensor, Touch to start", CENTER_MODE); // Affichage sur l'écran
guillaumequinquiry 0:3d348423a518 45 BSP_LCD_SetTextColor(LCD_COLOR_YELLOW);
guillaumequinquiry 0:3d348423a518 46 BSP_LCD_FillRect(0, 148, BSP_LCD_GetXSize(), 45);
guillaumequinquiry 0:3d348423a518 47 BSP_LCD_SetTextColor(LCD_COLOR_ORANGE);
guillaumequinquiry 0:3d348423a518 48 BSP_LCD_FillRect(0, 193, BSP_LCD_GetXSize(), 42);
guillaumequinquiry 0:3d348423a518 49 BSP_LCD_SetTextColor(LCD_COLOR_RED);
guillaumequinquiry 0:3d348423a518 50 BSP_LCD_FillRect(0, 235, BSP_LCD_GetXSize(), 40);
guillaumequinquiry 0:3d348423a518 51
guillaumequinquiry 0:3d348423a518 52 while(touchScreen)
guillaumequinquiry 0:3d348423a518 53 {
guillaumequinquiry 0:3d348423a518 54 BSP_TS_GetState(&TS_State);
guillaumequinquiry 0:3d348423a518 55 if (TS_State.touchDetected)
guillaumequinquiry 0:3d348423a518 56 {
guillaumequinquiry 0:3d348423a518 57 touchScreen=0; // Mise à 0 de la variable lors d'un appui sur l'écran
guillaumequinquiry 0:3d348423a518 58 }
guillaumequinquiry 0:3d348423a518 59 }
guillaumequinquiry 0:3d348423a518 60
guillaumequinquiry 0:3d348423a518 61 /* Initialisation de l'APPDS et de l'ensemble de ses capteurs*/
guillaumequinquiry 0:3d348423a518 62 if ( ColorSensor.ginit() ) {
guillaumequinquiry 0:3d348423a518 63 pc.printf("APDS-9960 initialization complete\n\r");
guillaumequinquiry 0:3d348423a518 64 } else {
guillaumequinquiry 0:3d348423a518 65 pc.printf("Something went wrong during APDS-9960 init\n\r");
guillaumequinquiry 0:3d348423a518 66 }
guillaumequinquiry 0:3d348423a518 67 while(1)
guillaumequinquiry 0:3d348423a518 68 {
guillaumequinquiry 0:3d348423a518 69 BSP_TS_GetState(&TS_State); // récupération de l'état de l'écran
guillaumequinquiry 0:3d348423a518 70 if (TS_State.touchDetected) // si appui tactile sur l'écran
guillaumequinquiry 0:3d348423a518 71 {
guillaumequinquiry 0:3d348423a518 72 BSP_LCD_Clear(LCD_COLOR_WHITE);
guillaumequinquiry 0:3d348423a518 73 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 74 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 75 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
guillaumequinquiry 0:3d348423a518 76 BSP_LCD_DisplayStringAt(0, 60, (uint8_t *)"Couleur detecte : ", CENTER_MODE); // affichage de l'application
guillaumequinquiry 0:3d348423a518 77 }
guillaumequinquiry 0:3d348423a518 78
guillaumequinquiry 0:3d348423a518 79 if ( ColorSensor.enableLightSensor(true) and ColorSensor.enableProximitySensor(true) and touchScreen == 0 ) // Utilisation des capteurs de couleur et de proximité
guillaumequinquiry 0:3d348423a518 80 {
guillaumequinquiry 0:3d348423a518 81 ColorSensor.readAmbientLight(light); // Fonction permettant de récupérer la valeur de la luminosité ambiante détecté par le capteur de lumiere
guillaumequinquiry 0:3d348423a518 82 /* Fonctions permettant de récupérer les valeurs des couleurs RGB rouge,vert,bleu détecté par le capteur de couleur/lumiere */
guillaumequinquiry 0:3d348423a518 83 ColorSensor.readRedLight(r);
guillaumequinquiry 0:3d348423a518 84 ColorSensor.readGreenLight(g);
guillaumequinquiry 0:3d348423a518 85 ColorSensor.readBlueLight(b);
guillaumequinquiry 0:3d348423a518 86 //Fonction permettant de récupérer la valeur de la proximité d'un objet avec le capteur de proximité
guillaumequinquiry 0:3d348423a518 87 ColorSensor.readProximity(p);
guillaumequinquiry 0:3d348423a518 88
guillaumequinquiry 0:3d348423a518 89 //Lecture des deux octets pour la couleur
guillaumequinquiry 0:3d348423a518 90 /*rouge[0]= (char)((r & HIGH)>>8); // affiche 0
guillaumequinquiry 0:3d348423a518 91 rouge[1]= (char) (r & LOW); // affiche la même valeur que si on affiche directement r
guillaumequinquiry 0:3d348423a518 92 i2c.read(0x39,data,2);
guillaumequinquiry 0:3d348423a518 93 sprintf((char *) lumiere,data);
guillaumequinquiry 0:3d348423a518 94 vert[0]= (char)((g & HIGH)>>8);
guillaumequinquiry 0:3d348423a518 95 vert[1]= (char) (g & LOW);
guillaumequinquiry 0:3d348423a518 96 bleu[0]= (char)((b & HIGH)>>8);
guillaumequinquiry 0:3d348423a518 97 bleu[1]= (char) (g & LOW);
guillaumequinquiry 0:3d348423a518 98 sprintf((char *)test, "%d ", rouge[0]);
guillaumequinquiry 0:3d348423a518 99 pc.printf("\nRed = ");
guillaumequinquiry 0:3d348423a518 100 pc.printf((char *)lumiere);*/
guillaumequinquiry 0:3d348423a518 101
guillaumequinquiry 0:3d348423a518 102 BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
guillaumequinquiry 0:3d348423a518 103 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 104 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 105
guillaumequinquiry 0:3d348423a518 106 // conversion des valeurs uint 16 en char pour affichage sur l'écran LCD
guillaumequinquiry 0:3d348423a518 107 sprintf((char *)text,"Lum = %d", light);
guillaumequinquiry 0:3d348423a518 108 pc.printf((char *)text);
guillaumequinquiry 0:3d348423a518 109 BSP_LCD_DisplayStringAt(70, 200, (uint8_t *)text, CENTER_MODE);
guillaumequinquiry 0:3d348423a518 110 BSP_LCD_SetTextColor(LCD_COLOR_RED);
guillaumequinquiry 0:3d348423a518 111 sprintf((char *)text1, "R = %d", r);
guillaumequinquiry 0:3d348423a518 112 pc.printf((char *)text1);
guillaumequinquiry 0:3d348423a518 113 BSP_LCD_DisplayStringAt(40, 175, (uint8_t *)text1, LEFT_MODE);
guillaumequinquiry 0:3d348423a518 114 BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
guillaumequinquiry 0:3d348423a518 115 sprintf((char *)text2, "V = %d", g);
guillaumequinquiry 0:3d348423a518 116 pc.printf((char *)text2);
guillaumequinquiry 0:3d348423a518 117 BSP_LCD_DisplayStringAt(40, 200, (uint8_t *)text2, LEFT_MODE);
guillaumequinquiry 0:3d348423a518 118 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
guillaumequinquiry 0:3d348423a518 119 sprintf((char *)text3, "B = %d", b);
guillaumequinquiry 0:3d348423a518 120 pc.printf((char *)text3);
guillaumequinquiry 0:3d348423a518 121 BSP_LCD_DisplayStringAt(40, 225, (uint8_t *)text3, LEFT_MODE);
guillaumequinquiry 0:3d348423a518 122 sprintf((char *)text4, "%d", p);
guillaumequinquiry 0:3d348423a518 123 pc.printf("\nProximite = ");
guillaumequinquiry 0:3d348423a518 124 pc.printf((char *)text4);
guillaumequinquiry 0:3d348423a518 125
guillaumequinquiry 0:3d348423a518 126 /* Début des conditions pour afficher les différentes couleurs en fonction des valeurs rgb du capteur */
guillaumequinquiry 0:3d348423a518 127
guillaumequinquiry 0:3d348423a518 128 if(r == 0 and g ==0 and b == 0)// si aucune couleur détecté => Couleur Noir
guillaumequinquiry 0:3d348423a518 129 {
guillaumequinquiry 0:3d348423a518 130 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 131 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 132 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 133 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 134 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Noir ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 135 }
guillaumequinquiry 0:3d348423a518 136
guillaumequinquiry 0:3d348423a518 137 if(b > g and g > r)// si bleu > vert > rouge => Couleur Bleu
guillaumequinquiry 0:3d348423a518 138 {
guillaumequinquiry 0:3d348423a518 139 BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
guillaumequinquiry 0:3d348423a518 140 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 141 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 142 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 143 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Bleu ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 144 }
guillaumequinquiry 0:3d348423a518 145
guillaumequinquiry 0:3d348423a518 146 if (b > r and r > g) // si bleu > rouge > vert => Couleur Violet
guillaumequinquiry 0:3d348423a518 147 {
guillaumequinquiry 0:3d348423a518 148 BSP_LCD_SetTextColor(LCD_COLOR_MAGENTA);
guillaumequinquiry 0:3d348423a518 149 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 150 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 151 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 152 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Violet", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 153 }
guillaumequinquiry 0:3d348423a518 154
guillaumequinquiry 0:3d348423a518 155 if (r > g and g > b) // si rouge > vert > bleu => Couleur Jaune
guillaumequinquiry 0:3d348423a518 156 {
guillaumequinquiry 0:3d348423a518 157 BSP_LCD_SetTextColor(LCD_COLOR_YELLOW);
guillaumequinquiry 0:3d348423a518 158 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 159 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 160 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 161 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Jaune ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 162
guillaumequinquiry 0:3d348423a518 163 }
guillaumequinquiry 0:3d348423a518 164
guillaumequinquiry 0:3d348423a518 165 if (r > g and g == b) // si rouge > vert=bleu => Couleur Orange
guillaumequinquiry 0:3d348423a518 166 {
guillaumequinquiry 0:3d348423a518 167 BSP_LCD_SetTextColor(LCD_COLOR_ORANGE);
guillaumequinquiry 0:3d348423a518 168 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 169 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 170 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 171 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Orange", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 172
guillaumequinquiry 0:3d348423a518 173 }
guillaumequinquiry 0:3d348423a518 174
guillaumequinquiry 0:3d348423a518 175 if (g > b and b > r) // si vert > bleu > rouge => Couleur Verte
guillaumequinquiry 0:3d348423a518 176 {
guillaumequinquiry 0:3d348423a518 177 BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
guillaumequinquiry 0:3d348423a518 178 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 179 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 180 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 181 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Vert ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 182 }
guillaumequinquiry 0:3d348423a518 183
guillaumequinquiry 0:3d348423a518 184 if (r > b and b > g) // si rouge > bleu > vert => Couleur Rouge
guillaumequinquiry 0:3d348423a518 185 {
guillaumequinquiry 0:3d348423a518 186 BSP_LCD_SetTextColor(LCD_COLOR_RED);
guillaumequinquiry 0:3d348423a518 187 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 188 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 189 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 190 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Rouge ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 191 }
guillaumequinquiry 0:3d348423a518 192 if(b > g and g > r and b-g < 5 and g-r < 5 ) // si bleu > vert > rouge avec une très petite différence de valeur (inférieure à 5) => Couleur Blanc
guillaumequinquiry 0:3d348423a518 193 {
guillaumequinquiry 0:3d348423a518 194 BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
guillaumequinquiry 0:3d348423a518 195 BSP_LCD_FillRect(0, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 196 BSP_LCD_FillRect(435, 0, 45, 45);
guillaumequinquiry 0:3d348423a518 197 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 198 BSP_LCD_SetFont(&Font24);
guillaumequinquiry 0:3d348423a518 199 BSP_LCD_DisplayStringAt(0, 125, (uint8_t *)"Blanc ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 200 }
guillaumequinquiry 0:3d348423a518 201
guillaumequinquiry 0:3d348423a518 202 /* Conditions d'affichage pour le capteur de proximité*/
guillaumequinquiry 0:3d348423a518 203
guillaumequinquiry 0:3d348423a518 204 if (p == 255) // si p= valeur max : objet trop loin du capteur
guillaumequinquiry 0:3d348423a518 205 {
guillaumequinquiry 0:3d348423a518 206 BSP_LCD_SetTextColor(LCD_COLOR_RED);
guillaumequinquiry 0:3d348423a518 207 BSP_LCD_DisplayStringAt(0, 10, (uint8_t *) "Objet trop pres", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 208 }
guillaumequinquiry 0:3d348423a518 209 else if (p == 0) // si p = valeur min : objet trop proche du capteur
guillaumequinquiry 0:3d348423a518 210 {
guillaumequinquiry 0:3d348423a518 211 BSP_LCD_SetTextColor(LCD_COLOR_RED);
guillaumequinquiry 0:3d348423a518 212 BSP_LCD_DisplayStringAt(0, 10, (uint8_t *) "Objet trop loin", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 213 }
guillaumequinquiry 0:3d348423a518 214 else if (0 < p < 255) // entre les deux valeurs, mesures possibles
guillaumequinquiry 0:3d348423a518 215 {
guillaumequinquiry 0:3d348423a518 216 BSP_LCD_SetTextColor(LCD_COLOR_RED);
guillaumequinquiry 0:3d348423a518 217 BSP_LCD_DisplayStringAt(0, 10, (uint8_t *) " ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 218 }
guillaumequinquiry 0:3d348423a518 219
guillaumequinquiry 0:3d348423a518 220 /* Conditions d'affichage pour le capteur de lumière ambiante*/
guillaumequinquiry 0:3d348423a518 221
guillaumequinquiry 0:3d348423a518 222 if (light < 20 )// si la lumière est trop faible
guillaumequinquiry 0:3d348423a518 223 {
guillaumequinquiry 0:3d348423a518 224 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 225 BSP_LCD_DisplayStringAt(70, 240, (uint8_t *) "Trop Faible", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 226 }
guillaumequinquiry 0:3d348423a518 227 else if (light > 20 )
guillaumequinquiry 0:3d348423a518 228 {
guillaumequinquiry 0:3d348423a518 229 BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
guillaumequinquiry 0:3d348423a518 230 BSP_LCD_DisplayStringAt(70, 240, (uint8_t *) " ", CENTER_MODE);
guillaumequinquiry 0:3d348423a518 231 }
guillaumequinquiry 0:3d348423a518 232 }
guillaumequinquiry 0:3d348423a518 233 }
guillaumequinquiry 0:3d348423a518 234 }