STM32之光照强度BH1750

  • 光照强度BH1750 API
    • BH1750函数使用API
    • IIC函数API
  • 原文件 bh1750.c
  • 头文件 bh1750.h

光照强度BH1750 API

BH1750函数使用API

  • void BH1750_Init(void);
    IIC和BH1750初始化
  • float LIght_Intensity(void);
    读取光照强度的值
  • uint8_t BH1750_Byte_Write(uint8_t data);
    BH1750写一个字节
    返回值 成功:0 失败:非0
  • uint16_t BH1750_Read_Measure(void);
    BH1750读取测量数据
    返回值 成功:返回光照强度 失败:返回0
  • void BH1750_Power_ON(void);
    BH1750s上电
  • void BH1750_Power_OFF(void);
    BH1750s断电
  • void BH1750_RESET(void);
    BH1750复位 仅在上电时有效

IIC函数API

  • static void I2C_BH1750_GPIOConfig(void);
    配置I2C总线的GPIO,采用模拟IO的方式实现
  • void i2c_Start(void);
    CPU发起I2C总线启动信号
  • void i2c_Stop(void);
    CPU发起I2C总线停止信号
  • void i2c_SendByte(uint8_t _ucByte);
    CPU向I2C总线设备发送8bit数据
  • uint8_t i2c_ReadByte(void);
    CPU从I2C总线设备读取8bit数据
  • uint8_t i2c_WaitAck(void);
    CPU产生一个时钟,并读取器件的ACK应答信号
  • void i2c_Ack(void);
    CPU产生一个ACK信号
  • void i2c_NAck(void);
    CPU产生1个NACK信号
  • uint8_t i2c_CheckDevice(uint8_t _Address);
    检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在

原文件 bh1750.c

