
mesure le taux de CO avec le capteur Telaire T3320
Dependencies: BSP_DISCO_F746NG
Diff: main.cpp
- Revision:
- 0:c59276d46a12
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jun 22 09:43:46 2021 +0000 @@ -0,0 +1,229 @@ +#include "mbed.h" +#include "ft5336.h" +#include "stm32746g_discovery.h" +#include "stm32746g_discovery_lcd.h" +#include "stm32746g_discovery_ts.h" +#include "logo.h" + +void drawImage_logo(int offsetX, int offsetY) +{ + int x = 0; + int y = 0; + uint32_t* dataPtr = (uint32_t*)logo.data; + while(y < logo.height) { + while(x < logo.width) { + BSP_LCD_DrawPixel(x + offsetX, y + offsetY, *dataPtr); + dataPtr++; + x++; + } + x = 0; + y++; + } +} + +TS_StateTypeDef State; +TS_TouchEventTypeDef event; +DigitalOut buzer(PG_6); +I2C i2c(PB_9,PB_8); // initialisation des broches I2C + + + +int main() +{ + + char readdata[6] = {}; + char writedata[6] = {}; + int frequence = 100000; + int x = 0; + int y = 0; + int read = 0; + uint8_t adresse = 42; // adresse du capteur + uint8_t coorX = 100; + uint8_t coorY = 100; + char buf[20] = {0}; + char buf2[20] = {0}; + char buffer[10] = {}; + char bufvalue[10] = {}; + int MSB = 0; // most significant bit + int LSB = 0; // less signifiicant bit + int ppm = 0; + int etat = 1; + + BSP_LCD_Init(); // initialisation du LCD + BSP_TS_Init(BSP_LCD_GetXSize(),BSP_LCD_GetYSize()); // initialisation du touch screen + BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS); + BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER); + i2c.frequency(frequence); // frequence de communication imposee par le maître + + + int i = 0; + + + BSP_LCD_Clear(LCD_COLOR_WHITE); + + while (1) { + + + + switch(etat) + + { + + case 0 : + + writedata[0] = 0x04; + writedata[1] = 0x13; + writedata[2] = 0x8B; + writedata[3] = 0x00; + writedata[4] = 0x01; + + i2c.write(adresse, writedata, 6); // requête pour obtenir les mesures du capteur + HAL_Delay(7); + read = i2c.read(adresse, readdata, 5); // stock les mesures dans le tableau readdata + HAL_Delay(10); + + switch(read) { + + case 0: + drawImage_logo(0,0); + MSB = (int)readdata[2]; // affecte la valeur du MSB + LSB = (int)readdata[3]; // affecte la valeur du LSB + ppm = MSB*256+LSB; // calcul pour obtenir la valeur en ppm + sprintf(bufvalue,"%d",ppm); // conversion d'un nombre en caractère + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); + BSP_LCD_DisplayStringAt(40, 100, (uint8_t *)bufvalue, CENTER_MODE); + BSP_LCD_DisplayStringAt(120, 100, (uint8_t *)"ppm", CENTER_MODE); + + if(ppm > 1500) { + + BSP_LCD_Clear(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(0, 130, (uint8_t *)"Evacuer la salle", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)bufvalue, CENTER_MODE); + BSP_LCD_DisplayStringAt(90, 100, (uint8_t *)"ppm", CENTER_MODE); + BSP_LCD_SetTextColor(LCD_COLOR_RED); + BSP_LCD_DisplayStringAt(0, 160, (uint8_t *)"seuil de CO2 mauvais", CENTER_MODE); + BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE); + drawImage_logo(0,0); + buzer.write(1); + } + + else if(ppm > 600 && ppm < 1000) { + + BSP_LCD_Clear(LCD_COLOR_WHITE); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_LIGHTBLUE ); + BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)"qualite air moderee", CENTER_MODE); + BSP_LCD_DisplayStringAt(40, 100, (uint8_t *)bufvalue, CENTER_MODE); + BSP_LCD_DisplayStringAt(120, 100, (uint8_t *)"ppm", CENTER_MODE); + BSP_LCD_SetTextColor(LCD_COLOR_BLUE); + BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE); + drawImage_logo(0,0); + } + + else if(ppm > 400 && ppm < 600) { + + BSP_LCD_Clear(LCD_COLOR_WHITE); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); + BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)bufvalue, CENTER_MODE); + BSP_LCD_DisplayStringAt(80, 100, (uint8_t *)"ppm", CENTER_MODE); + BSP_LCD_SetTextColor(LCD_COLOR_BLACK); + BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)"qualite air moyen", CENTER_MODE); + BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE); + drawImage_logo(0,0); + + } + + else if(ppm <= 400) { + + BSP_LCD_Clear(LCD_COLOR_WHITE); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_BLACK); + BSP_LCD_DisplayStringAt(0, 100, (uint8_t *)bufvalue, CENTER_MODE); + BSP_LCD_DisplayStringAt(80, 100, (uint8_t *)"ppm", CENTER_MODE); + BSP_LCD_SetTextColor(LCD_COLOR_BLUE); + BSP_LCD_DisplayStringAt(0, 150, (uint8_t *)"qualite air excellente", CENTER_MODE); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_BLUE); + BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE); + drawImage_logo(0,0); + } + + + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); + BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"QUALITE AIR", CENTER_MODE); + + HAL_Delay(1000); + BSP_TS_GetState(&State); // initialise touch screen + coorX = State.touchX[0]; // récupére les coordonnées en x + coorY = State.touchY[0]; // récupére les coordonnées en y + BSP_LCD_SetFont(&LCD_DEFAULT_FONT); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(-165, 207, (uint8_t *)"<-", CENTER_MODE); + + if(coorY >= 190 && coorY <= 250 && coorX >= 25 && coorX <= 70) { + BSP_LCD_DisplayStringAt(100, 50, (uint8_t *)"affichage des mesures", CENTER_MODE); + BSP_LCD_Clear(LCD_COLOR_WHITE); + buzer.write(0); // eteind le buzer + etat = 1; + } + + break; + + case 1: + + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); + BSP_LCD_DisplayStringAt(50, 180, (uint8_t *)"I2C read nothing: ", CENTER_MODE); + + break; + + } + + + ppm = 0; // met la valeur mesuré + break; + + case 1: + + + BSP_LCD_SetFont(&LCD_DEFAULT_FONT); + BSP_LCD_SetBackColor(LCD_COLOR_WHITE); + BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE); + BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"QUALITE AIR", CENTER_MODE); + drawImage_logo(0,0); // logo iut + HAL_Delay(1000); + BSP_TS_GetState(&State); // initialise touch screen + coorX = State.touchX[0]; + coorY = State.touchY[0]; + BSP_LCD_SetTextColor(LCD_COLOR_BLUE); + BSP_LCD_DrawRect(180, 190, 120,40); + BSP_LCD_DisplayStringAt(0, 200, (uint8_t *)"mesure", CENTER_MODE); + + if(coorY >= 180 && coorY <= 220 && coorX >= 220 && coorX <= 240) { + BSP_LCD_DisplayStringAt(100, 50, (uint8_t *)"mesures CO2 en ppm ", CENTER_MODE); + etat = 0; + BSP_LCD_Clear(LCD_COLOR_WHITE); + } + + else { + etat = 1; + } + + HAL_Delay(1000); + BSP_TS_ITClear(); + BSP_TS_ResetTouchData(&State); + + + break; + } + + + + + + + } +}