[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】光照强度检测与显示

[复制链接]
12947|6
 楼主| jinglixixi 发表于 2022-7-16 09:14 | 显示全部楼层 |阅读模式
BH1750是一种数字式光照强度传感器,其特点是采用I2C接口工作,故占用的引脚少。此外,由于是数字式传感器故无需对检测值进行标定。
尽管以前曾在其它开发板上进行过测试,但在PIC18F57Q43上还是首次。
为进行检测和显示,其引脚配置如图1所示,相应的引脚命名如图2所示。
1  引脚配置
2  引脚命名
其中,BH1750所连接的引脚如下:
CLK---RC0
DIN ---RC1
OLED屏所连接的引脚为:
SCL ---RB1
SDA ---RB2
为此,对BH1750所做的语句定义为:
#define SCL_Clr()    CLK_SetLow()
#define SCL_Set()    CLK_SetHigh()
#define SDA_Clr()    DIN_SetLow()
#define SDA_Set()    DIN_SetHigh()
unsigned char    BUF[8];
#define IIC_WRITE    0
#define IIC_READ     1
#define SlaveAddress   0x46
#define IIC_SDA_IN  DIN_GetValue()
OLED屏的驱动不同,OLED屏只是使用输出模式,而BH1750的数据引脚既使用输出模式也使用输入模式。
为便于引脚工作模式的切换,使用配置了2个函数来进行切换,其内容如下:
  1. void IIC_INPUT_MODE_SET()
  2. {
  3.   DIN_SetDigitalInput();
  4. }

  1. void IIC_OUTPUT_MODE_SET()
  2. {
  3.   DIN_SetDigitalOutput();
  4. }

BH1750的初始化函数为:
  1. void BH1750_Init(void)
  2. {
  3.     DIN_SetDigitalOutput();
  4. }

GPIO口模拟I2C方式字节数据的函数为:
  1. void BH1750_SendByte(char data)
  2. {
  3.     char i;
  4.     IIC_OUTPUT_MODE_SET();
  5.     SCL_Clr();
  6.     Delay_Us(2);
  7.     for (i=0;i<8;i++)
  8.     {
  9.         if(data&0x80) SDA_Set();
  10.         else SDA_Clr();
  11.         data <<= 1;
  12.         SCL_Set();
  13.         Delay_Us(2);
  14.         SCL_Clr();
  15.         Delay_Us(2);
  16.     }
  17. }

获取光照强度值的函数为:
  1. void Get_Sunlight_Value()
  2. {
  3.     int dis_data=0;
  4.     float temp;
  5.     char  i=0;
  6.     unsigned int sd;
  7.     Single_Write_BH1750(0x01);
  8.     Single_Write_BH1750(0x10);
  9.     __delay_ms(180);
  10.     Multiple_Read_BH1750();
  11.     dis_data=BUF[0];
  12.     dis_data=(dis_data<<8)+BUF[1];
  13.     temp=(float)dis_data/1.2;
  14.     sd=temp;
  15. OLED_ShowNum(0,6,sd,5,16);
  16. }

实现图3所示检测效果的主程序为:
  1. int main(void)
  2. {
  3.     SYSTEM_Initialize();
  4.     KEY_SetDigitalOutput();
  5.     KEY_SetHigh();
  6.     LED_SetHigh();
  7.     BH1750_Init();
  8.     OLED_Init();
  9.     OLED_Clear();
  10.     OLED_ShowString(0,0,"PIC18F57Q43 TEST",16);
  11.     OLED_ShowString(0,2,"OLED & BH1750",16);
  12.     OLED_ShowString(0,4,"Sunlight=",16);
  13.     OLED_ShowString(48,6,"lx",16);
  14.     while(1)
  15.     {
  16.         Get_Sunlight_Value();
  17.         LED0_Toggle();
  18.         __delay_ms(500);
  19.     }
  20. }

3 检测效果
需指出的是:无不影响程序的下载,这里是以RA4RA5输出高电平来为OLED屏和BH1750通过电源支持。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
wziyi 发表于 2022-7-16 20:45 | 显示全部楼层
 楼主| jinglixixi 发表于 2022-7-17 07:54 | 显示全部楼层

感谢支持!!!
王小双 发表于 2022-8-30 16:51 | 显示全部楼层
 楼主| jinglixixi 发表于 2022-8-31 09:28 | 显示全部楼层
benjaminka 发表于 2022-9-3 17:26 | 显示全部楼层
BH1750是需要校验吗   
 楼主| jinglixixi 发表于 2022-9-3 20:43 | 显示全部楼层
benjaminka 发表于 2022-9-3 17:26
BH1750是需要校验吗

是数字化传感器,无需校验。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部