STM32读取BH1750光照强度数据打印到串口

发布者:Meiren520最新更新时间:2024-06-03 来源: elecfans关键字:STM32  串口 手机看文章 扫描二维码
随时随地手机看文章

【1】BH1750是什么?

BH1750是一种数字式环境光强度传感器(Digital Light Sensor),也称为其他名称,例如GY-302传感器、BH1750FVI传感器等。它的工作原理是通过收集光线照射到传感器上的量来测量环境亮度。


使用I2C(Inter-Integrated Circuit)接口,BH1750可以轻松地接入到各种嵌入式系统中,并提供实时的环境光强度数据。其度量范围是1-65535 lux,测量精度可以达到每个范围16位,使其成为许多应用中的理想选择。例如,自动照明控制、日光灯节能控制、智能家居、汽车照明系统和摄影中的曝光控制等等。



BH1750还有一些其他优点。例如,其本身具有非常低的功率消耗(例如小于1μA),这意味着它可以轻松地集成在嵌入式系统中,并且非常适用于电池供电的系统。并且它是一种数字式光强度传感器,相比于模拟式光强度传感器,它的抗干扰性能更好,并且可以一次完成多种测量,例如高分辨率的光强测量、低光强测量等。


【2】什么是IIC协议?

IIC(Inter-Integrated Circuit)协议也称为I2C协议,是一种串行通信协议,由Philips公司(现在的NXP公司)于1980年代初期开发。它是一种双向、两线式的串行通信协议,通常被用于板间通信以及嵌入式系统中的设备之间的通信。


IIC协议由两根线构成:数据线(SDA)和时钟线(SCL)。SDA线负责传输数据,而SCL线则负责传输时钟信号。在IIC总线上,多个设备可以连接到同一根时钟线和数据线上,通过设置每个设备的唯一地址来进行通信。IIC协议支持多主机和多从机的通信,也支持多种通信速率(通常为100kHz或400kHz)。


IIC协议是一种简单易用的通信协议,因此被广泛应用于各种嵌入式系统和电子设备中,例如SMBus、PMbus、I2C EEPROM、I2C LCD、I2C ADC、I2C DAC、I2C RTC等等。


【2】STM32读取BH1750数据

下面是使用标准库函数STM32F103C8T6读取BH1750光照强度数据并打印到串口的代码:


#include 'main.h'

#include 'stm32f1xx_hal.h'

#include 'stdio.h'

#define BH1750_ADDRESS 0x23 //BH1750地址

I2C_HandleTypeDef hi2c1; //IIC外设句柄

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_USART1_UART_Init(void);

static void MX_I2C1_Init(void);

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_USART1_UART_Init();

 MX_I2C1_Init();

 uint8_t buf[2];

 uint16_t value = 0;

 //初始化BH1750

 buf[0] = 0x01; //使用高分辨率模式

 HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDRESS << 1, buf, 1, 100);

   HAL_Delay(100);

 

   while (1)

   {

     //读取光照强度数据

     buf[0] = 0x00; //高8位

     HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDRESS << 1, buf, 1, 100);

     HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDRESS << 1, buf, 2, 100);

 

     value = (buf[0] << 8) | buf[1];

     value = value/1.2; //单位转换,参考BH1750手册

     printf('Light intensity: %d luxn', value);

     

     HAL_Delay(1000);

   }

 }

 

 void SystemClock_Config(void) 

 {

     RCC_OscInitTypeDef RCC_OscInitStruct = {0};

     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

     RCC_OscInitStruct.HSIState = RCC_HSI_ON;

     RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

     if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 

     {

         Error_Handler();

     }

     RCC_ClkInitStruct.ClockType = RCC

     static void MX_GPIO_Init(void) 

     {

         GPIO_InitTypeDef GPIO_InitStruct = {0};

         __HAL_RCC_GPIOA_CLK_ENABLE();

         /*Configure GPIO pin Output Level */

         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);

         /*Configure GPIO pin : PA1 */

         GPIO_InitStruct.Pin = GPIO_PIN_1;

         GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

     }

     static void MX_I2C1_Init(void) 

     {

         hi2c1.Instance = I2C1;

         hi2c1.Init.ClockSpeed = 100000;

         hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;

         hi2c1.Init.OwnAddress1 = 0;

         hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

         hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

         hi2c1.Init.OwnAddress2 = 0;

         hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

         hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

         if (HAL_I2C_Init(&hi2c1) != HAL_OK) 

         {

             Error_Handler();

         }

     }

     void MX_USART1_UART_Init(void) 

     {

         huart1.Instance = USART1;

         huart1.Init.BaudRate = 115200;

         huart1.Init.WordLength = UART_WORDLENGTH_8B;

         huart1.Init.StopBits = UART_STOPBITS_1;

         huart1.Init.Parity = UART_PARITY_NONE;

         huart1.Init.Mode = UART_MODE_TX_RX;

         huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

         huart1.Init.OverSampling = UART_OVERSAMPLING_16;

         if (HAL_UART_Init(&huart1) != HAL_OK) 

         {

             Error_Handler();

         }

     }

     void Error_Handler(void) 

     {

         __disable_irq();

         while (1) 

         {

         }

     }

在代码中,使用HAL库函数初始化了I2C接口和USART串口,同时使用了STM32提供的延时库函数HAL_Delay()。在主函数中,首先定义了一个缓冲区buf[2]和一个变量value,缓冲区buf[2]用于存储从BH1750读取的光照强度数据。变量value用于存储经过单位转换后的光照强度值。


接着,使用HAL_I2C_Master_Transmit()函数向BH1750传输一个命令,以初始化BH1750。在这里,将BH1750设置为使用高分辨率模式,以获得更高的测量精度。紧接着,使用HAL_Delay()函数延时100毫秒,以确保BH1750设备初始化成功。


