/* USER CODE BEGIN 0 */
void microDelay (uint16_t delay) // Fonction pour créer un délai en microsecondes
{
__HAL_TIM_SET_COUNTER(&htim1, 0); // Réinitialise le compteur du timer
while (__HAL_TIM_GET_COUNTER(&htim1) < delay); // Attend que le compteur atteigne la valeur de délai
}
uint8_t DHT21_Start (void) // Fonction pour démarrer la communication avec le DHT21
{
uint8_t Response = 0; // Variable pour stocker la réponse du capteur
GPIO_InitTypeDef GPIO_InitStructPrivate = {0}; // Structure pour configurer le GPIO
GPIO_InitStructPrivate.Pin = DHT21_PIN; // Définit la broche du DHT21
GPIO_InitStructPrivate.Mode = GPIO_MODE_OUTPUT_PP; // Configure la broche en sortie
GPIO_InitStructPrivate.Speed = GPIO_SPEED_FREQ_LOW; // Vitesse de la broche
GPIO_InitStructPrivate.Pull = GPIO_NOPULL; // Pas de résistance de pull-up/down
HAL_GPIO_Init(DHT21_PORT, &GPIO_InitStructPrivate); // Initialise le GPIO
HAL_GPIO_WritePin (DHT21_PORT, DHT21_PIN, 0); // Met la broche à l'état bas
microDelay (1000); // Attend 1 ms
HAL_GPIO_WritePin (DHT21_PORT, DHT21_PIN, 1); // Met la broche à l'état haut
microDelay (30); // Attend 30 µs
GPIO_InitStructPrivate.Mode = GPIO_MODE_INPUT; // Configure la broche en entrée
GPIO_InitStructPrivate.Pull = GPIO_PULLUP; // Active la résistance de pull-up
HAL_GPIO_Init(DHT21_PORT, &GPIO_InitStructPrivate); // Réinitialise le GPIO
microDelay (40); // Attend 40 µs
if (!(HAL_GPIO_ReadPin (DHT21_PORT, DHT21_PIN))) // Vérifie si la broche est basse
{
microDelay (80); // Attend 80 µs
if ((HAL_GPIO_ReadPin (DHT21_PORT, DHT21_PIN))) Response = 1; // Si la broche est haute, réponse = 1
}
pMillis = HAL_GetTick(); // Stocke le temps actuel
cMillis = HAL_GetTick(); // Stocke le temps actuel
while ((HAL_GPIO_ReadPin (DHT21_PORT, DHT21_PIN)) && pMillis + 2 > cMillis) // Attend que la broche soit basse
{
cMillis = HAL_GetTick(); // Met à jour le temps actuel
}
return Response; // Retourne la réponse du capteur
}
uint8_t DHT21_Read (void) // Fonction pour lire un octet de données du DHT21
{
uint8_t x, y = 0; // Variables pour stocker les bits et l'octet lu
for (x = 0; x < 8; x++) // Boucle pour lire 8 bits
{
pMillis = HAL_GetTick(); // Stocke le temps actuel
cMillis = HAL_GetTick(); // Stocke le temps actuel
while (!(HAL_GPIO_ReadPin (DHT21_PORT, DHT21_PIN)) && pMillis + 2 > cMillis) // Attend que la broche soit haute
{
cMillis = HAL_GetTick(); // Met à jour le temps actuel
}
microDelay (40); // Attend 40 µs
if (!(HAL_GPIO_ReadPin (DHT21_PORT, DHT21_PIN))) // Si la broche est basse
y &= ~(1 << (7 - x)); // Met le bit correspondant à 0
else
y |= (1 << (7 - x)); // Met le bit correspondant à 1
pMillis = HAL_GetTick(); // Stocke le temps actuel
cMillis = HAL_GetTick(); // Stocke le temps actuel
while ((HAL_GPIO_ReadPin (DHT21_PORT, DHT21_PIN)) && pMillis + 2 > cMillis) // Attend que la broche soit basse
{
cMillis = HAL_GetTick(); // Met à jour le temps actuel
}
}
return y; // Retourne l'octet lu
}
/* USER CODE END 0 */