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

简介: STM32+BH1750光敏传感器获取光照强度

一、环境介绍

MCU:  STM32F103ZET6


光敏传感器: BH1750数字传感器(IIC接口)


开发软件: Keil5


代码说明:使用IIC模拟时序驱动,方便移植到其他平台,采集的光照度比较灵敏.  合成的光照度返回值范围是 0~255。 0表示全黑  255表示很亮。


实测:   手机闪光灯照着的状态返回值是245左右,手捂着的状态返回值是10左右.


完整工程代码下载: https://download.csdn.net/download/xiaolong1126626497/18500653

image.png

image.png

二、BH1750介绍

image.png

image.png

image.png

三、核心代码

BH1750说明:  ADDR引脚接地,地址就是0x46

3.1 iic.c

#include "iic.h"
/*
函数功能:IIC接口初始化
硬件连接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
  RCC->APB2ENR|=1<<3;//PB
  GPIOB->CRL&=0x00FFFFFF;
  GPIOB->CRL|=0x33000000;
  GPIOB->ODR|=0x3<<6;
}
/*
函数功能:IIC总线起始信号
*/
void IIC_Start(void)
{
    IIC_SDA_OUTMODE(); //初始化SDA为输出模式
    IIC_SDA_OUT=1;     //数据线拉高
    IIC_SCL=1;         //时钟线拉高
    DelayUs(4);        //电平保持时间
    IIC_SDA_OUT=0;     //数据线拉低
    DelayUs(4);        //电平保持时间
    IIC_SCL=0;         //时钟线拉低
}
/*
函数功能:IIC总线停止信号
*/
void IIC_Stop(void)
{
    IIC_SDA_OUTMODE(); //初始化SDA为输出模式
    IIC_SDA_OUT=0;     //数据线拉低
    IIC_SCL=0;         //时钟线拉低
    DelayUs(4);        //电平保持时间
    IIC_SCL=1;         //时钟线拉高
    DelayUs(4);        //电平保持时间
    IIC_SDA_OUT=1;     //数据线拉高
}
/*
函数功能:获取应答信号
返 回 值:1表示失败,0表示成功
*/
u8 IIC_GetACK(void)
{
    u8 cnt=0;
    IIC_SDA_INPUTMODE();//初始化SDA为输入模式
    IIC_SDA_OUT=1;      //数据线上拉
    DelayUs(2);         //电平保持时间
    IIC_SCL=0;          //时钟线拉低,告诉从机,主机需要数据
    DelayUs(2);         //电平保持时间,等待从机发送数据
    IIC_SCL=1;          //时钟线拉高,告诉从机,主机现在开始读取数据
    while(IIC_SDA_IN)   //等待从机应答信号
    {
        cnt++;
        if(cnt>250)return 1;
    }
    IIC_SCL=0;          //时钟线拉低,告诉从机,主机需要数据
    return 0;
}
/*
函数功能:主机向从机发送应答信号
函数形参:0表示应答,1表示非应答
*/
void IIC_SendACK(u8 stat)
{
    IIC_SDA_OUTMODE(); //初始化SDA为输出模式
    IIC_SCL=0;         //时钟线拉低,告诉从机,主机需要发送数据
    if(stat)IIC_SDA_OUT=1; //数据线拉高,发送非应答信号
    else IIC_SDA_OUT=0;    //数据线拉低,发送应答信号
    DelayUs(2);            //电平保持时间,等待时钟线稳定
    IIC_SCL=1;             //时钟线拉高,告诉从机,主机数据发送完毕
    DelayUs(2);            //电平保持时间,等待从机接收数据
    IIC_SCL=0;             //时钟线拉低,告诉从机,主机需要数据
}
/*
函数功能:IIC发送1个字节数据
函数形参:将要发送的数据
*/
void IIC_WriteOneByteData(u8 data)
{
    u8 i;
    IIC_SDA_OUTMODE(); //初始化SDA为输出模式
    IIC_SCL=0;         //时钟线拉低,告诉从机,主机需要发送数据
    for(i=0;i<8;i++)
    {
        if(data&0x80)IIC_SDA_OUT=1; //数据线拉高,发送1
        else IIC_SDA_OUT=0;    //数据线拉低,发送0
        IIC_SCL=1;             //时钟线拉高,告诉从机,主机数据发送完毕
        DelayUs(2);            //电平保持时间,等待从机接收数据
        IIC_SCL=0;             //时钟线拉低,告诉从机,主机需要发送数据
        DelayUs(2);            //电平保持时间,等待时钟线稳定
        data<<=1;              //先发高位
    }
}
/*
函数功能:IIC接收1个字节数据
返 回 值:收到的数据
*/
u8 IIC_ReadOneByteData(void)
{
    u8 i,data;
    IIC_SDA_INPUTMODE();//初始化SDA为输入模式
    for(i=0;i<8;i++)
    {
        IIC_SCL=0;          //时钟线拉低,告诉从机,主机需要数据
        DelayUs(2);         //电平保持时间,等待从机发送数据
        IIC_SCL=1;          //时钟线拉高,告诉从机,主机现在正在读取数据
        data<<=1;           
        if(IIC_SDA_IN)data|=0x01;
        DelayUs(2);         //电平保持时间,等待时钟线稳定
    }
    IIC_SCL=0;              //时钟线拉低,告诉从机,主机需要数据 (必须拉低,否则将会识别为停止信号)
    return data;
}

