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数字光强度传感器模块
GY30模块基于BH1750FVI芯片,模块采用IIC通讯方式,引脚分为:VCC +5V,GND, SDA ,SCL,addr。光照度范围:0 ~ 65535 lx , 內置16bit AD转换器 , 可以直接数字输出,不区分环境光源。
注:I²C,这是正确的写法,但也有简写成IIC或I2C
GY30模块测试代码
引脚连接信息,见下表:
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; }
代码上传后,可通过串口监视器查看输出结果。