STM32HAL库驱动DHT11和BH1750

这篇具有很好参考价值的文章主要介绍了STM32HAL库驱动DHT11和BH1750。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

硬件配置

  • stm32f103c8t6
  • DHT11(温湿度传感器)
  • BH1750(光照度传感器)
  • OLED
  • micro USB数据传输线

软件配置

  • sys->Debug->Serial Wrie
  • RCC->HSE->Crystal/Cerarnic Resonator
  • PC13->GPIO_Out
  • TIM1->Clock Source->Internal Clock

Parameter Settings

STM32HAL库驱动DHT11和BH1750

为后面DHT11的延时us起作用

  • TIM2->Clock Source->Internal Clock

Parameter Settings

STM32HAL库驱动DHT11和BH1750

NVIC Settings->TIM2 global interrupt

  • Enabled

  • 打开I2C1

STM32HAL库驱动DHT11和BH1750

  • USB->Device(FS) USB_DEVICE->Class For FS IP->Communication Device Class (Virtual Port Com)
  • Clock Configuration :48 To USB(MHz)

DHT11代码编写

DHT11是一款温湿度一体化的数字传感器,该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机连接。通过单片机微处理器简单的电路连接就能够实时的采集湿度和温度。DHT11与STM32之间能采用简单的单总线进行通讯,仅需一个IO口。

STM32HAL库驱动DHT11和BH1750

本次IO口使用的是PA8

STM32HAL库驱动DHT11和BH1750

dht11.h

#ifndef __DHT11_H
#define __DHT11_H   
#include "stm32f1xx_hal.h"
 
//IO方向设置
#define DHT11_IO_IN()  {GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=8;}
#define DHT11_IO_OUT() {GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=3;}
IO操作函数
#define    DHT11_DQ_IN   HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8) //数据端口    PA0入方向


uint8_t DHT11_Init(void);//初始化DHT11
uint8_t DHT11_Read_Data(uint8_t *humiH,uint8_t *humiL,uint8_t *tempH,uint8_t *tempL);//读取温湿度
uint8_t DHT11_Read_Byte(void);//读出一个字节
uint8_t DHT11_Read_Bit(void);//读出一个位
uint8_t DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11  
                      
#endif

dht11.c

#include "dht11.h"
#include "tim.h"

//延时函数
//利用TIM1,延时1us
//预分频因子设为72-1,向上计数,自动重载值为65535;因此计数器CNT_CLK = 1MHz,计数器周期为1us
void delay_us(uint16_t us){
    uint16_t differ = 0xffff-us-5;
    __HAL_TIM_SET_COUNTER(&htim1,differ);  //设定TIM7计数器起始值
    HAL_TIM_Base_Start(&htim1);       //启动定时器

    while(differ < 0xffff-5){  //判断
        differ = __HAL_TIM_GET_COUNTER(&htim1);       //查询计数器的计数值
    }
    HAL_TIM_Base_Stop(&htim1);
}

//复位DHT11
void DHT11_Rst(void)      
{                 
      DHT11_IO_OUT();    //SET OUTPUT
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);    //拉低DQ
    HAL_Delay(20);     //拉低至少18ms
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);      //DQ=1 
      delay_us(30);      //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)     
{   
   uint8_t retry=0;
   DHT11_IO_IN();//SET INPUT   
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
   {
      retry++;
      delay_us(1);
   };  
   if(retry>=100)return 1;
   else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
   {
      retry++;
      delay_us(1);
   };
   if(retry>=100)return 1;        
   return 0;
}

//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void)          
{
   uint8_t retry=0;
   while(DHT11_DQ_IN&&retry<100)//等待变为低电平
   {
      retry++;
      delay_us(1);
   }
   retry=0;
   while(!DHT11_DQ_IN&&retry<100)//等待变高电平
   {
      retry++;
      delay_us(1);
   }
   delay_us(40);//等待40us
   if(DHT11_DQ_IN)return 1;
   else return 0;       
}