3.2 iic.h

1.#ifndef _IIC_H
#define _IIC_H
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#define IIC_SDA_OUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x30000000;}
#define IIC_SDA_INPUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_SDA_OUT PBout(7)  //数据线输出
#define IIC_SDA_IN PBin(7)  //数据线输入
#define IIC_SCL PBout(6)  //时钟线
void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 IIC_GetACK(void);
void IIC_SendACK(u8 stat);
void IIC_WriteOneByteData(u8 data);
u8 IIC_ReadOneByteData(void);
#endif

3.3 BH1750.h

#ifndef _BH1750_H
#define _BH1750_H
#include "delay.h"
#include "iic.h"
#include "usart.h"
u8 Read_BH1750_Data(void);
#endif

3.4 BH1750.c

#include "bh1750.h"
u8 Read_BH1750_Data()
{
    unsigned char t0;
    unsigned char t1;
    unsigned char t;
    u8 r_s=0;
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:1\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
     if(r_s)printf("error:2\r\n");
    IIC_Stop(); //停止信号 
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:3\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:4\r\n");
    IIC_Stop(); //停止信号 
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:5\r\n");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:6\r\n");
    IIC_Stop(); //停止信号 
    DelayMs(300); //等待
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//获取应答
    if(r_s)printf("error:7\r\n");
    t0=IIC_ReadOneByteData(); //接收数据
    IIC_SendACK(0); //发送应答信号
    t1=IIC_ReadOneByteData(); //接收数据
    IIC_SendACK(1); //发送非应答信号
    IIC_Stop(); //停止信号
     t=(((t0<<8)|t1)/1.2);
     return t;  
}

3.5 main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "at24c02.h"
#include "bh1750.h"
int main()
{
  u8 val;
  LED_Init();
  BEEP_Init();
  KeyInit();
  USARTx_Init(USART1,72,115200);
  IIC_Init();
  while(1)
  {
    val=KeyScan();
    if(val)
    {
            val=Read_BH1750_Data();
            printf("光照强度=%d\r\n",val);
//       BEEP=!BEEP;
       LED0=!LED0;
       LED1=!LED1;
    }
  }
}

 3.6  运行效果图

image.png


目录
相关文章
|
8月前
|
传感器 物联网 芯片
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
160 0
|
8月前
|
传感器
【STM32】I2C练习,SHT3X温度传感器的数据读取
【STM32】I2C练习,SHT3X温度传感器的数据读取
122 0
|
6月前
|
传感器 数据安全/隐私保护 数据格式
STM32CubeMX DHT11温湿度传感器
STM32CubeMX DHT11温湿度传感器
428 11
|
6月前
|
传感器 编解码 IDE
STM32CubeMX ADC采集光照和电压
STM32CubeMX ADC采集光照和电压
331 3
|
存储 传感器 编解码
STM32外设系列—BH1750
本文详细介绍了BH1750的特点,原理图,IIC通信协议。给出了BH1750程序设计,能够实时获取周围环境光照强度。最后,给出了两种拓展应用,并说明了实现思路。
1387 0
STM32外设系列—BH1750
|
8月前
|
传感器 数据采集 物联网
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计2
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
842 0
|
7月前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码
|
8月前
|
传感器 数据采集 物联网
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计1
基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
613 0
|
7月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
522 2
|
6月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
911 0