Arduino的光强度检测

  • 内容
  • 评论
  • 相关

Arduino的使用场景中,光强度检测是一种很常用的功能,如检测家中的光亮度,根据光亮度控制灯的开启和关闭等。检测光的强度可以通过光敏电阻或者GY-30等芯片来实现。

光敏电阻

光敏电阻的构造

光敏电阻的构造

 

光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,光敏电阻对光线十分敏感。光敏电阻分别由光敏层、玻璃基片或树枝防潮膜和电极等组成,在使用中通常用LDR表示光敏电阻。光敏电阻是利用光电导效应的一种特殊的电阻,简称光电阻,又名光导管。它的电阻和光线的强弱有直接关系。光强度增加,则电阻减小;光强度减小,则电阻增大。

光敏电阻的工作原理

光敏电阻
光敏电阻的工作原理是基于光电效应,即在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻。当有光线照射时,电阻内原本处于稳定状态的电子受到激发,成为自由电子。所以光线越强,产生的自由电子也就越多,电阻就会越小。

暗电阻:当电阻在完全没有光线照射的状态下(室温),称这时的电阻值为暗电阻(当电阻值稳定不变时,例如1kM欧姆),与暗电阻相对应的电流为暗电流。

亮电阻:当电阻在充足光线照射的状态下(室温),称这时的电阻值为亮电阻(当电阻值稳定不变时,例如1欧姆),与亮电阻相对应的电流为亮电流。

光电流 = 亮电流 – 暗电流

光敏电阻实验

上图的简单实验中,在电池两端串入光敏电阻和电流表,可以通过光照强度的变化,观察电流的变化,更直观的了解光敏电阻的工作原理。

(BH1750)GY-30数字光强传感器

常用的光感应元件是光敏电阻,但光敏电阻的感应范围比较窄,响应速度不快,在us到ms之间,延迟时间受入射光的光照度影响,受温度影响较大。要接收强光时,就需要BH1750这类的芯片,最亮可接收到60000以上Lx的强光。

勒克斯Lux,通常简写为lx)是一个标识照度的国际单位制单位,1 流明每平方米,就是1勒克斯。其单位换算是1勒克斯 = 1 流明/平方米 = 1 坎德拉·球面度/平方米(1 lx = 1 lm/m2= 1 cd·sr·m–2)。

GY30数字光强度传感器模块

GY-30光强度检测模块
GY30模块基于BH1750FVI芯片,模块采用IIC通讯方式,引脚分为:VCC +5V,GND, SDA ,SCL,addr。光照度范围:0 ~ 65535 lx , 內置16bit AD转换器 , 可以直接数字输出,不区分环境光源。

注:I²C,这是正确的写法,但也有简写成IIC或I2C

GY30模块测试代码

Arduino连接GY-30

引脚连接信息,见下表:

Arduino
(Nano, Uno, Pro Mini)
Arduino
(Mega, Mega 2560)
GY-30
BH1750FVI 电路板
5V oder 3.3V (VCC) 5V oder 3.3V (VCC) VCC
GND GND GND
A4 (SDA) D20 (SDA) SDA
A5 (SCL) D21 (SCL) SCL

测试代码:

//先引入函数库
/*
*库文件地址:https://github.com/claws/BH1750
*/

#include 
 
int BH1750_address = 0x23; // i2c Addresse
byte buff[2];
 
void setup(){
  
  Wire.begin();
  BH1750_Init(BH1750_address);  
  delay(200);
  Serial.begin(9600);
  Serial.println("Start......");
}
 
void loop(){  
  float valf=0; 
  if(BH1750_Read(BH1750_address)==2){    
    valf=((buff[0]<<8)|buff[1])/1.2;    
    if(valf<0)Serial.print("> 65535");
    else Serial.print((int)valf,DEC);     
    Serial.println(" lx");   }
  delay(1000);
} 
void BH1750_Init(int address){  
  Wire.beginTransmission(address);
  Wire.write(0x10); // 1 [lux] aufloesung
  Wire.endTransmission();
} 
byte BH1750_Read(int address){  
  byte i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available()){
    buff[i] = Wire.read(); 
    i++;
  }
  Wire.endTransmission();  
  return i;
}

代码上传后,可通过串口监视器查看输出结果。