Micro-controllers, wireless transmission and database
This project assumes you have already installed STM32CubeIDE. You need to have previously done a basic blink sketch with blue-pill using STM32CubeIDE. I have made a complete video from installing STM32CubeIDE to LED blink program. You can watch it by clicking this link. https://www.youtube.com/watch?v=kXg467nVd_A
Click RCC → High Speed Clock (HSE) to Crystal/Ceramic Resonator
Click Clock Configuration tab → HCLK (MHz) to 72
Click Pinout and Configuration tab
Click Timer → Click TIM1 →
Clock Source set to Internal Clock
Configuration → Parameter Settings →
Prescaler set to 71
Set PB9 GPIO_Output
Click connectivity --> Click I2C1
For I2C select I2C
Configuration --> Parameter Settings
For I2C speed select Fast Mode
Inside Core/Inc Folder
fonts.h ssd1306.hInside Core/Src Folder
fonts.c ssd1306.c/* USER CODE BEGIN Includes */ #include "fonts.h" #include "ssd1306.h" #include "stdio.h" /* USER CODE END Includes */ /* USER CODE BEGIN 0 */ #define DHT11_PORT GPIOB #define DHT11_PIN GPIO_PIN_9 uint8_t RHI, RHD, TCI, TCD, SUM; uint32_t pMillis, cMillis; float tCelsius = 0; float tFahrenheit = 0; float RH = 0; uint8_t TFI = 0; uint8_t TFD = 0; char strCopy[15]; void microDelay (uint16_t delay) { __HAL_TIM_SET_COUNTER(&htim1, 0); while (__HAL_TIM_GET_COUNTER(&htim1) < delay); } uint8_t DHT11_Start (void) { uint8_t Response = 0; GPIO_InitTypeDef GPIO_InitStructPrivate = {0}; GPIO_InitStructPrivate.Pin = DHT11_PIN; GPIO_InitStructPrivate.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructPrivate.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStructPrivate.Pull = GPIO_NOPULL; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStructPrivate); // set the pin as output HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 0); // pull the pin low HAL_Delay(20); // wait for 20ms HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 1); // pull the pin high microDelay (30); // wait for 30us GPIO_InitStructPrivate.Mode = GPIO_MODE_INPUT; GPIO_InitStructPrivate.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStructPrivate); // set the pin as input microDelay (40); if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) { microDelay (80); if ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) Response = 1; } pMillis = HAL_GetTick(); cMillis = HAL_GetTick(); while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + 2 > cMillis) { cMillis = HAL_GetTick(); } return Response; } uint8_t DHT11_Read (void) { uint8_t a,b; for (a=0;a<8;a++) { pMillis = HAL_GetTick(); cMillis = HAL_GetTick(); while (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + 2 > cMillis) { // wait for the pin to go high cMillis = HAL_GetTick(); } microDelay (40); // wait for 40 us if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) // if the pin is low b&= ~(1<<(7-a)); else b|= (1<<(7-a)); pMillis = HAL_GetTick(); cMillis = HAL_GetTick(); while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)) && pMillis + 2 > cMillis) { // wait for the pin to go low cMillis = HAL_GetTick(); } } return b; } /* USER CODE END 0 */ /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim1); SSD1306_Init(); /* USER CODE END 2 */ /* USER CODE BEGIN WHILE */ while (1) { if(DHT11_Start()) { RHI = DHT11_Read(); // Relative humidity integral RHD = DHT11_Read(); // Relative humidity decimal TCI = DHT11_Read(); // Celsius integral TCD = DHT11_Read(); // Celsius decimal SUM = DHT11_Read(); // Check sum if (RHI + RHD + TCI + TCD == SUM) { // Can use RHI and TCI for any purposes if whole number only needed tCelsius = (float)TCI + (float)(TCD/10.0); tFahrenheit = tCelsius * 9/5 + 32; RH = (float)RHI + (float)(RHD/10.0); // Can use tCelsius, tFahrenheit and RH for any purposes TFI = tFahrenheit; // Fahrenheit integral TFD = tFahrenheit*10-TFI*10; // Fahrenheit decimal sprintf(strCopy,"%d.%d C ", TCI, TCD); SSD1306_GotoXY (0, 0); SSD1306_Puts (strCopy, &Font_11x18, 1); sprintf(strCopy,"%d.%d F ", TFI, TFD); SSD1306_GotoXY (0, 20); SSD1306_Puts (strCopy, &Font_11x18, 1); sprintf(strCopy,"%d.%d %% ", RHI, RHD); SSD1306_GotoXY (0, 40); SSD1306_Puts (strCopy, &Font_11x18, 1); SSD1306_UpdateScreen(); } } HAL_Delay(2000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */