前回([UWP] 初心者目線でWindows 10 IoT:002 光量を測定しよう)で、室内の光量を測定してみました。
今回は室温を測定してみます。光量を測定したフォトトランジスターと同じくADC(アナログ・デジタルコンバーター)を使うため、似たような配線、ほぼ同じコードで実現することができます。
機器はこれまで同様、Amazonのハック ラズベリーパイ Raspberry Pi 電子工作入門キット。のものを使用します。
温度センサーは以下の画像のもの。正式な品名は不明ですが、検索すると同様の形でピンが3つのものがいくつかあるようです(流石にどれも規格は同じだと信じたいがどうだろう)。
今回は抵抗の代わりにコンデンサーを利用します(上記、入門キットの解説によると)。
抵抗じゃなくて、コンデンサーなの? 使い分けるケースは? という疑問もありましたが、どちらも電流を安定させるものらしいので大丈夫なんでしょう(この辺のエイヤッ感が初心者目線・・・)。
これまでの経験から、非対称な部品は「刺す向き」がある可能性が高いので注意して進みます。温度センサーは非対称、コンデンサーは対称。
配線は以下のページを参考に行います。
私がAmazonで購入したセットの解説ページでもあるので、機器なども悩まずに使えるのがありがたいポイント。
(参考)Raspberry Piで温度センサー。部屋の気温を取得しよう
このサイトにも以下のようにあります。
温度センサーは逆向きに取り付けないよう注意してください。
逆向きと言われても、どっちが逆かわからないのが初心者。
同ページの回路図の画像を見ると、向きが推測できるのですが、この回路図はちゃんと向きまで表現できるものなのか不明なので、確認してみます。
先に結論を書くと、回路図の見た目通りの向きでOKでした。以下は結論に至るまでの学習の過程です。同じく初心者の方は多少ですが参考になると思います。
こういう機器にはデータシートなるものが存在し、データシートで機器の情報が得られます。
正式な型番が不明なので、秋月電子通商というサイトで、同形式のデータシートを比較(素人なりに。理科で習ったような回路図なんかは読めません・・・)。
やはり規格は統一されているようで、蒲鉾状のパーツの平らな部分を向けた状態(上の画像のような)で、左側がGND(接地)で右側が+Vなので、電圧のプラス側ですね。電圧の高いトコロから低い所に流れるという太古の昔に学んだ理科の言葉が蘇って来ました。勘所として、電流がどのように流れるかと、それに合わせて機器を配置するイメージを持てると、素人なりに配置に確証が持てます。
電流の流れを意識しながら配置した結果が以下の画像です。
温度センサーとコンデンサー以外(Raspberry Pi 2とブレッドボードの接続やADCの配線)は、前回同様です。
プログラムも前回と全く同じでも値を取得することができます。
ただし、我々が良く知る摂氏の温度として変換するためにコードを追記する必要があります。
public sealed partial class MainPage : Page
{
private const string SPI_NAME = "SPI0";
private Timer periodicTimer;
private int adcValue;
private SpiDevice SpiADC;
public MainPage()
{
this.InitializeComponent();
this.InitAll();
}
public async void InitAll()
{
await InitSpi();
}
private async Task InitSpi()
{
// SPIの設定を行う
var settings = new SpiConnectionSettings(0);
settings.ClockFrequency = 10000000;
settings.Mode = SpiMode.Mode3;
// デバイスを取得する
string spiAqs = SpiDevice.GetDeviceSelector(SPI_NAME);
var devicesInfo = await DeviceInformation.FindAllAsync(spiAqs);
SpiADC = await SpiDevice.FromIdAsync(devicesInfo[0].Id, settings);
// タイマーをセットする
periodicTimer = new Timer(this.Timer_Tick, null, 0, 100);
}
private void Timer_Tick(object state)
{
byte[] readBuffer = new byte[3];
byte[] writeBuffer = new byte[3] { 0x00, 0x00, 0x00 };
writeBuffer[0] = 0x68;
// 値を取得する
SpiADC.TransferFullDuplex(writeBuffer, readBuffer);
adcValue = convertToInt(readBuffer);
// 値を摂氏に変換する
var volt = (adcValue * 3300) / 1024;
var degree = (volt - 500) / 10;
// 値を画面に表示する
var task = this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
this.textBlock.Text = degree.ToString();
});
}
public int convertToInt(byte[] data)
{
int result = 0;
result = data[0] & 0x0F;
result <<= 8;
result += data[1];
return result;
}
}
参照の追加から「Windows IoT Extensions for the UWP」を追加する必要があります。
以上で温度が取得可能になります。・・・なっているはずなのですが、エアコンの表示と異なっていたり(上の方が空気が温かいから?)、体感より5,6度低いなど、ちゃんと取れているのか不安な部分がありました。エアコンの表示状の温度が30度から26度ぐらいに下げたときも、センサーの値は21から19に遷移した程度でした。エアコンのオンオフと同調して値が上下するので、取れてるんじゃないかなぁと判断しました。
間違い等ありましたら、赤ペンお願いします。
Please give us your valuable comment