Skocz do zawartości

[C] STM32F411E podłączenie DHT11


coolwilk

Pomocna odpowiedź

Witam, chciałbym zbierać informacje z modułu DHT11 podpiętego do STM.

MODE pin z dht podpinam pod USART w trybie Single Wire (Half-Duplex) z racji tego, że pin usart musi zarowno odbierac jak i wysylac informacje.

I teraz rodzi się moje pytanie odnośnie kodu gdyż jestem dość zielony w tym temacie.

Czy powinno to wyglądać podobnie do tego? Czyli ustawienie komunikacji w taki sposób?

void DHT11Read(u8 *Rh,u8 *RhDec,u8 *Temp,u8 *TempDec, u8 *ChkSum){

		u8 temp;
		u8 j;
		u8 i;
		u8 Value[5]={0x00,0x00,0x00,0x00,0x00};

		DHT11initGPIOasOutput();
		GPIO_ResetBits(GPIOD,GPIO_Pin_1);
		DHT11_delay_us(18000);
		GPIO_SetBits(GPIOD,GPIO_Pin_1);
		DHT11_delay_us(40);
		DHT11initGPIOasInput();

		//80us lik presence										//
		while(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)){}		//52us 0 level
																//dht11 response and start to send signal 0-1
		while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)){}			//80us 1 level
																//


		for (j = 0; j < 5; ++j) {
			for (i = 0; i < 8; ++i) {

				while(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)){} 
				TIM_SetCounter(TIM2,0);//Sayıcıyı Sıfırla
				while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)){}

					temp=TIM_GetCounter(TIM2);

				if (temp<30) {
					Value[j]=Value[j]<<1;
					}
				else {
					Value[j]=Value[j]<<1;
					Value[j] =Value[j]+1;
					}
			}
		}
   		*Rh=Value[0];
   		*RhDec=Value[1];
   		*Temp=Value[2];
   		*TempDec=Value[3];
   		*ChkSum=Value[4];
}

Czyli nie korzystam z gotowego modelu komunikacji tylko sam go tworzę?

Tak wygląda model komunikacji na DHT11:

Czy jednak jest sposób komunikacji, z którego mógłbym skorzystać? Szukałem informacji na ten temat i nie mogłem znaleźć

Używam biblioteki HAL.

Link do komentarza
Share on other sites

Przerobiłem minimalnie ten przykład z wyżej tak, żeby pasował i nei wiem co jest grane. Wartości, które są wyrzucane na samym końcu są do niczego

/**
 ******************************************************************************
 * File Name          : main.c
 * Description        : Main program body
 ******************************************************************************
 ** This notice applies to any and all portions of this file
 * that are not between comment pairs USER CODE BEGIN and
 * USER CODE END. Other portions of this file, whether 
 * inserted by the user or by software development tools
 * are owned by their respective copyright owners.
 *
 * COPYRIGHT(c) 2018 STMicroelectronics
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *   2. Redistributions in binary form must reproduce the above copyright notice,
 *      this list of conditions and the following disclaimer in the documentation
 *      and/or other materials provided with the distribution.
 *   3. Neither the name of STMicroelectronics nor the names of its contributors
 *      may be used to endorse or promote products derived from this software
 *      without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 ******************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"

/* USER CODE BEGIN Includes */
#include "dwt_stm32_delay.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t Rh,RhDec,Temp,TempDec,ChkSum;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

GPIO_InitTypeDef GPIO_InitStruct;


void TermometrPinOut(void)
{
__HAL_RCC_GPIOE_CLK_ENABLE();

GPIO_InitStruct.Pin = DHT11_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);
}

void TermometrPinIn(void)
{
__HAL_RCC_GPIOE_CLK_ENABLE();

GPIO_InitStruct.Pin = DHT11_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);
}

void DHT11Read (uint16_t *Rh, uint16_t *RhDec, uint16_t *Temp, uint16_t *TempDec, uint16_t *ChkSum)
{
uint16_t temp;
uint8_t i,j;
uint16_t Wartosc[5]={0x00, 0x00, 0x00, 0x00, 0x00};

TermometrPinOut();
HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,GPIO_PIN_RESET);
DWT_Delay_us(18000);
HAL_GPIO_WritePin(DHT11_GPIO_Port,DHT11_Pin,GPIO_PIN_SET);
DWT_Delay_us(40);
TermometrPinIn();

while(!HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin));

while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin));

for (j = 0; j<5; j++){
	for (i = 0; i<5; i++){
		while(!HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin));
		DWT->CYCCNT = 0;
		while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin));
		temp=(DWT -> CYCCNT)/100;

		if (temp<30){
			Wartosc[j]=Wartosc[j]<<1;
		}
		else {
			Wartosc[j]=Wartosc[j]<<1;
			Wartosc[j]=Wartosc[j]+1;
		}

	}
}
*Rh = Wartosc[0];
*RhDec = Wartosc[1];
*Temp=Wartosc[2];
*TempDec=Wartosc[3];
*ChkSum=Wartosc[4];

}

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration----------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();

 /* USER CODE BEGIN 2 */
 DWT_Delay_Init();
 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 DHT11Read(&Rh,&RhDec,&Temp,&TempDec,&ChkSum);
 HAL_Delay(1000);

 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */

 }
 /* USER CODE END 3 */

}

Ma ktos moze jakis pomysł?

Link do komentarza
Share on other sites

Udało mi się pokonać przeciwności i moduł działa. Okazało się, że błąd był w pętlach zajmującymi się odbiorem danych:

for (j = 0; j<5; j++){
       for (i = 0; i<5; i++){
           while(!HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin));
           DWT->CYCCNT = 0;
           while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin));
           temp=(DWT -> CYCCNT)/100;

           if (temp<30){
               Wartosc[j]=Wartosc[j]<<1;
           }
           else {
               Wartosc[j]=Wartosc[j]<<1;
               Wartosc[j]=Wartosc[j]+1;
           }

       }

Z racji, że odbieramy 5x8 bitów to już widać błąd: i<5 - powinno być i<8 xd

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.