( zigbee)CC2530+BH1750光敏传感器获取光照强度

简介: ( zigbee)CC2530+BH1750光敏传感器获取光照强度

一、环境介绍

MCU: CC2530(Zigbee)


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


开发软件: IAR


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


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


完整工程源码下载地址:  https://download.csdn.net/download/xiaolong1126626497/18502155


二、BH1750介绍

image.png

image.png

ADDR引脚接地地址就是0X46。

三、硬件接线效果

image.png

image.png

image.png

四、核心代码

4.1  iic.c

#include "iic.h"
/*
函数功能:IIC接口初始化
硬件连接:
SDA:P1.2
SCL:P1.3
*/
void IIC_Init(void)
{
    P1SEL&=~(0x3<<2); //配置通用GPIO口模式
    P1DIR|=0x3<<2;    //配置为输出模式
}
/*
函数功能: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;
}

4.2 iic.h

#ifndef _IIC_H
#define _IIC_H
#include "sys.h"
#include "delay.h"
/*
硬件连接:
SDA:P1.2
SCL:P1.3
*/
#define IIC_SDA_OUTMODE() {P1DIR|=0x1<<2;}
#define IIC_SDA_INPUTMODE() {P1DIR&=~(0x1<<2);}
#define IIC_SDA_OUT P1_2  //数据线输出
#define IIC_SDA_IN P1_2  //数据线输入
#define IIC_SCL P1_3  //时钟线
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

4.3 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)USART0_Printf("error:1\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
     if(r_s)USART0_Printf("error:2\r\n");
    IIC_Stop(); //停止信号 
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)USART0_Printf("error:3\r\n");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//获取应答
    if(r_s)USART0_Printf("error:4\r\n");
    IIC_Stop(); //停止信号 
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//获取应答
    if(r_s)USART0_Printf("error:5\r\n");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//获取应答
    if(r_s)USART0_Printf("error:6\r\n");
    IIC_Stop(); //停止信号 
    DelayMs(300); //等待
    IIC_Start(); //发送起始信号
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//获取应答
    if(r_s)USART0_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;  
}

4.4 bh1750.h

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


目录
相关文章
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
527 0
基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP
|
传感器 网络协议 物联网
基于CC2530(ZigBee)设计的自动照明系统
基于ZigBee的自动照明系统设计,上面连接了光感传感器,ESP8266WIFI模块。通过ESP8266与手机APP之间通信,ESP8266创建热点,配置为TCP服务器模式; 手机APP连接上ESP8266的热点之后,再连接ESP8266创建的服务器,完成通信。 手机APP上通过按钮可以控制B,C开发板上LED灯的开关。
534 0
|
传感器 物联网 Linux
基于CC2530(ZigBee设计)的温度报警器
这是基于CC2530设计的远程温度报警器,通过CC2530终端检测环境温度上传给手机APP实时显示。 一共有两块CC2530开发板,这里就分别称为A板(当做协调器)、B板(当做温度节点),A板上接了ESP8266 WIF模块,用于与手机APP之间通信。B板上接了DS18B20 温度传感器模块,用于给A板传递检测的温度,A板收到DS18B20的温度之后,发送给手机APP显示。APP上位机采用Qt框架设计,支持跨平台,Android、windows、IOS、Linux都可以编译运行安装。
820 0
|
物联网
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
ZigBee(CC2530)最小系统PCB设计(AD18开发软件
ZigBee(CC2530)最小系统PCB设计(AD18开发软件)
|
物联网 移动开发
ZigBee TI ZStack CC2530 4.14 广播通信
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 前面两节中,我们详细介绍了ZigBee的第一种无线通信方式——单播;本节中,我们将介绍ZigBee的第二种无线通信方式——广播。
1193 0
|
物联网 移动开发
ZigBee TI ZStack CC2530 4.15 组播通信
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 上一节中,我们详细介绍了ZigBee的第二种无线通信方式——广播;本节中,我们将介绍ZigBee的第三种无线通信方式——组播。
1256 0
|
物联网 移动开发
ZigBee TI ZStack CC2530 4.12 单播通信01-16位地址模式
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 上一节中我们讲述了如何对ZigBee网络进行基本的网络参数设置,以及无线自组网。自组网完成后,ZigBee网络就算是形成了。
1502 0
|
物联网 网络架构 移动开发
ZigBee TI ZStack CC2530 4.13 单播通信02-64位地址模式
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 上一节中我们详细讲述了单播通信的第一种方式——16位地址模式。本节中,我们将讲述单播通信的第二种方式——64位地址模式。
1452 0
|
物联网 网络架构
ZigBee TI ZStack CC2530 4.2 基本网络参数设置
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一、基本的网络参数配置(参考《Z-Stack Sample Applications.pdf》) 1、Device Types(设备类型) 在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器)、Router(路由器)和EndDevice(终端设备)。
2673 0
|
物联网
ZigBee TI ZStack CC2530 3.16 按键驱动03-移植及使用
(配套源码、软件、开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 上一节中,我们详细讲述了Z-Stack中按键检测的两种机制——“轮询模式”和“中断模式”。从实现原理来看,“中断模式”比“轮询模式”更加灵敏;更重要的是,在低功耗模式下,“中断模式”功耗更低!因此,在实际应用中,我们更多的是选用“中断模式”来进行按键检测。
1832 0