1
0
Fork 0
stm32/Src/dht22.c

129 lines
2.9 KiB
C

/*
DHT 22 humidity and temperature sensor library
Copyright (C) 2013 Fabio Angeletti - fabio.angeletti89@gmail.com
See attached license.txt file
*/
/* includes --------------------------------------------------------- */
#include "dht22.h"
/* functions -------------------------------------------------------- */
/*
configure DHT22_DATA as input
*/
void DHT22pinIn(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = DHT22_DATA_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(DHT22_GPIO, &GPIO_InitStructure);
}
/*
configure DHT22_DATA as output
*/
void DHT22pinOut(void){
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = DHT22_DATA_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
HAL_GPIO_Init(DHT22_GPIO, &GPIO_InitStructure);
}
void DHT22_Init(void){
//__HAL_RCC_GPIOE_CLK_ENABLE();
DHT22pinOut();
/* hold DHT22 in standby state */
HAL_GPIO_WritePin(DHT22_GPIO, DHT22_DATA_PIN, GPIO_PIN_SET);
}
void DHT22_Read(TIM_HandleTypeDef timer){
uint8_t dataIndex = 0;
uint8_t counter = 7;
uint8_t currByte = 0;
uint8_t index = 0;
uint32_t startTime = 0;
/* reset data holder */
for(index=0; index < 6; index++){
DHT22data[index] = 0x00;
}
/* mcu sends start signal to sensor */
DHT22pinOut();
HAL_GPIO_WritePin(DHT22_GPIO, DHT22_DATA_PIN, GPIO_PIN_RESET);
__HAL_TIM_SET_COUNTER(&timer, 0);
/* wait for at least 20 mSecs */
while(__HAL_TIM_GET_COUNTER(&timer) < 20000);
/* switch to input and wait for sensor response */
DHT22pinIn();
while(HAL_GPIO_ReadPin(DHT22_GPIO, DHT22_DATA_PIN));
/* DHT22 sends response signal */
while(!HAL_GPIO_ReadPin(DHT22_GPIO, DHT22_DATA_PIN));
while(HAL_GPIO_ReadPin(DHT22_GPIO, DHT22_DATA_PIN));
/* DHT22 sends, finally, data */
for (dataIndex=0; dataIndex<40; dataIndex++) {
__HAL_TIM_SET_COUNTER(&timer, 0);
while(!HAL_GPIO_ReadPin(DHT22_GPIO, DHT22_DATA_PIN));
startTime = __HAL_TIM_GET_COUNTER(&timer);
while(HAL_GPIO_ReadPin(DHT22_GPIO, DHT22_DATA_PIN));
if ((__HAL_TIM_GET_COUNTER(&timer) - startTime) > 40){
DHT22data[currByte] |= (1 << counter);
}
if (counter == 0) { // next byte?
counter = 7; // restart at MSB
currByte++; // next byte!
} else {
counter--;
}
}
}
float DHT22getTemperature(void){
float retVal;
retVal = DHT22data[2] & 0x7F;
retVal *= 256;
retVal += DHT22data[3];
retVal /= 10;
if (DHT22data[2] & 0x80)
retVal *= -1;
return retVal;
}
float DHT22getHumidity(void){
float retVal;
retVal = DHT22data[0];
retVal *= 256;
retVal += DHT22data[1];
retVal /= 10;
return retVal;
}
float convertCtoF(float cTemperature){
return cTemperature * 9 / 5 + 32;
}