らずぱいでIoT 第5回(awkで計算してみる)

前回は、i2c-toolsのコマンドを使い気圧、温度、湿度のRawデータを読取ってみました。

今回は、Rawデータと補正値を読取ってそれをファイルに取り古くからあるフィルタープログラムのawkで連想配列を駆使して温度計算をしてみようと思います。

——————— 以下 ReadTemp シェルスクリプト側
#!/bin/bash

i2cset -y 1 0x77 0xF5 0xA0 b
i2cset -y 1 0x77 0xF2 0x01 b
i2cset -y 1 0x77 0xF4 0x25 b
sleep 0.1
i2cdump -y -r 0x88-0xA1 1 0x77 b >RT.dat
i2cdump -y -r 0xE1-0xFE 1 0x77 b >>RT.dat
awk -f CalcT.awk RT.dat
———————— ここまで

最後に awk -f でawkスクリプトを読んでいます。

———————— 以下 awk スクリプト

BEGIN {
for(i=0; i<=15; i++) {
hex[sprintf(“%X”,i)]=i;
if (i>9)
hex[sprintf(“%x”,i)]=i;
}
}
/^[89aef]0:/ {
split($0,dat,”:”);
line[dat[1]]=dat[2];
}

END {
dig_T1=shiftL(getByte(toHex(“8”),toHex(“9”)),8)
dig_T1+=getByte(toHex(“8”),toHex(“8”));
dig_T2=shiftL(getByte(toHex(“8”),toHex(“B”)),8)
dig_T2+=getByte(toHex(“8”),toHex(“A”));
dig_T3=shiftL(getByte(toHex(“8”),toHex(“D”)),8)
dig_T3+=getByte(toHex(“8”),toHex(“C”));
temp_r = shiftL(getByte(toHex(“F”),toHex(“A”)),12);
temp_r += shiftL(getByte(toHex(“F”),toHex(“B”)),4);

var1 = shiftR(temp_r, 3) – shiftL(dig_T1,1);
var1 *= shiftR(dig_T2,11);
var2 = shiftR(temp_r, 4) – dig_T1;
var2 *= shiftR(shiftR(temp_r,4)-dig_T1,12);
var2 *= shiftR(dig_T3,14);

printf(“Temperature = %2.2f\n”,shiftR((var1+var2)*5+128,8)/100);
}

function getByte(hiA,lwA)
{
r=0;
Ads=sprintf(“%x0”,hiA);
r = toHex(substr(line[Ads],3*(lwA+1)-1,1))*16+toHex(substr(line[Ads],3*(lwA+1),1));

return r;
}

function shiftR(v,r)
{
return int(v/(2^r));
}

function shiftL(v,r)
{
return int(v*(2^r));
}

function toHex(c)
{
if (length(c)==1 && (c ~ /[0123456789ABCDEFabcdef]/))
return hex[c];
else
return -1;
}

———————— ここまで
でそれらしい値が表示されています。

なので今回使っている温度・湿度・気圧センサーは、シェルスクリプトからでも制御可能なデバイスです。

以上のスクリプトとサンプルデータはこちらからダウンロードできます。

PAGE TOP ▲

お問い合わせフォームはこちら

お客様のビジネスの規模・内容に従い、最適なアプリケーションをご紹介します。
アプリケーションの導入・連携支援は、ぜひ、システムキューブにお任せください。

Copyright © 2022 System Cube Co.,Ltd. All Rights Reserved.