当前位置:首页 > 操作系统 > Windows

张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

原文:张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

  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)!

相关教程推荐

其他课程推荐