#include "bh1750.h"/*应用说明:在访问I2C设备前,请先调用 i2c_CheckDevice() 检测I2C设备是否正常,该函数会配置GPIO
*/static void I2C_BH1750_GPIOConfig(void);/*
*********************************************************************************************************
*   函 数 名: i2c_Delay
*   功能说明: I2C总线位延迟,最快400KHz
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{uint8_t i;/* 下面的时间是通过逻辑分析仪测试得到的。工作条件:CPU主频72MHz ,MDK编译环境,1级优化循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us */for (i = 0; i < 10; i++);
}/*
*********************************************************************************************************
*   函 数 名: i2c_Start
*   功能说明: CPU发起I2C总线启动信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */BH1750_I2C_SDA_1();BH1750_I2C_SCL_1();i2c_Delay();BH1750_I2C_SDA_0();i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
*   函 数 名: i2c_Start
*   功能说明: CPU发起I2C总线停止信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */BH1750_I2C_SDA_0();BH1750_I2C_SCL_1();i2c_Delay();BH1750_I2C_SDA_1();
}/*
*********************************************************************************************************
*   函 数 名: i2c_SendByte
*   功能说明: CPU向I2C总线设备发送8bit数据
*   形    参:_ucByte : 等待发送的字节
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++){     if (_ucByte & 0x80){BH1750_I2C_SDA_1();}else{BH1750_I2C_SDA_0();}i2c_Delay();BH1750_I2C_SCL_1();i2c_Delay();    BH1750_I2C_SCL_0();if (i == 7){BH1750_I2C_SDA_1(); // 释放总线}_ucByte <<= 1;  /* 左移一个bit */i2c_Delay();}
}/*
*********************************************************************************************************
*   函 数 名: i2c_ReadByte
*   功能说明: CPU从I2C总线设备读取8bit数据
*   形    参:无
*   返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{uint8_t i;uint8_t value;/* 读到第1个bit为数据的bit7 */value = 0;for (i = 0; i < 8; i++){value <<= 1;BH1750_I2C_SCL_1();i2c_Delay();if (BH1750_I2C_SDA_READ()){value++;}BH1750_I2C_SCL_0();i2c_Delay();}return value;
}/*
*********************************************************************************************************
*   函 数 名: i2c_WaitAck
*   功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
*   形    参:无
*   返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{uint8_t re;BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */i2c_Delay();if (BH1750_I2C_SDA_READ()) /* CPU读取SDA口线状态 */re = 1;elsere = 0;BH1750_I2C_SCL_0();i2c_Delay();return re;
}/*
*********************************************************************************************************
*   函 数 名: i2c_Ack
*   功能说明: CPU产生一个ACK信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{BH1750_I2C_SDA_0();    /* CPU驱动SDA = 0 */i2c_Delay();BH1750_I2C_SCL_1();  /* CPU产生1个时钟 */i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();BH1750_I2C_SDA_1();   /* CPU释放SDA总线 */
}/*
*********************************************************************************************************
*   函 数 名: i2c_NAck
*   功能说明: CPU产生1个NACK信号
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{BH1750_I2C_SDA_1();    /* CPU驱动SDA = 1 */i2c_Delay();BH1750_I2C_SCL_1();  /* CPU产生1个时钟 */i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
*   函 数 名: I2C_BH1750_GPIOConfig
*   功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
*   形    参:无
*   返 回 值: 无
*********************************************************************************************************
*/
static void I2C_BH1750_GPIOConfig(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE);   /* 打开GPIO时钟 */GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    /* 开漏输出 */GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */i2c_Stop();
}/*
*********************************************************************************************************
*   函 数 名: i2c_CheckDevice
*   功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
*   形    参:_Address:设备的I2C总线地址
*   返 回 值: 返回值 0 表示正确, 返回1表示未探测到
*********************************************************************************************************
*/
uint8_t i2c_CheckDevice(uint8_t _Address)
{uint8_t ucAck;i2c_Start();     /* 发送启动信号 *//* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */i2c_SendByte(_Address | BH1750_I2C_WR);ucAck = i2c_WaitAck();   /* 检测设备的ACK应答 */i2c_Stop();         /* 发送停止信号 */return ucAck;
}//BH1750写一个字节
//返回值   成功:0     失败:非0
uint8_t BH1750_Byte_Write(uint8_t data)
{i2c_Start();//发送写地址i2c_SendByte(BH1750_Addr|0);if(i2c_WaitAck()==1)return 1;//发送控制命令i2c_SendByte(data);if(i2c_WaitAck()==1)return 2;i2c_Stop();return 0;
}//BH1750读取测量数据
//返回值 成功:返回光照强度  失败:返回0
uint16_t BH1750_Read_Measure(void)
{uint16_t receive_data=0; i2c_Start();//发送读地址i2c_SendByte(BH1750_Addr|1);if(i2c_WaitAck()==1)return 0;//读取高八位receive_data=i2c_ReadByte();i2c_Ack();//读取低八位receive_data=(receive_data<<8)+i2c_ReadByte();i2c_NAck();i2c_Stop();return receive_data;  //返回读取到的数据
}//BH1750s上电
void BH1750_Power_ON(void)
{BH1750_Byte_Write(POWER_ON);
}//BH1750s断电
void BH1750_Power_OFF(void)
{BH1750_Byte_Write(POWER_OFF);
}//BH1750复位 仅在上电时有效
void BH1750_RESET(void)
{BH1750_Byte_Write(MODULE_RESET);
}//BH1750初始化
void BH1750_Init(void)
{I2C_BH1750_GPIOConfig();       /* 配置GPIO */BH1750_Power_ON();  //BH1750s上电//BH1750_RESET();            //BH1750复位BH1750_Byte_Write(Measure_Mode);//SysTick_Delay_ms(120);
}//获取光照强度
float LIght_Intensity(void)
{return (float)(BH1750_Read_Measure()/1.1f*Resolurtion);
}

头文件 bh1750.h

