이전 포스팅에서는 기압 센서인 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; } ............뒷부분도 동일함............... } } |
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를 할당한다.
실행 결과는 다음과 같다.