文章出處

  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,代碼如下

using System;
using System.Threading.Tasks;
using Windows.Devices.I2c;

namespace BH1750FVIDemo
{
    /// <summary>
    /// I2C Address Setting
    /// </summary>
    enum AddressSetting
    {
        /// <summary>
        /// ADD Pin connect to high power level
        /// </summary>
        AddPinHigh = 0x5C,
        /// <summary>
        /// ADD Pin connect to low power level 
        /// </summary>     
        AddPinLow = 0x23            
    };

    /// <summary>
    /// The mode of measuring
    /// </summary>
    enum MeasurementMode
    {
        /// <summary>
        /// Start measurement at 1 lx resolution
        /// </summary>
        ContinuouslyHighResolutionMode = 0x10,
        /// <summary>
        /// Start measurement at 0.5 lx resolution
        /// </summary>
        ContinuouslyHighResolutionMode2 = 0x11,
        /// <summary>
        /// Start measurement at 4 lx resolution
        /// </summary>
        ContinuouslyLowResolutionMode = 0x13,
        /// <summary>
        /// Start measurement at 1 lx resolution once
        /// </summary>
        OneTimeHighResolutionMode = 0x20,
        /// <summary>
        /// Start measurement at 0.5 lx resolution once
        /// </summary>
        OneTimeHighResolutionMode2 = 0x21,
        /// <summary>
        /// Start measurement at 4 lx resolution once
        /// </summary>
        OneTimeLowResolutionMode = 0x23
    }

    /// <summary>
    /// Setting light transmittance
    /// </summary>
    enum LightTransmittance
    {
        Fifty,
        Eighty,
        Hundred,
        Hundred_Twenty,
        Hundred_Fifty,
        Two_Hundred
    }

    class BH1750FVI
    {
        I2cDevice sensor;
        private byte sensorAddress;                             
        private byte sensorMode;
        private byte sensorResolution = 1;
        private double sensorTransmittance = 1;

        private byte registerHighVal = 0x42;
        private byte registerLowVal = 0x65;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="address">Enumeration type of AddressSetting</param>
        /// <param name="mode">Enumeration type of MeasurementMode</param>
        public BH1750FVI(AddressSetting address, MeasurementMode mode)
        {
            sensorAddress = (byte)address;
            sensorMode = (byte)mode;

            if (mode == MeasurementMode.ContinuouslyHighResolutionMode2 || mode == MeasurementMode.OneTimeHighResolutionMode2)
            {
                sensorResolution = 2;
            }
        }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="address">Enumeration type of AddressSetting</param>
        /// <param name="mode">Enumeration type of MeasurementMode</param>
        /// <param name="transmittance">Enumeration type of LightTransmittance</param>
        public BH1750FVI(AddressSetting address, MeasurementMode mode, LightTransmittance transmittance)
        {
            sensorAddress = (byte)address;
            sensorMode = (byte)mode;

            if (mode == MeasurementMode.ContinuouslyHighResolutionMode2 || mode == MeasurementMode.OneTimeHighResolutionMode2)
            {
                sensorResolution = 2;
            }

            switch (transmittance)
            {
                case LightTransmittance.Fifty:
                    {
                        registerHighVal = 0x44;
                        registerLowVal = 0x6A;
                        sensorTransmittance = 0.5;
                    }
                    break;
                case LightTransmittance.Eighty:
                    {
                        registerHighVal = 0x42;
                        registerLowVal = 0x76;
                        sensorTransmittance = 0.8;
                    }
                    break;
                case LightTransmittance.Hundred:
                    {
                        registerHighVal = 0x42;
                        registerLowVal = 0x65;
                    }
                    break;
                case LightTransmittance.Hundred_Twenty:
                    {
                        registerHighVal = 0x41;
                        registerLowVal = 0x7A;
                        sensorTransmittance = 1.2;
                    }
                    break;
                case LightTransmittance.Hundred_Fifty:
                    {
                        registerHighVal = 0x41;
                        registerLowVal = 0x7E;
                        sensorTransmittance = 1.5;
                    }
                    break;
                case LightTransmittance.Two_Hundred:
                    {
                        registerHighVal = 0x41;
                        registerLowVal = 0x73;
                        sensorTransmittance = 2;
                    }
                    break;
            }
        }

        /// <summary>
        /// Initialize BH1750FVI
        /// </summary>
        public async Task InitializeAsync()
        {
            var settings = new I2cConnectionSettings(sensorAddress);
            settings.BusSpeed = I2cBusSpeed.FastMode;                     

            var controller = await I2cController.GetDefaultAsync();
            sensor = controller.GetDevice(settings);

            sensor.Write(new byte[] { 0x01 });
            sensor.Write(new byte[] { registerHighVal });
            sensor.Write(new byte[] { registerLowVal });
        }

        /// <summary>
        /// Read data from BH1750FVI
        /// </summary>
        /// <returns>A double type contains data</returns>
        public double Read()
        {
            byte[] readBuf = new byte[2];

            sensor.WriteRead(new byte[] { sensorMode }, readBuf);

            byte temp = readBuf[0];
            readBuf[0] = readBuf[1];
            readBuf[1] = temp;

            double result = BitConverter.ToUInt16(readBuf, 0) / (1.2 * sensorResolution * sensorTransmittance);

            return result;
        }

        /// <summary>
        /// Cleanup
        /// </summary>
        public void Dispose()
        {
            sensor.Dispose();
        }
    }
}

  下面解釋如何使用

  代碼包含三個枚舉類型,兩個構造函數,三個方法。

  第一步調用構造函數將 BH1750FVI 實例化。

  第二步調用 InitializeAsync() 初始化 I2C 設備

  第三步調用 Read() 讀取數據,返回的是一個 double 類型的值

  當需要關閉設備時,調用 Dispose() 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()