BH1750FVI 是一款 IIC 接口的数字型光强度传感器集成电路。下面介绍一下其在 Windows 10 IoT Core 环境下的用法。
项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码。
1. 准备
包含 BH1750FVI 的传感器,这里选择的是淘宝上最多的 GY-30;Raspberry Pi 2/3 一块,环境为 Windows 10 IoT Core;公母头杜邦线 4-5 根
2. 连线
Raspberry Pi 2/3 的引脚如图

由于采用的是 IIC 通信方式,因此我们需要把 GY-30 上的 SDA 与 Pin3 相连,SCL 与 Pin5 相连。VCC 接 3.3V,GND 接地。ADD 决定了传感器的地址,将其连接至 VCC ≥ 0.7 V 的时候,地址为 0x5C,接地时为 0x23。可以不连接。
SDA - Pin3
SCL - Pin5
VCC - 3.3V
GND - GND

3. 代码
GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/BH1750FVIDemo
需要新建一个 Windows 通用 项目 ,并且添加引用 Windows IoT Extensions for the UWP

在项目中添加一个 C# 代码文件 BH1750FVI.cs,代码如下
<span>using</span><span> System;
</span><span>using</span><span> System.Threading.Tasks;
</span><span>using</span><span> Windows.Devices.I2c;
</span><span>namespace</span><span> BH1750FVIDemo
{
</span><span>///</span><span><summary></span><span>///</span><span> I2C Address Setting
</span><span>///</span><span></summary></span><span>enum</span><span> AddressSetting
{
</span><span>///</span><span><summary></span><span>///</span><span> ADD Pin connect to high power level
</span><span>///</span><span></summary></span>
AddPinHigh = <span>0x5C</span><span>,
</span><span>///</span><span><summary></span><span>///</span><span> ADD Pin connect to low power level
</span><span>///</span><span></summary></span>
AddPinLow = <span>0x23</span><span>
};
</span><span>///</span><span><summary></span><span>///</span><span> The mode of measuring
</span><span>///</span><span></summary></span><span>enum</span><span> MeasurementMode
{
</span><span>///</span><span><summary></span><span>///</span><span> Start measurement at 1 lx resolution
</span><span>///</span><span></summary></span>
ContinuouslyHighResolutionMode = <span>0x10</span><span>,
</span><span>///</span><span><summary></span><span>///</span><span> Start measurement at 0.5 lx resolution
</span><span>///</span><span></summary></span>
ContinuouslyHighResolutionMode2 = <span>0x11</span><span>,
</span><span>///</span><span><summary></span><span>///</span><span> Start measurement at 4 lx resolution
</span><span>///</span><span></summary></span>
ContinuouslyLowResolutionMode = <span>0x13</span><span>,
</span><span>///</span><span><summary></span><span>///</span><span> Start measurement at 1 lx resolution once
</span><span>///</span><span></summary></span>
OneTimeHighResolutionMode = <span>0x20</span><span>,
</span><span>///</span><span><summary></span><span>///</span><span> Start measurement at 0.5 lx resolution once
</span><span>///</span><span></summary></span>
OneTimeHighResolutionMode2 = <span>0x21</span><span>,
</span><span>///</span><span><summary></span><span>///</span><span> Start measurement at 4 lx resolution once
</span><span>///</span><span></summary></span>
OneTimeLowResolutionMode = <span>0x23</span><span>
}
</span><span>///</span><span><summary></span><span>///</span><span> Setting light transmittance
</span><span>///</span><span></summary></span><span>enum</span><span> LightTransmittance
{
Fifty,
Eighty,
Hundred,
Hundred_Twenty,
Hundred_Fifty,
Two_Hundred
}
</span><span>class</span><span> BH1750FVI
{
I2cDevice sensor;
</span><span>private</span><span>byte</span><span> sensorAddress;
</span><span>private</span><span>byte</span><span> sensorMode;
</span><span>private</span><span>byte</span> sensorResolution = <span>1</span><span>;
</span><span>private</span><span>double</span> sensorTransmittance = <span>1</span><span>;
</span><span>private</span><span>byte</span> registerHighVal = <span>0x42</span><span>;
</span><span>private</span><span>byte</span> registerLowVal = <span>0x65</span><span>;
</span><span>///</span><span><summary></span><span>///</span><span> Constructor
</span><span>///</span><span></summary></span><span>///</span><span><param name="address"></span><span>Enumeration type of AddressSetting</span><span></param></span><span>///</span><span><param name="mode"></span><span>Enumeration type of MeasurementMode</span><span></param></span><span>public</span><span> BH1750FVI(AddressSetting address, MeasurementMode mode)
{
sensorAddress </span>= (<span>byte</span><span>)address;
sensorMode </span>= (<span>byte</span><span>)mode;
</span><span>if</span> (mode == MeasurementMode.ContinuouslyHighResolutionMode2 || mode ==<span> MeasurementMode.OneTimeHighResolutionMode2)
{
sensorResolution </span>= <span>2</span><span>;
}
}
</span><span>///</span><span><summary></span><span>///</span><span> Constructor
</span><span>///</span><span></summary></span><span>///</span><span><param name="address"></span><span>Enumeration type of AddressSetting</span><span></param></span><span>///</span><span><param name="mode"></span><span>Enumeration type of MeasurementMode</span><span></param></span><span>///</span><span><param name="transmittance"></span><span>Enumeration type of LightTransmittance</span><span></param></span><span>public</span><span> BH1750FVI(AddressSetting address, MeasurementMode mode, LightTransmittance transmittance)
{
sensorAddress </span>= (<span>byte</span><span>)address;
sensorMode </span>= (<span>byte</span><span>)mode;
</span><span>if</span> (mode == MeasurementMode.ContinuouslyHighResolutionMode2 || mode ==<span> MeasurementMode.OneTimeHighResolutionMode2)
{
sensorResolution </span>= <span>2</span><span>;
}
</span><span>switch</span><span> (transmittance)
{
</span><span>case</span><span> LightTransmittance.Fifty:
{
registerHighVal </span>= <span>0x44</span><span>;
registerLowVal </span>= <span>0x6A</span><span>;
sensorTransmittance </span>= <span>0.5</span><span>;
}
</span><span>break</span><span>;
</span><span>case</span><span> LightTransmittance.Eighty:
{
registerHighVal </span>= <span>0x42</span><span>;
registerLowVal </span>= <span>0x76</span><span>;
sensorTransmittance </span>= <span>0.8</span><span>;
}
</span><span>break</span><span>;
</span><span>case</span><span> LightTransmittance.Hundred:
{
registerHighVal </span>= <span>0x42</span><span>;
registerLowVal </span>= <span>0x65</span><span>;
}
</span><span>break</span><span>;
</span><span>case</span><span> LightTransmittance.Hundred_Twenty:
{
registerHighVal </span>= <span>0x41</span><span>;
registerLowVal </span>= <span>0x7A</span><span>;
sensorTransmittance </span>= <span>1.2</span><span>;
}
</span><span>break</span><span>;
</span><span>case</span><span> LightTransmittance.Hundred_Fifty:
{
registerHighVal </span>= <span>0x41</span><span>;
registerLowVal </span>= <span>0x7E</span><span>;
sensorTransmittance </span>= <span>1.5</span><span>;
}
</span><span>break</span><span>;
</span><span>case</span><span> LightTransmittance.Two_Hundred:
{
registerHighVal </span>= <span>0x41</span><span>;
registerLowVal </span>= <span>0x73</span><span>;
sensorTransmittance </span>= <span>2</span><span>;
}
</span><span>break</span><span>;
}
}
</span><span>///</span><span><summary></span><span>///</span><span> Initialize BH1750FVI
</span><span>///</span><span></summary></span><span>public</span><span>async</span><span> Task InitializeAsync()
{
</span><span>var</span> settings = <span>new</span><span> I2cConnectionSettings(sensorAddress);
settings.BusSpeed </span>=<span> I2cBusSpeed.FastMode;
</span><span>var</span> controller = <span>await</span><span> I2cController.GetDefaultAsync();
sensor </span>=<span> controller.GetDevice(settings);
sensor.Write(</span><span>new</span><span>byte</span>[] { <span>0x01</span><span> });
sensor.Write(</span><span>new</span><span>byte</span><span>[] { registerHighVal });
sensor.Write(</span><span>new</span><span>byte</span><span>[] { registerLowVal });
}
</span><span>///</span><span><summary></span><span>///</span><span> Read data from BH1750FVI
</span><span>///</span><span></summary></span><span>///</span><span><returns></span><span>A double type contains data</span><span></returns></span><span>public</span><span>double</span><span> Read()
{
</span><span>byte</span>[] readBuf = <span>new</span><span>byte</span>[<span>2</span><span>];
sensor.WriteRead(</span><span>new</span><span>byte</span><span>[] { sensorMode }, readBuf);
</span><span>byte</span> temp = readBuf[<span>0</span><span>];
readBuf[</span><span>0</span>] = readBuf[<span>1</span><span>];
readBuf[</span><span>1</span>] =<span> temp;
</span><span>double</span> result = BitConverter.ToUInt16(readBuf, <span>0</span>) / (<span>1.2</span> * sensorResolution *<span> sensorTransmittance);
</span><span>return</span><span> result;
}
</span><span>///</span><span><summary></span><span>///</span><span> Cleanup
</span><span>///</span><span></summary></span><span>public</span><span>void</span><span> Dispose()
{
sensor.Dispose();
}
}
}</span>下面解释如何使用
代码包含三个枚举类型,两个构造函数,三个方法。
第一步调用构造函数将 BH1750FVI 实例化。
第二步调用 InitializeAsync() 初始化 I2C 设备
第三步调用 Read() 读取数据,返回的是一个 double 类型的值
当需要关闭设备时,调用 Dispose()
原文:http://www.cnblogs.com/lonelyxmas/p/7512705.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!