りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

Raspberry Pi + DHT11 + Node.jsで気温・湿度を取得

f:id:ibuquicallig:20190609085915p:plain

この記事ではNode.jsDHT11を使用して気温と室温を取得する方法について解説しています。

この記事でできること

  • Node.jsとDHT11で気温・湿度をコンソールに表示させる
  • node-cronと組み合わせて定期実行スクリプトを作成する

前の記事

前回も同じDHT11を使用してPythonで気温と湿度を取得しました。同じモジュールを使用して今回のスクリプトも作成します。

必要なもの

必需品

今回初めて電子工作をする場合、銅線やブレッドボードと呼ばれるものが必要となってきます。まだ購入されていない場合は以下の記事などを参考にしてそろえてください。

DHT11

タイトルにもなっていますが、今回気温と湿度を取得するために使用するモジュールはDHT11というものを使用します。前回の記事と同じリンクにはなりますが、以下のセット品に入っているものを使用しています。

このモジュールはDHT11単品ではなく、基板にすでにはんだ付けされています。この基板にはすでに電源が通っているか確認できるLEDとDATAVCCが抵抗器でつながれています。これにより抵抗など何も考えずに簡単にRaspberry Piに繋げることができます。

手順

それでは作成していきます。Node.jsをすでにRaspberry Piにインストールしているという方はプロジェクトの作成から始めてください。もちろん、Node.jsの使い方をいまいち思い出せない!という方も参照していただけばなんとなく思い出すかもしれません👀

Node.jsのセットアップ

Raspberry Piにインストールする場合はちょっと注意が必要で、単純にapt-getでインストールするとかなり古いNode.jsがインストールされてしまったり、コマンドがうまく実行できなかったりします。

以下の記事でモデルごとにインストールの方法について解説しています。読み進めていくと簡単なスクリプトの作成も行っているので、「なんとなく使い方思い出せない」という方もご一読していただければ思い出すかもしれません。。。

プロジェクトの作成

まずはプロジェクトを作成します。ホームディレクトリ内でもどこでもいいので、nodejs_dht11という感じでディレクトリを作成してnpm initします。もちろんディレクトリ名はなんでも大丈夫です。

$ mkdir nodejs_dht11
$ cd nodejs_dht11
$ npm init
# あとはエンターキー連打でOKです
$ ls
package.json

package.jsonが作成されていればOKです。次に進みます。

モジュールのインストール

今回使用するモジュールはnode-dht-sensorというものです。GPIO用のモジュールでも可能なはずですがこちらのほうがより簡単に実装することができます。

以下のコマンドを実行してインストールします。--saveをつけることでpackage.jsonにインストール履歴が残るので環境の再構築が簡単になります。

$ npm install --save node-dht-sensor

このモジュールを使用して同様にDHT11を使ったプログラミングを行っているサイトではBCM2835というライブラリをインストールする必要があるとされていますが、現行のバージョンでは不要となっているようです。ですのでそのまま使用します。

インストールが完了したら、一旦回路の作成に移ります。電子工作をやっているとこの物理実装と論理(プログラミング)実装を行ったり来たりすることが多々あります。個人的にはこの行ったり来たりが、いろんな技術を寄せ集めている感があって好きです。(笑)

回路の作成

回路は前回Pythonで実装した時と同じ回路を使用します。Raspberry PiのGPIOピンは18番のピンを使用します。

f:id:ibuquicallig:20190606141600p:plain

ごくごく単純な回路で、Raspberry PiとDHT11のGND同士、5VVCC同士、そして18番ピンとDATAをつなぎ合わせます。すでに抵抗などは基板に実装されているので何もしなくてOKです。もしそのままのDHT11(4本のピンがある)を使用する場合、以下のような感じの回路となります。

f:id:ibuquicallig:20190606141607p:plain

回路がうまく作成できている場合、DHT11のLEDが光りますので確認出来たら次に進みます。

プログラムの作成

それではJavaScriptでプログラムを作成していきます。ファイル名はindex.jsとしておきます。vimなどで編集して行きましょう。

$ vim index.js

ソースコードは以下のような感じとなります。

const sensor = require('node-dht-sensor');

const DHT11    = 11;
const DHT22    = 22;
const data_pin = 18;

sensor.read(DHT11, data_pin, (err, temp, humid) => {
  if (err) return console.log('DHT11からデータを取得することができません(ピン番号:%d)', data_pin);
  console.log(new Date().toString());
  console.log('気温: %d℃', temp);
  console.log('湿度: %d%', humid);
});

実行してみるとこんな感じになります。

$ node index.js
Sat Jun 08 2019 09:10:17 GMT+0900 (Japan Standard Time)
気温: 27℃
湿度: 64%

実行して、JavaScriptのエラーが表示される場合はコードが間違っている可能性が高いです。エラーも何も表示されない場合は回路が間違っているが、指定しているピンの番号と実際の回路での番号が一致していない可能性が高いです。