#ifndef __BH1750_H
#define __BH1750_H
#include "sys.h"//BH1750的地址
#define BH1750_Addr             0x46//BH1750指令码
#define POWER_OFF                   0x00
#define POWER_ON                    0x01
#define MODULE_RESET            0x07
#define CONTINUE_H_MODE     0x10
#define CONTINUE_H_MODE2    0x11
#define CONTINUE_L_MODE     0x13
#define ONE_TIME_H_MODE     0x20
#define ONE_TIME_H_MODE2    0x21
#define ONE_TIME_L_MODE     0x23//测量模式
#define Measure_Mode            CONTINUE_H_MODE//分辨率    光照强度(单位lx)=(High Byte  + Low Byte)/ 1.2 * 测量精度
#if ((Measure_Mode==CONTINUE_H_MODE2)|(Measure_Mode==ONE_TIME_H_MODE2))#define Resolurtion      0.5
#elif ((Measure_Mode==CONTINUE_H_MODE)|(Measure_Mode==ONE_TIME_H_MODE))#define Resolurtion      1
#elif ((Measure_Mode==CONTINUE_L_MODE)|(Measure_Mode==ONE_TIME_L_MODE))#define Resolurtion      4
#endif#define BH1750_I2C_WR 0       /* 写控制bit */
#define BH1750_I2C_RD   1       /* 读控制bit *//* 定义I2C总线连接的GPIO端口, 只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define BH1750_GPIO_PORT_I2C    GPIOB           /* GPIO端口 */
#define BH1750_RCC_I2C_PORT     RCC_APB2Periph_GPIOB        /* GPIO端口时钟 */
#define BH1750_I2C_SCL_PIN      GPIO_Pin_10         /* 连接到SCL时钟线的GPIO */
#define BH1750_I2C_SDA_PIN      GPIO_Pin_11
/* 连接到SDA数据线的GPIO *//* 定义读写SCL和SDA的宏,已增加代码的可移植性和可阅读性 */
#if 0   /* 条件编译: 1 选择GPIO的库函数实现IO读写 */#define BH1750_I2C_SCL_1()  GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN)     /* SCL = 1 */#define BH1750_I2C_SCL_0()  GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN)      /* SCL = 0 */#define BH1750_I2C_SDA_1()  GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)        /* SDA = 1 */#define BH1750_I2C_SDA_0()  GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)      /* SDA = 0 */#define BH1750_I2C_SDA_READ()  GPIO_ReadInputDataBit(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN)    /* 读SDA口线状态 */
#else   /* 这个分支选择直接寄存器操作实现IO读写 *//* 注意:如下写法,在IAR最高级别优化时,会被编译器错误优化 */#define BH1750_I2C_SCL_1()  BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SCL_PIN                /* SCL = 1 */#define BH1750_I2C_SCL_0()  BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SCL_PIN                /* SCL = 0 */#define BH1750_I2C_SDA_1()  BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SDA_PIN               /* SDA = 1 */#define BH1750_I2C_SDA_0()  BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SDA_PIN                /* SDA = 0 */#define BH1750_I2C_SDA_READ()  ((BH1750_GPIO_PORT_I2C->IDR & BH1750_I2C_SDA_PIN) != 0)    /* 读SDA口线状态 */
#endifvoid i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);void BH1750_Init(void);           //未包含IIC初始化
float LIght_Intensity(void);    //读取光照强度的值
uint8_t BH1750_Byte_Write(uint8_t data);
uint16_t BH1750_Read_Measure(void);
void BH1750_Power_ON(void);
void BH1750_Power_OFF(void);
void BH1750_RESET(void);#endif

