[其它] 基于ESP32-S3(N4) IoT 开发板的光照强度检测及显示

[复制链接]
335|0
Lily李 发表于 2025-10-1 10:59 | 显示全部楼层 |阅读模式
BH1750是一款数字式传感器,该传感器采用I2C接口来工作。
BH1750与开发板的连接关系为:
SCLK----GPIO28
SDIN----GPIO29
OLED屏与开发板的连接关系为:
SCLK----GPIO4
SDIN----GPIO5
相应的准备处理为:
#define SCLK_Pin 28
#define SDIN_Pin 29
#define SCL_Set       digitalWrite(SCLK_Pin, HIGH)
#define SCL_Clr       digitalWrite(SCLK_Pin, LOW)
#define SDA_Set       digitalWrite(SDIN_Pin, HIGH)
#define SDA_Clr       digitalWrite(SDIN_Pin, LOW)
#define IIC_SDA_IN      digitalRead(SDIN_Pin)
#define IIC_WRITE      0   
#define IIC_READ       1   
#define SlaveAddress   0x46
unsigned char         BUF[3];
BH1750所用引脚配置的函数为:
  1. void BH1750_Init(void){
  2.     pinMode(SCLK_Pin, OUTPUT);
  3.     pinMode(SDIN_Pin, OUTPUT);
  4. }

输入模式设置的函数为:
  1. void IIC_INPUT_MODE_SET(){
  2.     pinMode(SDIN_Pin, INPUT);
  3. }

输出模式设置的函数为:
  1. void IIC_OUTPUT_MODE_SET(){
  2.     pinMode(SDIN_Pin, OUTPUT);
  3. }

BH1750发送字节数据的函数为:
  1. void BH1750_SendByte(char data){
  2.     char i;
  3.     IIC_OUTPUT_MODE_SET();
  4.     SCL_Clr;
  5.     delayMicroseconds(2);     
  6.     for (i=0;i<8;i++)
  7.     {
  8.          if(data&0x80)
  9.          {
  10.                SDA_Set;
  11.          }
  12.          else
  13.          {
  14.                SDA_Clr;
  15.          }
  16.          data <<= 1;
  17.          SCL_Set;  
  18.          delayMicroseconds(2);   
  19.          SCL_Clr;
  20.          delayMicroseconds(2);   
  21.      }
  22. }

BH1750接收字节数据的函数为:
  1. char BH1750_RecvByte(){
  2.   char i;
  3.   char data = 0;
  4.   IIC_INPUT_MODE_SET();
  5.   for (i=0;i<8;i++)
  6.   {
  7.      SCL_Clr;
  8.      delayMicroseconds(2);  
  9.      SCL_Set;
  10.      data <<= 1;
  11.      SCL_Set;
  12.      if(IIC_SDA_IN)  data|=0x01;            
  13.      delayMicroseconds(2);  
  14.   }
  15.   SCL_Clr;
  16.   return data;
  17. }

实现传感器检测及数值变换的函数为:
  1. void Get_Sunlight_Value(){
  2.   int dis_data=0;
  3.   float temp;
  4.   char i=0;
  5.   unsigned int sd;
  6.   Single_Write_BH1750(0x01);
  7.   Single_Write_BH1750(0x10);
  8.   delay(180);
  9.   Multiple_Read_BH1750();
  10.   for(i=0;i<3;i++)  dis_data=BUF[0];
  11.   dis_data=(dis_data<<8)+BUF[1];
  12.   sd=temp;
  13.   if(sd<54612) OLED_ShowNum(48,1,sd,5,16);
  14. }

进行初始化的程序为:
  1. void setup() {
  2.   pinMode(ledPin, OUTPUT);
  3.   pinMode(SCLKPin, OUTPUT);
  4.   pinMode(SDINPin, OUTPUT);
  5.   OLED_Initd();
  6.   OLED_Clear();
  7.   OLED_ShowString(0,0,14,16);
  8.   BH1750_Init();
  9. }

实现循环检测与显示的程序为:
  1. void loop() {
  2.    digitalWrite(ledPin, HIGH);
  3.    delay(500);
  4.    digitalWrite(ledPin, LOW);
  5.    delay(500);
  6.    Get_Sunlight_Value();
  7. }

经程序上传,其检测结果如下图所示。
2505768dc990cdc6a2.png
检测效果图


您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

14

帖子

0

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