DHT11 sensor with STM32

UPDATE

For those, whose code Runs only 1 time, Give at least 3 second delay in the while loop, before reading the temperature again.

If you are not able to get DHT11 or DHT22 values, Here is another method you can use. This one is unified for both the sensors. No setup is needed for timer and all. Just select the data pin as output and you are done. you need to select the DHT TYPE in DHT.c

https://controllerstech.com/wp-content/uploads/2020/06/DHT_11_22_DWT.zip

This CODE works with the TIMER Delay. If you want to know how to create delay in microsecond using timer, first go to https://controllerstech.com/create-1-microsecond-delay-stm32/

DHT11 digital temperature and humidity sensor is a composite Sensor contains a calibrated digital signal output of the temperature and humidity. Today in this tutorial we will be using DHT11 sensor with STM32.


INITIALIZATION

DHT11 Host signal
DHT11 Host signal
DHT11 Slave signal
DHT11 Slave signal
  • As shown above, in order to initialize the sensor, we have to first pull the data line LOW for around 18 ms.
  • After this DHT11 will pull the line LOW for 80 us ,and than HIGH for 80 us.
  • Once this is done, the sensor will be initialized and start transmitting

NOTE:- You might need to connect pull-up resistor to the data line or else DHT11 will not be able to pull the line HIGH.

To initialize the sensor, the steps are as follows:-

  1. Set the pin (data) as output
  2. Pull the pin low for 18ms
  3. Release the pin by setting it as input

DHT11 will now send the response as you can see in the figure above.


Response

In order to indicate it’s presence, after receiving the start signal, DHT11 will send a response signal. To do so, it will pull the data line low for 80 us, and than high for another 80 us. To read this response, we will do the following

  • Wait for 40 us
  • Read the pin, it must be low at this point
  • wait for 80 us
  • Read the pin, this time it should be HIGH

If the above conditions are satisfied, that means the sensor is present, and we can proceed with reading the data.


DATA Transmission

DHT11 Data transmission
DHT11 Data transmission

Now DHT11 will send 40 bits of data.  Each bit’s transmission begins with low-voltage-level that last 50 us, the following high-voltage-level signal’s length decides whether the bit is “1” or “0”.

  • If the length of high-voltage-level is around 26-28 us, the bit is “0”
  • And if the length is around 70 us, than the bit is “1”

The 40 bits sent by DHT11 are as follows :

DATA = 8 bit integral RH data + 8 bit decimal RH data + 8 bit integral T data+8 bit decimal T data + 8 bit checksum

If the data transmission is right, check-sum should be the last 8 bit of “8 bit integral RH data+8 bit decimal RH data+8 bit integral T data+8 bit decimal T data”

Following are the steps to READ DATA from the sensor

  1. Wait for the pin to go high
  2. Wait for 40us. This is because the length of “0” bit is 26-28us, and if the pin is high after 40us, it indicates that the bit is “1”
  3. write the respective values to the variable



Connection

DHT11 connection

NOTE:- You might need to connect pull-up resistor to the data line or else DHT11 will not be able to pull the line HIGH.



Some Insight into the CODE

INITIALIZATION

  1. Set the pin (data) as output
  2. Pull the pin low and wait for 18ms
  3. set the pin as input for receiving the data
void DHT11_Start (void)
{
	Set_Pin_Output (DHT11_PORT, DHT11_PIN);  // set the pin as output
	HAL_GPIO_WritePin (DHT11_PORT, DHT11_PIN, 0);   // pull the pin low
	delay (18000);   // wait for 18ms
	Set_Pin_Input(DHT11_PORT, DHT11_PIN);    // set as input
}

RESPONSE

  1. wait for 40 us
  2. check if the pin is low, than wait for 80 us. This will totally be a delay of 120 us and the pin should be high now
  3. Check if the pin is high. If it is, than the response is OK
uint8_t Check_Response (void)
{
	uint8_t Response = 0;
	delay (40);
	if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)))
	{
		delay (80);
		if ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN))) Response = 1;
		else Response = -1;
	}
	while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)));   // wait for the pin to go low

	return Response;
}

READ DATA

  1. Wait for the pin to go high
  2. Wait for 40 us. This is because the length of “0” bit is 26-28 us  and if the pin is high after 40 us, it indicates that the bit is “1”
  3. write the respective values to the variable
uint8_t DHT11_Read (void)
{
	uint8_t i,j;
	for (j=0;j<8;j++)
	{
		while (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)));   // wait for the pin to go high
		delay (40);   // wait for 40 us
		if (!(HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)))   // if the pin is low
		{
			i&= ~(1<<(7-j));   // write 0
		}
		else i|= (1<<(7-j));  // if the pin is high, write 1
		while ((HAL_GPIO_ReadPin (DHT11_PORT, DHT11_PIN)));  // wait for the pin to go low
	}
	return i;
}


Result

DHT11 Working
DHT11 Working

Check out the Video Below






Info

You can help with the development by DONATING OR Just click DOWNLOAD to download the code

Subscribe
Notify of
guest

57 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We don't have any banner, Flash, animation, obnoxious sound, or popup ad. We do not implement these annoying types of ads!

We need money to operate the site, and almost all of it comes from our online advertising.

Please add controllerstech.com to your ad blocking whitelist or disable your adblocking software.

×