然后,在while循环中,使用HAL_I2C_Master_Transmit()和HAL_I2C_Master_Receive()函数从BH1750读取光照强度数据。读取的光照强度值存储在缓冲区buf[2]中,并进行了单位转换,最后通过printf()函数打印到串口。


在此示例中,使用了printf()函数将光照强度值打印到串口,因此需要在调试器中打开串口窗口才能看到打印的数据。


为了使代码正常工作,应在stm32f1xx_hal_conf.h头文件中将USE_HAL_DRIVER宏定义设置为1。


关键字:STM32  串口 引用地址:STM32读取BH1750光照强度数据打印到串口

上一篇:STM32读取MQ2烟雾浓度数据判断烟雾是否超标
下一篇:STM32入门学习笔记之MPU6050传感器解析实验3

推荐阅读最新更新时间:2024-11-12 18:54

STM32-(24):PWM基础
PWM是Pulse Width Modulation的缩写,即脉冲宽度调制。其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制,用来对一个具体模拟信号的电平进行编码。等效的实现是基于采样定理中的一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量即指窄脉冲的面积。这里所说的效果基本相同,是指该环节的输出响应波形基本相同。 如把各输出波形用傅里叶变换分析,则它们的低频段特性非常接近,仅在高频段略有差异。 为了实现a的效果,可以通过b这种正弦波去模拟达到这种效果。(通过每一段的面积相同
[单片机]
STM32-(24):PWM基础
STM32使用内部晶振记录
在不使用外部晶振的时候,引脚悬空。也可按照网上方法,接地或者重映射。 使用内部晶振软件配置方法。内部晶振名称为HSI, 外部晶振名称为HSE. 1. 进入SystemInit 2. 在system_stm32f10x.c中,把//#define SYSCLK_FREQ_72MHz 72000000一句注释掉 3.此时不再做任何设置,运行频率为8M。可在仿真时查看 如需更高频率,需要倍频操作,推荐使用寄存器方式操作,操作寄存器为 RCC_CFGR. 设置倍频系数:PLLMUL位时需先关闭 PLL使能,再设置。 在void SystemInit (void)中具体程序如: 修改完频率之后,delay_ms
[单片机]
<font color='red'>STM32</font>使用内部晶振记录
STM32使用FreeRTOS中的链表创建节点与列表项
使用了STM32F103的FreeRTOS库来创建一个列表,其实FreeRTOS的list中链表是双向的循环链表,为了简单介绍,我直接说是列表了。 芯片使用的是GD32F103CBT6,该芯片兼容ST的库,不影响使用效果。 以下代码不全,仅提供思路,如有不足,请给我留言。 第一步 先定义变量,初始化列表及列表项 nodeDevice node_t; //节点数据 nodeDevice * pNode; //节点指针 xList list_t; //列表 #define pList ((xList *) &list_t) //列表指针 xListItem item_t; //列表项 xListItem * p
[单片机]
利用Proteus仿真STM32实现DHT11温湿度检测
1. 前言 Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一 键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软 件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、 PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系 列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译 器。 前面文章介绍了Proteus的下载,安装,建立工程,完成LED灯仿真运行。这篇文章在这基础上增加串口
[单片机]
利用Proteus仿真<font color='red'>STM32</font>实现DHT11温湿度检测
如何快速成为点灯大师?
学习嵌入式,最经典的第一个实验就是点亮一颗 LED 灯。别小看这个实验,从我辅导的学员来看,不少初学者连这么简单的案例都做不出来。 想要成这一名优秀的点灯大师,第一步就是要学会 STM32 最基础的外设——GPIO。 1. 什么是GPIO? 1.1 定义 GPIO是通用输入输出(general-purpose input/output)端口的简称,简单来说就是STM32可控制的引脚STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。 这是比较正式的说法,是不是听得一愣一愣的? 再简单一点,就是芯片里拉出一堆引脚,这些引脚在我们的控制下可以输出高电平/低电平,或者可以通过这些引脚向芯片
[单片机]
如何快速成为点灯大师?
STM32基于固件库学习笔记(11)RTC实时时钟
实时时钟(RTC) 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。 大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。 互联型产品是指STM32F105xx和STM32F107xx微控制器。 主要特性 ● 可编程的预分频系数:分频系数最高为20 。 ● 32位的可编程计数器,可用于较长时间段的测量。 ● 2个分离的时钟:用于APB1接口的PC
[单片机]
STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用。 但是在我们的HAL库中,对硬件IIC做了全新的优化,使得之前软件IIC几百行代码,在HAL库中,只需要寥寥几行就可以完成 那么这篇文章将带你去感受下它的优异之处 这可能是目前关于STM32CubeMX的硬件iic 讲的最全面和详细的一篇文章之一了 所用工具: 1、芯片: STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5、II
[单片机]
【<font color='red'>STM32</font>】HAL库 STM32CubeMX教程十二---IIC(<font color='red'>读取</font>AT24C02 )
stm32的RTC
两个分离的时钟:用于APB1接口的PCLK1和RTC时钟的(RTC时钟的频率必须小于PCLK1时钟频率的四分之一); RTC的时钟源的配置可以使用函数库中的函数进行配置; RTC的中断也是使用函数库中的额函数进行配置的; void RTC_Configuration(void) {//RTC的时钟为两个分离的时钟:用于APB1的PCLK1和RTC时钟(RTC的时钟的频率必须小于PCLK1时钟频率的四分之一以上 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE); //PWR和BKP时钟使能 PWR_BackupAccessCmd(ENAB
[单片机]
<font color='red'>stm32</font>的RTC
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved