129 lines
2.9 KiB
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;
|
|
}
|