土日で完成! 趣味のラズパイ
土日で完成! 趣味のラズパイ ラズパイ工作の基本! 気温と湿度、気圧を計測する
本日から新しい連載「土日で完成! 趣味のラズパイ」がスタートします。ここでは初心者の方向けに、ラズパイを使った楽しい電子工作をご紹介していこうと考えています。目標は部品を集めてからその週末、土日で作り上げられることです。
パーツのはんだ付けはやったことがある、という人であれば、それほど難しいことではありません。Pythonのプログラムも出てきますが、できるだけ解説を入れていくようにします。
土日で完成! 趣味のラズパイ
第16回 ラズパイとChatGPTで遊ぼう——圧電ブザーで音を鳴らす
第15回 ラズパイとChatGPTで遊ぼう——気温/湿度/気圧を測定する
第14回 ChatGPTで遊ぼう——ラズパイで作ったデジタル時計に天気情報も表示させる
第13回 ラズパイとChatGPTで遊ぼう——液晶時計を作る
第12回 ラズパイとChatGPTで遊ぶ——その1:Lチカさせてみる
第11回 ラズパイをブリッジモードで使って、Wi-Fi接続する
第10回 ラズパイをWi-Fiルーターにする
特別編 【実機レビュー】よりパワフルになったRaspberry Pi 5を検証!
第9回 VolumioでラズパイからSpotifyやradikoを楽しむ
第8回 ラズパイで音楽プレーヤー「Volumio」を楽しむ
第7回 GPSを導入して正確な時刻を刻む
第6回 ラズパイをNTPサーバーにする
第5回 ラズパイを使ってデジタル時計を作る
第4回 Raspberry Pi Camera Module 3を使って見守りカメラを作る
第3回 BME680の測定データを小型ディスプレイに表示させる
第2回 空気質センサー「BME680」で空気汚染度を測る
第1回 ラズパイ工作の基本! 気温と湿度、気圧を計測する
一覧ページへ
本題に戻ります。連載の第1回目として選んだのは、ラズパイで気温や湿度、気圧を測定すること、です。ご存じの方も多いと思いますが、ラズパイでのセンシングとしては、気温/湿度/気圧の測定は基本中の基本となっています。
多くのサイトで紹介されているのは、秋月電子通商などで販売されている「BME280」を使った測定です。とてもこなれているセンサーなので、いろいろなWebサイトで紹介されています。昔はこれを使うために長いコードを書いていましたが、最近ではライブラリも充実し、短いコードで利用できるようになってきました。
ということで、ここでもBME280を使ってもいいのですが、それではあまり芸がありません。そこでBME280を提供しているBosch Sensortecが作っている「BME680」を使うことにします。BME680がBME280と異なるのは、ガスセンサーが搭載されていることです。BME680のガスセンサーでは7段階で空気の質を測れますので、検知してみましょう。
今回必要なパーツと価格は以下の通りです。合わせて2000円以下で購入できます。
- BME680使用 温湿度・気圧・ガスセンサモジュールキット:1320円
- ブレッドボード BB-801:220円
- ジャンパーワイヤー オスメス:180円(この中から4本利用する)
BME680をラズパイに接続する
BME680ですが、上でも挙げたように1キットが1320円と少し高めです。複数の機能が用意されているセンサー類は、どうしても1000円を超えてしまう傾向がありますね。
キットはBME680が配置された基板とL字型のピンヘッドで構成されています。このピンヘッドを基板にはんだ付けして使います。
はんだ付けが済んだら、ブレッドボードに差して、ジャンパーワイヤーでラズパイと接続します。BME680のキットはI2C(アイ・スクエアド・シー、またはアイツーシー)という方式でラズパイとデータをやり取りします。この時に使うのは「SDA」(シリアルデータ)と「SCL」(シリアルクロック)の2本です。ラズパイではSDAは3番ピン、SCLは5番ピンに割り当てられていますので、そこと接続します。
この他に3.3V電源(ラズパイの1番ピン)、GND(ラズパイの9番ピンなど)を接続する必要があります。また基板背面にあるジャンパー回路のうちJ2をはんだ付けして短絡させます。
なおmicroSDメモリーカードにRaspberry Pi OSをインストールし、ラズパイに差して使う方法については、以前掲載した連載「第2回 ラズパイってどうしたら使えますか」と「第3回 Raspberry Pi OSって何ですか」を参考にしてください。また今回利用するI2Cの有効化については「第4回 ラズパイを使う準備って何をしたらいいですか」を参考にしてください。
BME680で使うライブラリをインストールする
ではまず、BME680がラズパイ側で認識されているか確認しましょう。ラズパイのデスクトップを利用しても良いですが、それよりも手軽なターミナル接続で操作します。ターミナルを利用する方法については、同じく「第6回 ターミナルソフトって何ですか」を参考にしてください。
ターミナルソフトを起動してラズパイにログインしたら、「i2cdetect -y 1」と入力します。すると以下のように表示されます。
$ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 --
このように横軸が6、縦軸が70の場所に「76」と表示されればOKです。この場合、BME680がI2Cで「0x76」のアドレスを利用している、と言います。
では続いてライブラリをインストールします。これはPIMORONIが公開しているものです。以下のコマンドを順次入力してください。
$ git clone https://github.com/pimoroni/bme680 $ cd bme680/library $ sudo python setup.py install
これでBME680のライブラリを利用する準備が整いました。今回インストールしたファイルには、Pythonのサンプルプログラムが用意されています。センサーの値全てを読み取るテストプログラムを走らせてみましょう。
$ cd /home/pi/bme680/examples $ python read-all.py
すると以下のように表示され、測定した値が1秒ごとに表示されます。
read-all.py - Displays temperature, pressure, humidity, and gas. Press Ctrl+C to exit! Calibration data: par_gh1: 5 par_gh2: -12446 par_gh3: 18 par_h1: 618 par_h2: 1039 par_h3: 0 par_h4: 45 par_h5: 20 par_h6: 120 par_h7: -100 par_p1: 35462 par_p10: 30 par_p2: -10325 par_p3: 88 par_p4: 6124 par_p5: 36 par_p6: 30 par_p7: 25 par_p8: -531 par_p9: -3463 par_t1: 26453 par_t2: 26325 par_t3: 3 range_sw_err: 0 res_heat_range: 1 res_heat_val: 45 t_fine: 115507 Initial reading: gas_index: 0 gas_resistance: 12946860.58570794 heat_stable: False humidity: 43.905 meas_index: 0 pressure: 1013.28 status: 32 temperature: 22.56 Polling: 22.56 C,1013.28 hPa,43.91 %RH 22.58 C,1013.29 hPa,43.83 %RH,4704.015880716148 Ohms 22.62 C,1013.32 hPa,43.75 %RH,5307.952503912426 Ohms 22.65 C,1013.33 hPa,43.68 %RH,6452.475192311798 Ohms 22.69 C,1013.33 hPa,43.60 %RH,7848.209416808962 Ohms 22.73 C,1013.30 hPa,43.53 %RH,9293.061311990426 Ohms 22.76 C,1013.31 hPa,43.47 %RH,10812.45936080907 Ohms ……(続く)
この数値は左から気温、気圧、湿度、ガスセンサーの値となっています。
測定用のプログラムを作成する
このサンプルプログラムを元に、測定するためのプログラムを作成していきましょう。先ほどのサンプルプログラムをWindows側にコピーし、プログラム作成支援ツールの「Visual Studio Code」で読み取り、そこから要素を拾い出して作っていきます。
なおWindowsにコピーする方法については「第9回 ラズパイでWindowsとやり取りするにはどうしたらいいですか」に、Visual Studio Codeについては「第10回 ラズパイでLチカって何ですか」で述べていますので参考にしてください。
ところでPIMORONIのBME680ライブラリ紹介ページには、センサーの値を「sensor = bme680.BME680()」として読み出す、とあります。これを元に作っていけばよさそうです。作り上げたプログラムが以下となります。
#!usr/bin/env python # -*- coding: utf-8 -*- import bme680 import time sensor = bme680.BME680() sensor.set_temperature_oversample(bme680.OS_8X) sensor.set_humidity_oversample(bme680.OS_2X) sensor.set_pressure_oversample(bme680.OS_4X) try: while True: output = '{0:.1f} C,{1:.1f} %RH,{2:.1f} hPa'.format( sensor.data.temperature, sensor.data.humidity, sensor.data.pressure) print(output) time.sleep(1) except: KeyboardInterrupt
BME680の測定値を「sensor = bme680.BME680()」で呼び出したあと、続く3行で気温、湿度、気圧のデータを格納し、「sensor.data.temperature」「sensor.data.humidity」「sensor.data.pressure」で温度、気圧、湿度をそれぞれ変数「output」に格納して表示させています。そして「while True」文で繰り返し表示する仕組みです。
これを実際に走らせると、以下のような表示が無限ループで繰り返されます。このプログラムは「try:」~「except:」でくくられており、最後の「KeyboardInterrupt」で、キーボードからCtrl+Cが入力されると中断する仕組みです。
$ python sokutei.py 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa 22.9 C,43.0 %RH,1007.0 hPa ……(以下続く)
ここまでで気温と湿度、気圧の測定結果が得られるようにしました。次回はもう1つのデータ、空気の汚染度を測るやり方について解説していきます。