티스토리 뷰

반응형

지난 글에서 I2C를 이용해 Accelerometer 센서를 제어했는데, 이번에는 Temperature 센서를 제어해보도록 하겠다. 아무래도 Home IoT Project를 구현하는데 있어서 온도 센서가 좀더 활용도가 높다는 판단아래 온도센서 하나를 구입하였고, 실제 가속도 센서와 같이 x, y, z 의 값을 구하고, 구하는 값도 일반적으로 우리가 체감하기에는 어려운 값이기 때문에 이해하기 쉽고 보이기 쉬운 것으로 온도센서만큼 적합한 것이 없을 것 같다. 또한 단기적으로 온도 센서를 제어하는 것에 목적이 있지만, Project로 아래와 같은 시나리오를 기획하고 있다.

<시나리오>

집안의 온도를 측정하여 32도 이상올라가면 LED를 켜주자.


세부적으로 해야할 사항은 다음과 같다.

1) 온도 센서 제어

2) 32도 올라갈시 Trigger 발생 LED 점등

3) App Deploy

원래는 32도 올라가면 에어컨을 켜주게 하고 싶었으나, 에어콘이 와이파이 안되는 모델임을 안후, 우선 기능적인 메카니즘적 요소만 보기위해 수정했다.
오늘은 그 시나리오의 첫 번째로 구입한 온도센서에 대해서 알아보고, 제어하는 방법에 대해서 Sample Project를 작성해 보자.

#온도 센서 
LM75A를 기반으로 하는 고정밀/고해상도 I2C, 16bit 온도 센서 모듈을 사용한다.
제공하는 설명자료를 보면 Pin의 배열과 기능들을 알수 있다. 이 온도 센서 모듈은 LM75A를 기반으로 사용자가 -55℃ ~ 125℃ 사이의 온도를 편리하게 측정할 수 있도록 제작된 디지털 온도 센서 모듈이다. 또한 연속적으로 온도를 읽어야하는 경우 최소 300ms의 시간 간격이 필요하다고 설명되어 있다.

SCL/SDA 두 선을 이용해서 RaspberryPI와 연결할 수 있게 되어있는데 이전 가속도 센서 제어할때도 사용한 I2C 통신 방법이다. A0, A1, A2의 핀에는 점퍼를 해서 레지스터를 읽는 영역을 다르게 만들 수 있는데 기본적인 아무것도 건들지 않으면 A0, 1, 2 가 모두 open 상태이므로 A0, A1, A2에 해당되는 레지스터는 0 으로 세팅될 것이다. I2C 로 통신시 가장 처음에 slave address를 세팅하게 되는데, 이때, 상위 4bit은 '1001'로 지정되어 있고, 이어지는 3bit가 A2, A1, A0에 해당됨으로 '1001000' 이 되고 또 하나 pointer register를 지정해 주어야 한다. 센서마다 제어하는 spec이 다르기 때문에 datasheet를 꼼꼼히 읽어볼 것을 권장하고 우선 LM75의우 하위 레지스터인 LSB의 뒤 두바이트가 Temperature data를 읽을 수 있는 부분은 '00' 번지 이므로 pointer register의 값은 '00000000' 이다. 최종적으로 Slave Address('1001000') + Pointer Address('00000000') 을 세팅하면 읽을 수 있게 된다.

Data는 2byte로 구성되어 LSB의 하위 5bit는 사용하지 않는다. 읽은 11bit의 데이터를 계산하면 현재 온도가 나오게 된다. 그리고 나온 값에 0.125곱하면 된다.(Data Sheet 참조 - only 11 bits of those two bytes are used to store the Temp data in 2’s complement format with the resolution of 0.125 °C.) 다만, D10이 부호를 뜻하므로 0이면 영상이며, 1이면 영하기 때문에 계산한 값을 2의 보수로 변환해서 0.125를 곱해야 한다. 회로 구성은 가속도 센서와 같이 VCC, GND, SCL, SDA 4개의 선을 연결하며 비어있는 Universal Windows Project를 생성한다. 앞서 UWP 를 만드는 방법에 대해서 설명했기 때문에, 프로젝트 생성 및 IoT용 참조 설정 추가하는 설명은 넘어가도록 하겠다.

#코드 작성하기

- 필요한 Library

using Windows.UI.Xaml,Controls;

using Windows.Devices.I2c;

using Windows.Devices.Enumerations;

using System.Diagnostics;

using System.Threading;

using System;

- 센서 Init 코드

private async void InitLM75()

{

try

{

string aqs = I2cDevice.GetDeviceSelector();

var dis = await DeviceInformation.FindAllAsync(aqs);

settings.BusSpeed = I2cBusSpeed.FastMode;

LM75 = await I2cDevice.FromIdAsync(dis[0].Id, settings);

}

catch (Exception error)

{

Debug.WriteLine("Exception: " + error.Message);

}

periodicTimer = new.Timer(this.TimerCallback, null, 0, 1000);

}

- 타이머 코드, UI 연동 코드

private void TimerCallback(object state)

{

string TemperatureText;

byte[] readBuf = new byte[2];

try

{

LM75.Read(readBuf);

}

catch (Exception error)

{

Debug.WriteLine("Exception: " + error.Message);

}

int valh = ((int)readBuf[0]);

int vall = ((int)readBuf[1]);

double temperature = CalcTemperature(valh, vall);

Debug.WriteLine(temperature);

TemperatureText = String.Format("Temperature : {0:F4} ℃, temperature};

var task = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>

{

textBlock.Text = TemperatureText;

});

}

- 온도 계산 코드

private static double CalcTemperature(int valh, int vall)

{

int val = (valh << 3) + (vall >> 5);

if (val > 1024)

{

val = -1 * (2048 - val);

}

double temperature = val * 0.125;

return temperature;

}

온도 계산 코드를 잠깐 보면, 실제로 온도 계산을 이루는 데이터는 11bit에 해당하며 그중 11번째 bit는 부호를 의미하므로 10bit 의 값 즉 1024를 넘어가게 되면 음수로 변환하고 11bit의 최대값인 2에 11 승의 반대 값으로 계산해서 -1을 곱해주면 된다.

- UI - Xaml 코드

 <TextBlock x:Name="textBlock" HorizontalAlignment="Center" Margin="0,280,0,0" TextWrapping="Wrap" Text="Temperature : 

Not Initialized" VerticalAlignment="Top" Height="67" Width="640" FontSize="40" TextAlignment="Center"/>

Xaml 코드에서는 센서에서 읽은 데이터를 출력해줄 수 있도록 TextBlock 을 하나 생성한다.

그러면 실제 실행해보자.

RaspberryPI와 온도 센서를 직접 연결했다. 4개의 선만 연결하면 되기 때문에 굉장히 간단하다. 앞서 만든 app을 RaspberryPI에 올려서 실행해보면 현재 온도가 화면에서 보인다. 온도변화를 주기위해 에어콘을 틀었더니, 최초 온도에서 점점 줄어드는 모습을 볼 수 있었다.

가속도 센서보다는 우리가 알만한 값을 가지는 온도센서의 변화를 보니까 실제 Windows 10 IoT Core application을 잘 작성했구나 하는 생각이 든다. 이제 이 데이터를 이용해 LED를 켜고 debug 모드로 실행하는 것이 아닌 app으로 raspberryPI에 Deploy 하는것이 남았는데, 우선 온도 센서를 이용하실 분이 있다면 참고가 됬기를 바라며 오늘은 여기까지.

반응형
댓글