ネットワーク対応温度センサーを簡単に作る!

温度を計測してリアルタイム更新、webで表示するシステムが欲しいと言われました。なんか、そんなシステムを展示会で見たことがあったので、問い合わせてみたところ、カスタマイズ費用が必要だとか。

それだとお金かかるなぁと思いながら、んじゃ、なんか自作してみますかとやってみました。

こんな感じで実現しました。パソコンの熱をじかに拾わないように、USBの延長ケーブルをつけています。

パソコンはPenMの10年以上前に購入した機械です。新たに新品パソコンを買うのはもったいない。ほとんど価値がない捨ててもいいようなパソコンです。IoTで温度計測FTPでファイルアップロードするくらいだったら、十二分な性能を持っています。

パソコンのスペックは必要ありません。とりあえず動けばOKというレベルです。できたら眠っている古いパソコン、友達からもらえるようなパソコンで済ませましょう。

やっぱりLinuxが利用できるっていいですよね。相当古いVAIO VGN-Y90PSYを引っ張り出してきて、Debian Jessieをインストールしました。もう捨てるしかないっていう10年以上前に購入したパソコンなのでとりあえず原価0円です。

Screenshot of www.debian.org

Windowsも優れたOSだと思いますが、用途によってLinuxも使えるようになっていた方がいいです。それから、本当はStrechを利用しようと思ったのですが、ネットワーク細部の設定が変わっていて使い勝手が、、、分からない。

単にVAIO VGN-Y90PSYと相性が悪かっただけなのかもしれないけど。Jessieをインストールしてもネットワークが利用できない事態に遭遇しました。なぜなんだろうnetインストールはうまくいくのに、ゲートウェイだけ設定されないようです。仕方ないので、ゲートウェイだけ手動で設定しました。なんか変な感じです。

Jessieなら

routeの確認

route

default routeの追加

route add default gw 192.168.0.254

Strechなら

routeの確認

ip route

default routeの追加

 ip route add default via 192.168.0.254

SSHサーバと、標準ツールのみインストールします。デスクトップ環境は必要ありません。

USB温度計を準備します。

amazonで980円のUSB温度計測装置と、10年以上前に購入した古いパソコンを持ち出して作ってみたら、チョー簡単に温度計測ができました。

おもむろにDebianを起動して、USBを差し込むと

[ 268.384070] usb 3-2: new low-speed USB device number 2 using uhci_hcd
[ 268.560075] usb 3-2: New USB device found, idVendor=0c45, idProduct=7401
[ 268.560087] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 268.560096] usb 3-2: Product: TEMPerV1.4
[ 268.560104] usb 3-2: Manufacturer: RDing
[ 269.239310] input: RDing TEMPerV1.4 as /devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0/input/input10
[ 269.241652] generic-usb 0003:0C45:7401.0001: input,hidraw0: USB HID v1.10 Keyboard [RDing TEMPerV1.4] on usb-0000:00:1d.1-2/input0
[ 269.254702] generic-usb 0003:0C45:7401.0002: hiddev0,hidraw1: USB HID v1.10 Device [RDing TEMPerV1.4] on usb-0000:00:1d.1-2/input1

ちゃんと認識してる。

そして、これを利用するために、アプリをmakeします。

makeするために必要なアプリを入手します。

apt-get install build-essential libusb-0.1-4 libusb-dev git

CDも付属してますがプレーヤーを持ち出すのも面倒だったので、gitで公開されているソースコードを取得しました。

#git clone https://github.com/bitplane/temper.git
Cloning into 'temper'...
remote: Counting objects: 73, done.
remote: Total 73 (delta 0), reused 0 (delta 0), pack-reused 73
Unpacking objects: 100% (73/73), done.

日付時刻表示を日本のフォーマットへ

# cd temper
temper# vi temper.c

以下2行のように書き換えます

utc = localtime(&t);

strftime(dt, 80, “%Y-%m-%d %H:%M:%S”, utc);

書き換えるとこのようになります。

        if (!((tempc > -0.0001 && tempc < 0.0001) || passes >= 4)) {
                /* Apply calibrations */
                tempc = (tempc * scale) + offset;

                struct tm *utc;
                time_t t;
                t = time(NULL);
                utc = localtime(&t);

                char dt[80];
                strftime(dt, 80, "%Y-%m-%d %H:%M:%S", utc);

                printf("%s,%f\n", dt, tempc);
                fflush(stdout);

                return 0;
        }
temper# make
gcc -Wall temper.c pcsensor.c -o temper -lusb
pcsensor.c:50:18: warning: ‘reqBulkLen’ defined but not used [-Wunused-const-variable=]
 const static int reqBulkLen=8;

変な警告出たけど、気にしないで進めます。

そしてできたbinファイルを実行権限をつけて移動します

# mv temper /usr/local/bin/
# chmod u+s /usr/local/bin/temper

計測はこんな感じです。

temper.cを書き換えない場合はこのような表記になります。

/usr/local/bin/temper
06-Mar-2018 08:24,21.588518

temper.cを書き換えると日本でも見やすい表記になります

# /usr/local/bin/temper
2018-03-07 15:17:00,21.267050

この値を、ftpかなんかで、次回は公開サーバにもっていこうと思います。
980円でIot
このUSB温度計の原価ってどれくらいなんでしょうね。送料込みで980円ですから。

