'Small Devices/Netduino'에 해당되는 글 14건

  1. 2012.07.28 [Netduino] .NET Micro Framework 에서의 I2C 이용 - 두개 이상의 디바이스
반응형

이전 포스팅에서는 기압 센서인 BMP85(http://alnova2.tistory.com/676) 와 조도 센서인 BH1570FVI (http://alnova2.tistory.com/672)  를 Netduino의 I2C에 연결하여 데이터를 가져오는 실험을 하였다. 이번 포스팅에서는 BMP85와 BH1570FVI를 둘다 동시에 이용하는 실험을 해보겠다.


상식적으로 생각해 볼때 두개의 I2C Device이므로 I2CDevice Object를 각각에 맞게 두개 생성하면 될 것으로 생각하기 쉬우나 .NET Micro Framework에서는 하나의 I2CDevice Instance만 허용한다. 따라서 하나의 I2C Device를 이용하여 각각의 Device와 입/출력을 해야 되는 것이다. 따라서 main 프로그램 상에서 I2CDevice Instance를 생성하게 하고 BMP85 와 BH1570FVI 클래스에서는 각각의 디바이스 이용 전에 I2CDevice를 설정하는 함수를 부르도록 하면 된다. 앞 포스팅에서의 BMP85클래스는 다음과 같이 변경된다.

namespace LuxAndBarometer

{

    public class BMP085

    {

        ............앞부분은 동일함...............

        public BMP085(I2CDevice sharedBus, ushort address, int kHz)

        {

            _i2cconfig = new I2CDevice.Configuration(address, kHz);

            _i2cdevice = sharedBus;

            _i2cdevice.Config = _i2cconfig;

            this.bmp085Calibration();

        }

        public void allocate(I2CDevice sharedBus)

        {

            _i2cdevice = sharedBus;

            _i2cdevice.Config=this._i2cconfig;

        }

         ............뒷부분도 동일함...............

    }

}


BH1570FVI 클래스는 다음과 같이 정의한다.

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace LuxAndBarometer
{
    public class BH1570FVI
    {
        private I2CDevice.Configuration _i2cconfig;
        private I2CDevice _i2cdevice;
        public BH1570FVI(I2CDevice sharedBus, ushort address, int kHz)
        {
            _i2cconfig = new I2CDevice.Configuration(address, kHz);
            _i2cdevice = sharedBus;
            _i2cdevice.Config = _i2cconfig;
        }
        public void allocate(I2CDevice sharedBus)
        {
            _i2cdevice = sharedBus;
            _i2cdevice.Config = this._i2cconfig;
        }
        public float getLux()
        {
            byte[] powerOn = new byte[] { 0x01 };
            I2CDevice.I2CWriteTransaction powerOnTransation = 
                                     I2CDevice.CreateWriteTransaction(powerOn);
            byte[] readHResolution = new byte[] { 0x21 };
            I2CDevice.I2CWriteTransaction readHResolutionTrx = 
                                     I2CDevice.CreateWriteTransaction(readHResolution);
            byte[] readData = new byte[2];
            I2CDevice.I2CReadTransaction readDataTrx = I2CDevice.CreateReadTransaction(readData);
            I2CDevice.I2CTransaction[] transactions = new I2CDevice.I2CTransaction[]{
                    powerOnTransation,
                    readHResolutionTrx,
                };
            int transferred = _i2cdevice.Execute(transactions, 1000);
            Thread.Sleep(200);
            I2CDevice.I2CTransaction[] transactions2 = new I2CDevice.I2CTransaction[] { readDataTrx };
            int transferred2 = _i2cdevice.Execute(transactions2, 1000);
            float lux = readData[0] * 256 + readData[1];
            return lux;
        }
    }


이를 이용해서 온도, 기압, 조도를 측정하는 Main 함수는 다음과 같다.


using System;

using System.Net;

using System.Net.Sockets;

using System.Threading;

using Microsoft.SPOT;

using Microsoft.SPOT.Hardware;

using SecretLabs.NETMF.Hardware;

using SecretLabs.NETMF.Hardware.NetduinoPlus;


namespace LuxAndBarometer

{

    public class Program

    {

        public static void Main()

        {

            // write your code here

            I2CDevice sharedBus = new I2CDevice(null);   //1)

            BMP085 bmp85=new BMP085(sharedBus,0x77,100); //2)

            BH1570FVI bh1570fvi = new BH1570FVI(sharedBus, 0x23, 100); //2)

            long temperature;

            long pressure;

            double altitude;

            double epressure;

            double weatherDiff;

            float lux;

            while (true)

            {

                Debug.Print("Use BMP85..");

                bmp85.allocate(sharedBus); //3)

                temperature = bmp85.bmp085GetTemperature();

                pressure = bmp85.bmp085GetPressure();

                altitude = bmp85.bmp85GetAltitude();

                epressure = bmp85.bmp85ExpectedPressure(93.922);

                Debug.Print("Temperature:" + temperature.ToString() + " Pressure:" + 

                                    pressure.ToString()+" Altitude:"+altitude.ToString()+" m");

                weatherDiff = pressure - epressure;

                if (weatherDiff > 250) Debug.Print("Sunny!");

                else if (weatherDiff<=250 || weatherDiff>=-250) Debug.Print("Partly Cloudy");

                else if (weatherDiff>-250) Debug.Print("Rain");

                Thread.Sleep(1000);

                Debug.Print("Use BH1570FVI..");

                bh1570fvi.allocate(sharedBus); //4)

                lux = bh1570fvi.getLux();

                Debug.Print("Lux:" + lux.ToString());

                Thread.Sleep(3000);

            }

        }


    }

 1) 공유할 I2CDevice 인스턴스를 생성한다.

 2) 각 센서를 생성한다. 이때 1)에서의 인스턴스를 파라미터로 입력한다.

 3) bmp85에 I2CDevice를 할당한다.

 4) bh1570fvi에 I2CDevice를 할당한다.


실행 결과는 다음과 같다.







반응형
Posted by alias
,