//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)    
{        
    uint8_t i,dat;
    dat=0;
   for (i=0;i<8;i++) 
   {
          dat<<=1; 
       dat|=DHT11_Read_Bit();
    }                     
    return dat;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败

uint8_t DHT11_Read_Data(uint8_t *humiH,uint8_t *humiL,uint8_t *tempH,uint8_t *tempL)    
{        
   uint8_t buf[5];
   uint8_t i;
   DHT11_Rst();
   if(DHT11_Check()==0)
   {
      for(i=0;i<5;i++)//读取40位数据
      {
         buf[i]=DHT11_Read_Byte();
      }
      if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
      {
         *humiH=buf[0];       
         *humiL=buf[1];       
         *tempH=buf[2];
         *tempL=buf[3];
            
      }
   }else return 1;
   return 0;      
}


//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在        
uint8_t DHT11_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
   HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);                  //PA8 输出高
             
   DHT11_Rst();  //复位DHT11
   return DHT11_Check();//等待DHT11的回应
} 

main.c中的使用

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

/* USER CODE BEGIN PV */
uint8_t humidityH;	  //湿度整数部分
uint8_t humidityL;	  //湿度小数部分
uint8_t temperatureH;   //温度整数部分
uint8_t temperatureL;   //温度小数部分
/* USER CODE END PV */

int main(void)
{
   /* USER CODE BEGIN 2 */
    DHT11_Init();
  /* USER CODE END 2 */
      while (1)
  {
    /* USER CODE BEGIN 3 */
      //将温湿度的整数小数部分分别赋值给4个变量
      DHT11_Read_Data(&humidityH,&humidityL,&temperatureH,&temperatureL)
  }
    /* USER CODE END 3 */
}

BH1750代码编写

BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。

BH1750引出了时钟线和数据线,单片机通过I2C协议可以与BH1750模块通讯。

STM32HAL库驱动DHT11和BH1750STM32HAL库驱动DHT11和BH1750

前面我们配置了I2C1,PB6接SCL,PB7接SDA

STM32HAL库驱动DHT11和BH1750

bh1750.h

#ifndef __BH1750_H
#define __BH1750_H
#include "main.h"


uint16_t Get_BH1750_Value(void);

/*bh1750地址*/
#define    BH1750_ADDR_WRITE  0x46   //01000110
#define    BH1750_ADDR_READ   0x47   //01000111


typedef enum
{
    POWER_OFF_CMD  =  0x00,  //断电:无激活状态
    POWER_ON_CMD   =  0x01,  //通电:等待测量指令
    RESET_REGISTER =  0x07,  //重置数字寄存器(在断电状态下不起作用)
    CONT_H_MODE       =  0x10,  //连续H分辨率模式:在11x分辨率下开始测量,测量时间120ms
    CONT_H_MODE2   =  0x11,  //连续H分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms
    CONT_L_MODE       =  0x13,  //连续L分辨率模式:在411分辨率下开始测量,测量时间16ms
    ONCE_H_MODE       =  0x20,  //一次高分辨率模式:在11x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
    ONCE_H_MODE2   =  0x21,  //一次高分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
    ONCE_L_MODE       =  0x23   //一次低分辨率模式:在411x分辨率下开始测量,测量时间16ms,测量后自动设置为断电模式
} BH1750_MODE;


#endif

bh1750.c

#include "bh1750.h"
#include "i2c.h"


/*i2c句柄*/
#define bh1750_i2c hi2c1

/*内部函数声明区*/
static uint8_t BH1750_Send_Cmd(BH1750_MODE cmd);
static uint8_t BH1750_Read_Dat(uint8_t* dat);
static uint16_t BH1750_Dat_To_Lux(uint8_t* dat);



/**
 * @brief  向BH1750发送一条指令
 * @param  cmd —— BH1750工作模式指令(在BH1750_MODE中枚举定义)
 * @retval 成功返回HAL_OK
*/
static uint8_t BH1750_Send_Cmd(BH1750_MODE cmd)
{
    return HAL_I2C_Master_Transmit(&bh1750_i2c, BH1750_ADDR_WRITE, (uint8_t*)&cmd, 1, 0xFFFF);
}


/**
 * @brief  从BH1750接收一次光强数据
 * @param  dat —— 存储光照强度的地址(两个字节数组)
 * @retval 成功 —— 返回HAL_OK
*/
static uint8_t BH1750_Read_Dat(uint8_t* dat)
{
    return HAL_I2C_Master_Receive(&bh1750_i2c, BH1750_ADDR_READ, dat, 2, 0xFFFF);
}


/**
 * @brief  将BH1750的两个字节数据转换为光照强度值(0-65535)
 * @param  dat  —— 存储光照强度的地址(两个字节数组)
 * @retval 成功 —— 返回光照强度值
*/
static uint16_t BH1750_Dat_To_Lux(uint8_t* dat)
{
    uint16_t lux = 0;
    lux = dat[0];
    lux <<= 8;
    lux |= dat[1];
    lux = (int)(lux / 1.2);

    return lux;
}


/**
 * @brief  返回光照强度值
 * @param  无
 * @retval 成功 —— 返回光照强度值
*/
uint16_t Get_BH1750_Value(void)
{
    uint8_t dat[2] = {0};     //dat[0]是高字节,dat[1]是低字节
    uint16_t lux;

    if(HAL_OK != BH1750_Send_Cmd(ONCE_H_MODE))
    {
        return 0;
    }
    HAL_Delay(120);
    if(HAL_OK != BH1750_Read_Dat(dat))
    {
        return 0;
    }

    lux = BH1750_Dat_To_Lux(dat);
    return lux;
}

main.c中使用

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

/* USER CODE BEGIN PV */
uint16_t Light; //光照度
/* USER CODE END PV */

int main(void)
{
 	
      while (1)
  {
    /* USER CODE BEGIN 3 */
     Light=Get_BH1750_Value(); //获取关照度
  }
    /* USER CODE END 3 */
}

虚拟串口输出和OLED显示

在主函数中我们使用VCP虚拟串口输出

#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "usb_device.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "oled.h"
#include "dht11.h"
#include "bh1750.h"
#include "usbd_cdc_if.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

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

/* USER CODE BEGIN PV */
char oledBuf[20];
uint8_t humidityH;   //湿度整数部分
uint8_t humidityL;   //湿度小数部分
uint8_t temperatureH;   //温度整数部分
uint8_t temperatureL;   //温度小数部分
uint16_t Light;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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();
  MX_USB_DEVICE_Init();
  MX_TIM2_Init();
  MX_TIM1_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
    OLED_Init();
    OLED_ColorTurn(0);//0姝e父鏄剧ず锛?1 鍙嶈壊鏄剧ず
    OLED_DisplayTurn(0);//0姝e父鏄剧ず 1 灞忓箷缈昏浆鏄剧ず
    OLED_Clear();
    DHT11_Init();
    HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      Light=Get_BH1750_Value();
      DHT11_Read_Data(&humidityH,&humidityL,&temperatureH,&temperatureL);
      usb_printf("Light:%d Lx\r\n",Light);
      usb_printf("Hum:%d.%d %%  Temp:%d.%d C\r\n",humidityH,humidityL,temperatureH,temperatureL);
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
      HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

编写TIM2中断回调函数实现oled的显示

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim==&htim2)
    {
        sprintf(oledBuf,"Light:%dLx",Light);
        OLED_ShowString(0,0,(uint8_t*)oledBuf,16);//8*16 “ABC”
        sprintf(oledBuf,"Hum:%d.%d %%",humidityH,humidityL);
        OLED_ShowString(0,16,(uint8_t*)oledBuf,16);//8*16 “ABC”
        sprintf(oledBuf,"Temp:%d.%d C",temperatureH,temperatureL);
        OLED_ShowString(0,32,(uint8_t *)oledBuf,16);//8*16 “ABC”
        OLED_Refresh();
    }
}
/* USER CODE END 4 */

程序资源

STM32HAL库驱动DHT11和BH1750文章来源地址https://www.toymoban.com/news/detail-429919.html

[程序下载](https://download.csdn.net/download/weixin_51002159/86250257?spm=1001.2014.3001.5503)

到了这里,关于STM32HAL库驱动DHT11和BH1750的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32--光照强度传感器(BH1750 、GY302)

    代码链接,附文章下方。 本系列文章,只聊快速应用, 3分钟上手使用速读。需要详尽底层原理的网友,请另行搜索。 目录 1、BH1750  特点、参数 2、接线说明 3、代码速读 4、实验效果 5、代码下载链接 淘宝有两种BH1750模块,一长一短两款,短款更常见,本篇使用下图中短款

    2024年04月14日
    浏览(38)
  • [STM32]HAL库STM32CubeMX+DHT11温湿度传感器

    目录 所用的工具: 知识概括: DHT11介绍: DHT11性能说明: 接口说明  电源引脚 串行接口   工程创建 1、设置RCC 2、时钟设置 3、项目文件设置 4、设置IO口(DATA) 5、TIM时钟配置 6、USART配置   程序编写:          1、TIM3实现微秒(us)级延时函数: 2、IO口配置 3、DHT11检测

    2024年02月09日
    浏览(42)
  • 【STM32(HAL库)--DHT11温湿度传感器】

    stm32控制DHT11温湿度传感器,进行温湿度的读取.以下是自己的一点学习过程和心得,若有不妥之处,还望各位大佬指正,在下感激不尽. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。 它应用专用的数字模块采集技术温湿度传感技术, 确保产品具有极高

    2024年04月15日
    浏览(48)
  • STM32使用温湿度DHT11基于HAL库开发

    DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一 个

    2024年02月03日
    浏览(64)
  • STM32F103ZET6+IIC+BH1750光照强度传感

    为了加深对IIC协议的理解和应用,接下来,使用STM32驱动BH1750光照强度传感器 准备IIC协议 其实IIC协议还是之前的驱动温湿度传感的那个,只是把GPIO引脚口改了一下,同理,之后遇到使用IIC协议驱动的传感器,都可以用这个定义的IIC协议。 1、声明GPIO和IIC初始化 2、IIC数据线的

    2023年04月11日
    浏览(44)
  • 第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

    今天给大家介绍一块嵌入式毕设中也经常用到的一款传感器——BH1750光照传感器,如下图。 (该传感器的购买链接和代码我已放在资料里,想要资料的同学,评论区留下邮箱即可) 相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,

    2024年02月04日
    浏览(48)
  • STM32驱动dht11检测温湿度由OLED12864显示

    本次实验所使用的硬件环境如下: STM32F103C8T6开发板 DHT11温湿度传感器 OLED12864显示屏 杜邦线若干 软件环境 本次实验所使用的软件环境如下: Keil C51编译器 ST-LINK V2下载器 ST-LINK Utility软件 硬件连接 首先,将STM32F103C8T6开发板、DHT11温湿度传感器和OLED12864显示屏分别连接在一起

    2023年04月13日
    浏览(56)
  • 【STM32+HAL库】---- 硬件IIC驱动0.96OLED

    代码借鉴学习于以下文章: STM32 使用硬件IIC驱动0.96寸4针IOLED显示器(HAL库) 略... 点击查看代码 首先在 main.c 中引入头文件 随即根据要求在 main函数 中添加对应功能函数即可 【 注意 】使用时应将编译器编码选项选择为 GBK系列 ,否则编译报错,尤其注意通过keil修改后,再

    2024年02月19日
    浏览(37)
  • Clion开发Stm32之温湿度传感器(DHT11)驱动编写

    涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版) Clion开发stm32之微妙延迟(采用nop指令实现) Clion开发STM32之日志模块(参考RT-Thread) 头文件 源文件

    2024年02月15日
    浏览(43)
  • STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

    在此特别鸣谢原文博主! (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) (1)F1的板子,本例使用经典F103C8T6  (2)DHT11——温湿度传感器 (3)ST-link 下载器 (4)USB-TTL模块 (5)杜邦线若干 (1)芯片选择 STM32F103C8T6  (2)配置RCC、SYS、时钟树 配置RCC 配置SYS 配置时钟树 (3) 配置GPIO  (4)配置

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包