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
- 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:-
- Set the pin (data) as output
- Pull the pin low for 18ms
- 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
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
- Wait for the pin to go high
- 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”
- write the respective values to the variable
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
- Set the pin (data) as output
- Pull the pin low and wait for 18ms
- 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
- wait for 40 us
- 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
- 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
- Wait for the pin to go high
- 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”
- 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;
}