以下コードの解説です。

まずはモジュールを読み込みます。

const sensor = require('node-dht-sensor');

次にDHT11のデータピンを接続しているRaspberry Piのピン番号などを定義します。後々の関数の引数にそのまま数値を指定してしまうとみにくくなったり、修正しにくくなります。

const DHT11    = 11;
const DHT22    = 22;
const data_pin = 18;

メインの処理です。

read()関数の第1引数にセンサーの種類を指定します。DHT11の場合は11を指定します。この値は先ほどconstで定義しましたね!もしここに11と直接書いたりすると、後で見たときに11の表す意味が分からなくなってきたりします😒😒

第2引数にはデータピンの番号を指定します。今回は18ピンを指定しています。

第3引数にはデータ読み取り後のコールバック関数を指定します。その関数の引数はそれぞれエラーオブジェクト、温度、湿度となっています。

sensor.read(DHT11, data_pin, (err, temp, humid) => {});

処理の中身です。まずはエラーの場合、エラーログを出力してreturnし、後続の処理を行わないようにします。。。。がこのエラーオブジェクトがどうやっても生成されません(笑)

値読み取りできない場合はそもそもこのコールバック関数が実行されていないような挙動をします。とりあえずはあきらめてこのまま実装しておきます。

温度・湿度表示部分に関しては、単純にセンサーで取得できた値の変数をconsole.logで表示しているだけです。芸がなくて申し訳ない。。。🤣🤣

if (err) return console.log('DHT11からデータを取得することができません(ピン番号:%d)', data_pin);
console.log(new Date().toString());
console.log('気温: %d℃', temp);
console.log('湿度: %d%', humid);

node-cronと組み合わせて定期実行させる

最後にnode-cronを使用して定期実行してみます。Linuxの標準コマンドのcrontabで実行することもできますが、node-cronにより一ファイル内で処理とスケジューリングを完結できるので個人的には好きです。

まずはnode-cronをプロジェクトにインストールします。

$ npm install --save node-cron

そして、先ほどの処理を包み込むようにnode-cronの処理を追加します。

const sensor = require('node-dht-sensor');
const cron   = require('node-cron');

const DHT11    = 11;
const DHT22    = 22;
const data_pin = 18;

cron.schedule('*/10 * * * * *', () => {
  sensor.read(DHT11, data_pin, (err, temp, humid) => {
    if (err) return console.log('DHT11からデータを取得することができません(ピン番号:%d)', data_pin);
    console.log(new Date().toString());
    console.log('気温: %d℃', temp);
    console.log('湿度: %d%', humid);
  });
});

*/10 * * * * *とスケジューリングすることで10秒に一回実行します。この辺の書式はcrontabと同じなのでそちらの文法を参照してください。

実行した感じが以下です。

$ node index.js
Sat Jun 08 2019 10:16:00 GMT+0900 (Japan Standard Time)
気温: 29℃
湿度: 75%
Sat Jun 08 2019 10:16:10 GMT+0900 (Japan Standard Time)
気温: 29℃
湿度: 73%
Sat Jun 08 2019 10:16:20 GMT+0900 (Japan Standard Time)
気温: 29℃
湿度: 64%

今はまだコンソールに表示しているだけですが、これを10分ごとにデータベースに登録したり気温が28℃を超えている場合にエアコンの電源をオンにしたりする連携技が使えるようになってきます。この部分に関してはまた別の連載で掘り下げていきたいと思います!

今回はここまでです。お疲れ様でした!

最終的なコード

const sensor = require('node-dht-sensor');
const cron   = require('node-cron');

const DHT11    = 11;
const DHT22    = 22;
const data_pin = 18;

cron.schedule('*/10 * * * * *', () => {
  sensor.read(DHT11, data_pin, (err, temp, humid) => {
    if (err) return console.log('DHT11からデータを取得することができません(ピン番号:%d)', data_pin);
    console.log(new Date().toString());
    console.log('気温: %d℃', temp);
    console.log('湿度: %d%', humid);
  });
});

最後に

Python、JavaScript(Node.js)で同じ処理を書いてみましたが、どちらもほとんど同じで言語と使用しているライブラリが違うぐらいでしたね!

私個人としてはあまりPythonに明るくなく、逆にNode.jsは結構好きなので以降の記事ではNode.js(JavaScript)で書いていくことが多くなると思います😊

Lチカから始まったRaspberry Piでの電子工作入門でしたがいったんここで区切ります。

まだまだほかにもいろんなモジュール(ボタンやブザー、防水の温度計など)があったり、先ほど言及したデータベースとの連携 → WEBサイトに表示といったネタがいっぱいあります。

電子工作カテゴリにどんどん追加していくのでその中から好きな記事を参照してみてください!そこまでいけば中級者ですね😍

参考

以下のサイトの情報を引用・参考にしました。

DHT11のデータシートなどに関しては前回記事で紹介しています。