# apt-get install ftp
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  ftp
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 1 個。
61.5 kB のアーカイブを取得する必要があります。
#ftp
ftp> open ftp.hanako.jp
Connected to ftp.hanako.jp.
220 FTP Server ready.
Name (ftp.hanako.jp:hanako): hanako
331 Password required for hanako
Password:
230 User hanako logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put /home/hanako/ondo.txt /ondo.txt
local: /home/hanako/ondo.txt remote: /ondo.txt
227 Entering Passive Mode (150,95,240,39,254,35).
150 Opening BINARY mode data connection for /ondo.txt
226 Transfer complete
960 bytes sent in 0.00 secs (13.4636 MB/s)
# cat ftpup.sh
#!/bin/sh

ftp -n <<END
open ftp.hanako.jp
user hanako pass_word
put  /home/hanako/ondo.txt /ondo.txt
END

これをクローンに仕込んでしまえば完成です。temperを毎時0分に実行、温度を記録。毎時1分にftpでwebサーバにアップロードです。

0 * * * * /usr/local/bin/temper >> /home/hanako/ondo.txt
1 * * * * /home/hanako/ftpup.sh

最終的に、温度を測りたい設置場所はLANは来ているけど、スペースはそんなに確保できないという場所でした。そこで、むかーし購入したOrangePI PCを引っ張り出してきて設定・設置。手のひらサイズの温度計測システム完成です。

Orange PIでの設定はこちらで

Orange PIとはから初期設定まで、こちらでご覧いただけます。

web上で表示する時に日付、温度、時刻が自動的に更新されていく仕組みにします。

# cat ftpup.sh
#!/bin/sh
# 日付時刻更新型温度アップロード

/usr/local/sbin/temperature/temper | awk '{print $1}' > ondo.txt
/usr/local/sbin/temperature/temper | awk '{print $2}'  | awk -F, '{print $1}' >> ondo.txt
/usr/local/sbin/temperature/temper | awk -F, '{print $2}' >> ondo.txt

ftp -n <<END
open ftp.hanako.jp
user hanako *******
put  /usr/local/sbin/temperature/ondo.txt /ondo.txt
END

こんな感じでawkしてテキストはこのように表示されます

2018-10-19
11:21:03
21.331343

さらにHTML化してうめこみます。

#!/bin/sh
#温度用

#/usr/local/sbin/temperature/temper | awk '{print $1}' > /usr/local/sbin/temperature/digi.txt
#/usr/local/sbin/temperature/temper | awk '{print $2}'  | awk -F, '{print $1}' >> /usr/local/sbin/temperature/digi.txt
#/usr/local/sbin/temperature/temper | awk -F, '{print $2}' >> /usr/local/sbin/temperature/digi.txt

/usr/local/sbin/temperature/temper | awk '{print $1}' | awk -F- '{print "<p>"$1"年"$2"月"$3"日<br>"}' > /usr/local/sbin/temperature/digi.html

/usr/local/sbin/temperature/temper | awk '{print $2}'  | awk -F, '{print $1}' | awk -F: '{print $1"時"$2"分<br>"}' >> /usr/local/sbin/temperature/digi.html


/usr/local/sbin/temperature/temper | awk -F, '{print $2}' | awk -F. '{print $1"."substr($2,1,1)"℃</p>"}' >> /usr/local/sbin/temperature/digi.html

ftp -n <<END
open hanako.or.jp
user hanako *********
put  /usr/local/sbin/temperature/digi.html /digi.html
END

awkで欲しいところだけ取って、HTMタグを一緒に記載します。

運用をしていたら、とっても寒い日に 263.4441℃と表示され、なんじゃこりゃっていう状態に。調べたら、この温度計-4℃以下は計測できない仕様。なので、シェルスクリプトを書き換えました。

#!/bin/sh
#温度用
 
#/usr/local/sbin/temperature/temper | awk '{print $1}' > /usr/local/sbin/temperature/digi.txt
#/usr/local/sbin/temperature/temper | awk '{print $2}'  | awk -F, '{print $1}' >> /usr/local/sbin/temperature/digi.txt
#/usr/local/sbin/temperature/temper | awk -F, '{print $2}' >> /usr/local/sbin/temperature/digi.txt
 
/usr/local/sbin/temperature/temper | awk '{print $1}' | awk -F- '{print "

"$1"年"$2"月"$3"日
"}' > /usr/local/sbin/temperature/digi.html /usr/local/sbin/temperature/temper | awk '{print $2}' | awk -F, '{print $1}' | awk -F: '{print $1"時"$2"分
"}' >> /usr/local/sbin/temperature/digi.html /usr/local/sbin/temperature/temper | awk -F, '{print $2}' | awk -F. '{print $1}' |while read a;do if test $a -gt 100;then echo '-4℃以下' >> /usr/local/sbin/temperature/digi.html; else /usr/local/sbin/temperature/temper | awk -F, '{print $2}' | awk -F. '{print $1"."substr($2,1,1)"℃

"}' >> /usr/local/sbin/temperature/digi.html; fi; done; ftp -n <

どのように書き換えたかはこちらに詳細を。ちゃんと整理したコード体系にしないとなぁと思いつつ、いつも時間がないので、とりあえず的な書き方が積みあがっちゃいました。(-_-;)

HTML側では、iframeで埋め込みました。外部HTMLファイルを指定して、自分のサイト上に表示します。

<iframe src="https://hogehoge.org/digi.html" width="~" frameborder="0" scrolling="no"></iframe>

HTMLへの埋め込み方はいろいろあるので、こちらもご参考に

関連コンテンツ