STM32之光照强度(BH1750)相关推荐

  1. STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)

    目录 元器件类型选择 接线表设计 实现过程 标准库实现 HAL库实现 代码下载 元器件类型选择 单片机选择:STM32F103 光照度模块:维特智能出品的 BH1750 模块被企业封装过,将采集的光照 ...

  2. 小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇)

    小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇) 文章目录 前言 一.Keil5+FLYMCU(软件烧录) 二.DHT11温湿度模块驱动代码 三.BH1750光照强度驱动代码 四. ...

  3. STM32采集光照强度显示波形

    STM32采集光照强度显示波形 硬件配置   单片机型号:STM32F103C8   屏幕:0.96寸OLED屏   传感器:光照传感器(ADC采集) 功能实现   光照强度采集ADC方式采集,STM ...

  4. STM32 HAL库BH1750光强检测器驱动代码

    #ifndef __LIGHT_H #define __LIGHT_H#include "system.h" #include "delay.h"//IO方向设 ...

  5. 视频教程-ARDUINO零基础入门教程【代码编程篇】-Arduino

    ARDUINO零基础入门教程[代码编程篇] 精通各种单片机编程,有十年以上ARDUINO,51单片机/STM32/PIC/AVR编程,硬件设计,绘图,编程经验.熟悉各种常用传感器使用和物联网通讯 赵勇 ...

  6. STM32+BH1750光敏传感器获取光照强度

    一.环境介绍 MCU:  STM32F103ZET6 光敏传感器: BH1750数字传感器(IIC接口) 开发软件: Keil5 代码说明:使用IIC模拟时序驱动,方便移植到其他平台,采集的光照度比较 ...

  7. bh1750采集流程图_重大更新:STM32空气监测仪,OneNET物联网平台实时查看(原理图、PCB源文件、程序源码等)...

    更新内容: 一.SD卡记录功能. 自动识别有无SD卡,支持4G以下SD卡. 下图为SD卡记录的数据.以日期为文件名自动创建文件. 记录格式为:时间,PM1.0,PM2.5,PM10,温度,湿度,大气压 ...

  8. BH1750的一些使用心得(STM32,内置工程)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.BH1750是什么? 二.如何使用BH1750 2.1 BH1750的通信方式 2.2 BH1750的指令集 2.3 ...

  9. 【STM32-库函数】光照强度传感器BH1750 GY-30

    下载地址:BH1750光照强度库文件下载 BH1750光照强度传感器(GY-30) 谢谢观看,有问题需要请教的,请加入STM32学习交流群(QQ群号:470804974),本人QQ号297427819 ...

最新文章

  1. 高斯混合模型理解汇总
  2. C++中的对象_纪要(二)
  3. 毕业后年薪40万的专业成热门!125个岗位抢100个求职者
  4. Haproxy + Pacemaker 实现高可用负载均衡(一)
  5. C++ 面试知识总结
  6. Javascript设计模式理论与实战:适配器模式
  7. 实战SQL Server 2005镜像配置全过程
  8. html没有插件怎么办,html网页包插件没有插入options.title
  9. oracle排序函数性能,oracle排序函数
  10. Spring Boot笔记-目前对Web后端开发的认识
  11. 画春天的景色计算机教案,大班绘画春天来了教案
  12. python 打包exe 运行dll load failed_Python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。...
  13. windows远程桌面无法粘贴复制的问题解决方法
  14. idea中编辑*.vue文件没有任何提示
  15. 最新出炉!java私塾下载
  16. 从零开发一款Android RTMP播放器
  17. 下行物理信道rs_LTE下行物理信道与物理信号
  18. 百度算法大全:更新至2121年
  19. CESIUM例子学习(十一)——3DTiles Clipping Planes(1)
  20. 利用Python制作微信跳一跳外挂,微信好友装逼神器!

热门文章

  1. VMware VCP-DCV认证课程概述
  2. 南方雨季来袭,物联网助力水位监测防止洪涝灾害
  3. k-means用于图像的颜色聚类
  4. bilibili缓存文件在哪里_简单使用Pyinstaller将Python文件打包为可执行性exe
  5. 2022年ABC123公众号年刊下载(PDF电子书)
  6. 15.PG分区表-内置分区表
  7. JVM--GC相关记录
  8. HGAME2020第一周杂项题——克苏鲁神话
  9. 在线24点计算器工具
  10. 【DB笔试面试733】在Oracle中,RAC中REMOTE_LISTENER的作用是什么?