
Code permettant d'interfacer le capteur MCP9808 et afficher le résultat ainsi qu'une petite application sur l'écran de la carte DISCO
Dependencies: mbed BSP_DISCO_F746NG
main.cpp@0:96f939ccb440, 2020-06-29 (annotated)
- Committer:
- samiirr
- Date:
- Mon Jun 29 20:45:04 2020 +0000
- Revision:
- 0:96f939ccb440
MCP9808
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
samiirr | 0:96f939ccb440 | 1 | #include "mbed.h" |
samiirr | 0:96f939ccb440 | 2 | #include "stm32746g_discovery_lcd.h" |
samiirr | 0:96f939ccb440 | 3 | #include "stm32746g_discovery_ts.h" |
samiirr | 0:96f939ccb440 | 4 | #include "logo.h" |
samiirr | 0:96f939ccb440 | 5 | #include <stdlib.h> |
samiirr | 0:96f939ccb440 | 6 | |
samiirr | 0:96f939ccb440 | 7 | |
samiirr | 0:96f939ccb440 | 8 | |
samiirr | 0:96f939ccb440 | 9 | |
samiirr | 0:96f939ccb440 | 10 | #define MCP9808_REG_TEMP (0x05) // Registre de température |
samiirr | 0:96f939ccb440 | 11 | #define MCP9808_REG_CONF (0x01) // Registre de configuration |
samiirr | 0:96f939ccb440 | 12 | #define MCP9808_ADDR (0x30) // adresse de base 0x18<<1 |
samiirr | 0:96f939ccb440 | 13 | |
samiirr | 0:96f939ccb440 | 14 | |
samiirr | 0:96f939ccb440 | 15 | |
samiirr | 0:96f939ccb440 | 16 | //uint16_t TS_StateTypeDef variable ; |
samiirr | 0:96f939ccb440 | 17 | //uint16_t TS_x = variable.touchX[0]; |
samiirr | 0:96f939ccb440 | 18 | //uint16_t TS_y = variable.touchY[0]; |
samiirr | 0:96f939ccb440 | 19 | |
samiirr | 0:96f939ccb440 | 20 | I2C i2c(D14,D15); |
samiirr | 0:96f939ccb440 | 21 | // sur la carte DISCO (SDA --> D14 ; SCL --> D15) |
samiirr | 0:96f939ccb440 | 22 | |
samiirr | 0:96f939ccb440 | 23 | DigitalOut myled(LED1); |
samiirr | 0:96f939ccb440 | 24 | |
samiirr | 0:96f939ccb440 | 25 | Serial pc(USBTX, USBRX,115200); // parametres de la liaison série pour affciher les résultats sur l'hype-terminal |
samiirr | 0:96f939ccb440 | 26 | |
samiirr | 0:96f939ccb440 | 27 | |
samiirr | 0:96f939ccb440 | 28 | char TempCelsiusDisplay[] = "+abc.dd C"; // chaine de caracteres de la valeur de température |
samiirr | 0:96f939ccb440 | 29 | int var = atoi(TempCelsiusDisplay); |
samiirr | 0:96f939ccb440 | 30 | |
samiirr | 0:96f939ccb440 | 31 | |
samiirr | 0:96f939ccb440 | 32 | // fonction pour afficher le logo de l'iut ajouté sur l'écran LCD |
samiirr | 0:96f939ccb440 | 33 | void drawImage(int offsetX, int offsetY) |
samiirr | 0:96f939ccb440 | 34 | { |
samiirr | 0:96f939ccb440 | 35 | int x = 0; |
samiirr | 0:96f939ccb440 | 36 | int y = 0; |
samiirr | 0:96f939ccb440 | 37 | uint32_t* dataPtr = (uint32_t*)logo.data; |
samiirr | 0:96f939ccb440 | 38 | while(y < logo.height) { |
samiirr | 0:96f939ccb440 | 39 | while(x < logo.width) { |
samiirr | 0:96f939ccb440 | 40 | BSP_LCD_DrawPixel(x + offsetX, y + offsetY, *dataPtr); |
samiirr | 0:96f939ccb440 | 41 | dataPtr++; |
samiirr | 0:96f939ccb440 | 42 | x++; |
samiirr | 0:96f939ccb440 | 43 | } |
samiirr | 0:96f939ccb440 | 44 | x = 0; |
samiirr | 0:96f939ccb440 | 45 | y++; |
samiirr | 0:96f939ccb440 | 46 | } |
samiirr | 0:96f939ccb440 | 47 | } |
samiirr | 0:96f939ccb440 | 48 | |
samiirr | 0:96f939ccb440 | 49 | |
samiirr | 0:96f939ccb440 | 50 | int main() |
samiirr | 0:96f939ccb440 | 51 | { |
samiirr | 0:96f939ccb440 | 52 | // initialisation de l'écran LCD |
samiirr | 0:96f939ccb440 | 53 | |
samiirr | 0:96f939ccb440 | 54 | uint8_t statu; |
samiirr | 0:96f939ccb440 | 55 | |
samiirr | 0:96f939ccb440 | 56 | BSP_LCD_Init(); |
samiirr | 0:96f939ccb440 | 57 | BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS); |
samiirr | 0:96f939ccb440 | 58 | BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER); |
samiirr | 0:96f939ccb440 | 59 | |
samiirr | 0:96f939ccb440 | 60 | |
samiirr | 0:96f939ccb440 | 61 | statu = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); |
samiirr | 0:96f939ccb440 | 62 | if (statu != TS_OK) { |
samiirr | 0:96f939ccb440 | 63 | BSP_LCD_Clear(LCD_COLOR_BLUE); |
samiirr | 0:96f939ccb440 | 64 | BSP_LCD_SetBackColor(LCD_COLOR_RED); |
samiirr | 0:96f939ccb440 | 65 | BSP_LCD_SetTextColor(LCD_COLOR_GREEN); |
samiirr | 0:96f939ccb440 | 66 | |
samiirr | 0:96f939ccb440 | 67 | } else { |
samiirr | 0:96f939ccb440 | 68 | BSP_LCD_Clear(LCD_COLOR_GREEN); |
samiirr | 0:96f939ccb440 | 69 | BSP_LCD_SetBackColor(LCD_COLOR_GREEN); |
samiirr | 0:96f939ccb440 | 70 | BSP_LCD_SetTextColor(LCD_COLOR_WHITE); |
samiirr | 0:96f939ccb440 | 71 | |
samiirr | 0:96f939ccb440 | 72 | } |
samiirr | 0:96f939ccb440 | 73 | |
samiirr | 0:96f939ccb440 | 74 | /*BSP_LCD_SetTextColor(LCD_COLOR_RED); |
samiirr | 0:96f939ccb440 | 75 | BSP_LCD_FillRect(50, 200, 100,50); |
samiirr | 0:96f939ccb440 | 76 | BSP_LCD_SetTextColor(LCD_COLOR_WHITE); |
samiirr | 0:96f939ccb440 | 77 | //BSP_LCD_SetBackColor(LCD_COLOR_RED); |
samiirr | 0:96f939ccb440 | 78 | BSP_LCD_DisplayStringAt(-50, 140, (uint8_t *)"MIN", CENTER_MODE);*/ |
samiirr | 0:96f939ccb440 | 79 | |
samiirr | 0:96f939ccb440 | 80 | // Création du bouton "Kelvin" |
samiirr | 0:96f939ccb440 | 81 | |
samiirr | 0:96f939ccb440 | 82 | BSP_LCD_SetTextColor(LCD_COLOR_RED); |
samiirr | 0:96f939ccb440 | 83 | BSP_LCD_FillRect(150, 200, 120,50); |
samiirr | 0:96f939ccb440 | 84 | BSP_LCD_SetTextColor(LCD_COLOR_WHITE); |
samiirr | 0:96f939ccb440 | 85 | BSP_LCD_SetBackColor(LCD_COLOR_RED); |
samiirr | 0:96f939ccb440 | 86 | BSP_LCD_DisplayStringAt(-30, 215, (uint8_t *)"Kelvin", CENTER_MODE); |
samiirr | 0:96f939ccb440 | 87 | |
samiirr | 0:96f939ccb440 | 88 | |
samiirr | 0:96f939ccb440 | 89 | |
samiirr | 0:96f939ccb440 | 90 | |
samiirr | 0:96f939ccb440 | 91 | char data_write[3]; |
samiirr | 0:96f939ccb440 | 92 | char data_read[2]; |
samiirr | 0:96f939ccb440 | 93 | int tempval; |
samiirr | 0:96f939ccb440 | 94 | //int tempK ; |
samiirr | 0:96f939ccb440 | 95 | |
samiirr | 0:96f939ccb440 | 96 | //tempK = var + 273; |
samiirr | 0:96f939ccb440 | 97 | //char nbr = (char)tempK; |
samiirr | 0:96f939ccb440 | 98 | //wait(3); |
samiirr | 0:96f939ccb440 | 99 | |
samiirr | 0:96f939ccb440 | 100 | |
samiirr | 0:96f939ccb440 | 101 | data_write[0] = MCP9808_REG_CONF; |
samiirr | 0:96f939ccb440 | 102 | data_write[1] = 0x00; // config msb |
samiirr | 0:96f939ccb440 | 103 | data_write[2] = 0x00; // config lsb |
samiirr | 0:96f939ccb440 | 104 | |
samiirr | 0:96f939ccb440 | 105 | int status = i2c.write(MCP9808_ADDR, data_write, 3, 0); |
samiirr | 0:96f939ccb440 | 106 | if (status != 0) { // Error |
samiirr | 0:96f939ccb440 | 107 | |
samiirr | 0:96f939ccb440 | 108 | while (1) { |
samiirr | 0:96f939ccb440 | 109 | //drawImage(0,0); |
samiirr | 0:96f939ccb440 | 110 | |
samiirr | 0:96f939ccb440 | 111 | |
samiirr | 0:96f939ccb440 | 112 | myled = !myled; |
samiirr | 0:96f939ccb440 | 113 | wait(0.2); |
samiirr | 0:96f939ccb440 | 114 | } |
samiirr | 0:96f939ccb440 | 115 | } |
samiirr | 0:96f939ccb440 | 116 | |
samiirr | 0:96f939ccb440 | 117 | while (1) { |
samiirr | 0:96f939ccb440 | 118 | |
samiirr | 0:96f939ccb440 | 119 | |
samiirr | 0:96f939ccb440 | 120 | |
samiirr | 0:96f939ccb440 | 121 | drawImage(0,1); // emplacement du logo de l'iut sur l'écran LCD |
samiirr | 0:96f939ccb440 | 122 | |
samiirr | 0:96f939ccb440 | 123 | // Read temperature register |
samiirr | 0:96f939ccb440 | 124 | data_write[0] = MCP9808_REG_TEMP; |
samiirr | 0:96f939ccb440 | 125 | i2c.write(MCP9808_ADDR, data_write, 1, 1); // no stop |
samiirr | 0:96f939ccb440 | 126 | i2c.read(MCP9808_ADDR, data_read, 2, 0); |
samiirr | 0:96f939ccb440 | 127 | |
samiirr | 0:96f939ccb440 | 128 | |
samiirr | 0:96f939ccb440 | 129 | |
samiirr | 0:96f939ccb440 | 130 | // check Ta vs Tcrit |
samiirr | 0:96f939ccb440 | 131 | if((data_read[0] & 0x80) == 0x80) { |
samiirr | 0:96f939ccb440 | 132 | //pc.printf(" temp >= critique "); |
samiirr | 0:96f939ccb440 | 133 | } |
samiirr | 0:96f939ccb440 | 134 | if((data_read[0] & 0x40) == 0x40) { |
samiirr | 0:96f939ccb440 | 135 | //pc.printf(" temp > limite superieur "); |
samiirr | 0:96f939ccb440 | 136 | } |
samiirr | 0:96f939ccb440 | 137 | if((data_read[0] & 0x20) == 0x20) { |
samiirr | 0:96f939ccb440 | 138 | //pc.printf(" temp < limite inférieure "); |
samiirr | 0:96f939ccb440 | 139 | } |
samiirr | 0:96f939ccb440 | 140 | if(data_read[0] & 0xE0) { |
samiirr | 0:96f939ccb440 | 141 | //pc.printf("\r\n"); |
samiirr | 0:96f939ccb440 | 142 | data_read[0] = data_read[0] & 0x1F; // effacer les bits de drapeau |
samiirr | 0:96f939ccb440 | 143 | } |
samiirr | 0:96f939ccb440 | 144 | if((data_read[0] & 0x10) == 0x10) { |
samiirr | 0:96f939ccb440 | 145 | data_read[0] = data_read[0] & 0x0F; |
samiirr | 0:96f939ccb440 | 146 | TempCelsiusDisplay[0] = '-'; |
samiirr | 0:96f939ccb440 | 147 | tempval = 256 - (data_read[0] << 4) + (data_read[1] >> 4); |
samiirr | 0:96f939ccb440 | 148 | } else { |
samiirr | 0:96f939ccb440 | 149 | TempCelsiusDisplay[0] = '+'; |
samiirr | 0:96f939ccb440 | 150 | tempval = (data_read[0] << 4) + (data_read[1] >> 4); |
samiirr | 0:96f939ccb440 | 151 | } |
samiirr | 0:96f939ccb440 | 152 | |
samiirr | 0:96f939ccb440 | 153 | // partie fractionnaire (précision 0.25°C) |
samiirr | 0:96f939ccb440 | 154 | if (data_read[1] & 0x08) { |
samiirr | 0:96f939ccb440 | 155 | if(data_read[1] & 0x04) { |
samiirr | 0:96f939ccb440 | 156 | TempCelsiusDisplay[5] = '7'; |
samiirr | 0:96f939ccb440 | 157 | TempCelsiusDisplay[6] = '5'; |
samiirr | 0:96f939ccb440 | 158 | } else { |
samiirr | 0:96f939ccb440 | 159 | TempCelsiusDisplay[5] = '5'; |
samiirr | 0:96f939ccb440 | 160 | TempCelsiusDisplay[6] = '0'; |
samiirr | 0:96f939ccb440 | 161 | } |
samiirr | 0:96f939ccb440 | 162 | } else { |
samiirr | 0:96f939ccb440 | 163 | if(data_read[1] & 0x04) { |
samiirr | 0:96f939ccb440 | 164 | TempCelsiusDisplay[5] = '2'; |
samiirr | 0:96f939ccb440 | 165 | TempCelsiusDisplay[6] = '5'; |
samiirr | 0:96f939ccb440 | 166 | } else { |
samiirr | 0:96f939ccb440 | 167 | TempCelsiusDisplay[5] = '0'; |
samiirr | 0:96f939ccb440 | 168 | TempCelsiusDisplay[6] = '0'; |
samiirr | 0:96f939ccb440 | 169 | } |
samiirr | 0:96f939ccb440 | 170 | } |
samiirr | 0:96f939ccb440 | 171 | |
samiirr | 0:96f939ccb440 | 172 | // Partie entière |
samiirr | 0:96f939ccb440 | 173 | TempCelsiusDisplay[1] = (tempval / 100) + 0x30; |
samiirr | 0:96f939ccb440 | 174 | TempCelsiusDisplay[2] = ((tempval % 100) / 10) + 0x30; |
samiirr | 0:96f939ccb440 | 175 | TempCelsiusDisplay[3] = ((tempval % 100) % 10) + 0x30; |
samiirr | 0:96f939ccb440 | 176 | |
samiirr | 0:96f939ccb440 | 177 | // Affichage du résultat |
samiirr | 0:96f939ccb440 | 178 | pc.printf("temperature = %s\r\n", TempCelsiusDisplay); // affichage de la température sur l'hyper-terminal |
samiirr | 0:96f939ccb440 | 179 | //pc.printf("temperature = %s\r\n", nbr); |
samiirr | 0:96f939ccb440 | 180 | |
samiirr | 0:96f939ccb440 | 181 | HAL_Delay(1000); |
samiirr | 0:96f939ccb440 | 182 | BSP_LCD_SetFont(&Font12); |
samiirr | 0:96f939ccb440 | 183 | BSP_LCD_SetFont(&Font20); |
samiirr | 0:96f939ccb440 | 184 | //sprintf((char*)text, "temperature : %5.3f cm", TempCelsiusDisplay); |
samiirr | 0:96f939ccb440 | 185 | BSP_LCD_DisplayStringAt(0, 70, (uint8_t *) "MCP9808 : CAPTEUR DE TEMPERATURE", CENTER_MODE); //message de bienvenue |
samiirr | 0:96f939ccb440 | 186 | BSP_LCD_DisplayStringAt(135, 100, (uint8_t *) TempCelsiusDisplay, CENTER_MODE); //affichage de la valeur de température sur l'écran LCD |
samiirr | 0:96f939ccb440 | 187 | //BSP_LCD_DisplayStringAt(135, 120, (uint8_t *) nbr, CENTER_MODE); |
samiirr | 0:96f939ccb440 | 188 | |
samiirr | 0:96f939ccb440 | 189 | |
samiirr | 0:96f939ccb440 | 190 | |
samiirr | 0:96f939ccb440 | 191 | //pc.printf("temperature= %i", tempval); |
samiirr | 0:96f939ccb440 | 192 | myled = !myled; |
samiirr | 0:96f939ccb440 | 193 | wait(1.0); |
samiirr | 0:96f939ccb440 | 194 | } |
samiirr | 0:96f939ccb440 | 195 | |
samiirr | 0:96f939ccb440 | 196 | } |
samiirr | 0:96f939ccb440 | 197 | |
samiirr | 0:96f939ccb440 | 198 | |
samiirr | 0:96f939ccb440 | 199 | |
samiirr | 0:96f939ccb440 | 200 |