/* 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; }