見出し画像

RaspberryPiセンサ情報読取りとWebix

前回の記事では、RaspberryPiで制御した情報をWebで公開するためにWebixの活用が簡単という内容を紹介させていただきましたが、その事例を紹介するために、市販品で各種センサ情報を収集できるボードを今回は紹介します。RPZ-IR-Sensor Rev2というボードで、拡張スロットに装着すれば、使用できます。温度/湿度/気圧/明るさ/赤外線センサが実装されており、それ以外に4つのLEDと2つのオシボタンスイッチも実装されています。
アマゾンさんでも購入可能です。
以下のような機能が実装されています。

詳細情報は、以下のURLを参考にしてください。

この基盤に実装されている各種センサ情報の読み出しを簡単に行うには、上記URLを参考にドライバなどをインストールする必要があります。
cgsensorというドライバです。pythonで制御します。
I2Cインタフェースなので、I2Cインタフェースを制御するドライバでも使用可能です。(このボードの一部のセンサは、最新のRaspberryPiでは、動作しないことが記載されれていますので、注意願います。)
Raspberry Pi 5では、温度、湿度、気圧センサー、LED、スイッチは動作しますが、赤外線送受信は、動作しないようです。

LEDのON/OFFやSWの読取りはGPIOなので、サンプルでは、Ruby言語を使いました。pi_piperというライブラリで制御します。
全て、PythonかRubyでコーディングすればいいのですが、ruby言語の実装経験が長かった中で、I2C用のいいドライバが見つからなかったので、I2Cだけは、Pythonで記述しています。
今回の記事の中では、PHP言語との連携部分は、まだ記載しませんが、webixでWeb画面から操作するときのサーバ側アプリはPHPで記述し、PHPからPythonやRubyを起動して処理をする実装となります。
周期的にセンサを読む場合は、cronで該当プログラムを実行させ、読み取った情報をファイルに保存する方法で、PHPは、ファイルを確認するだけで、情報を画面に返すこともできます。

サンプルプログラムでは、センサの情報は、ファイルに出力し、
LEDの制御やSW状態の読み出しは、Rubyで動作するようにしたソースを紹介します。
★Ruby言語やPytho言語の実装及び各種ドライバのインストール手順は、この記事では、省略します。もし、必要であれば、問い合わせなど、記載してください。

温度、湿度、気圧、照度センサー情報
bme280_read.py

#!/usr/bin/env python3
"""
BME280センサーコード
測定を行い、結果を読み出して表示する. 
Indoor Corgi, https://www.indoorcorgielec.com
GitHub: https://github.com/IndoorCorgi/cgsensor

必要環境:
1) Raspberry Pi OS, Python3
2) I2Cインターフェース
  Raspberry PiでI2Cを有効にして下さい
  https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-i2c/

3) 拡張基板
  RPZ-IR-Sensor: https://www.indoorcorgielec.com/products/rpz-ir-sensor/

4) cgsensorパッケージ
  sudo python3 -m pip install -U cgsensor

TSL2572センサーコード

測定を行い、結果を読み出して表示する. 
Indoor Corgi, https://www.indoorcorgielec.com
GitHub: https://github.com/IndoorCorgi/cgsensor

必要環境:
1) Raspberry Pi OS, Python3
2) I2Cインターフェース
  Raspberry PiでI2Cを有効にして下さい
  https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-i2c/

3) 拡張基板
  RPZ-IR-Sensor: https://www.indoorcorgielec.com/products/rpz-ir-sensor/

4) cgsensorパッケージ
  sudo python3 -m pip install -U cgsensor
"""

import cgsensor  # インポート

bme280 = cgsensor.BME280(i2c_addr=0x76)  # BME280制御クラスのインスタンス, i2c_addrは0x76/0x77から選択
bme280.forced()  # Forcedモードで測定を行い, 結果をtemperature, pressure, humidityに入れる

tsl2572 = cgsensor.TSL2572()   # TSL2572制御クラスのインスタンス
tsl2572.single_auto_measure()  # 条件を自動で調整しながら1回測定を行い, luxに結果を入れる

# 書き込むファイルのパスを宣言する
file_name = "/home/sunsun/work/BME280_result.txt"
try:
    file = open(file_name, 'w')
    file.write("Temp:%.3f:°C\n" % bme280.temperature)
    file.write("Humid:%.3f:%\n" % bme280.humidity)
    file.write("Atmos:%.3f:hPa\n" % bme280.pressure)
    file.write("Illumin:%.3f:lux\n" % tsl2572.illuminance)
except Exception as e:
    print(e)
finally:
    file.close()

rootユーザでpython3 bme280_read.pyで /home/sunsun/work/BME280_result.txtに結果が出力されます。
以下、実行例です。

Temp:20.600:°C
Humid:35.800:%
Atmos:1016.000:hPa
Illumin:424.300:lux

実行するごとに、上書きでBME280_result.txtに情報が記録されるので、cronなどで周期的に実行すれば、PHP言語では、最新の情報を読み出すことが可能です。ロガーのようにしたい場合は、各センサの値以外に時刻情報も記録するようにすれば、ロガーのような実装も可能です。

LEDの点灯やスイッチ情報の読取りは、check_sw.rbです

# check_sw.rb
#文字コードUTF-8
#
# rootのcron 2min(120sec)単位に実行
# */2 * * * * /usr/bin/ruby /home/infosys/work/check_status.rb
#
require 'logger'
require 'mail'
require 'resolv'
require 'date'
require 'timers'
require 'pi_piper'
include PiPiper

shutdown_time = 1700
 logfilename = '/home/sunsun/work/ruby_log.log'
 logger = Logger.new(logfilename,5,100000)
 logger.level  = Logger::INFO



logger.info('check_sw.rb 1.01')

#LED青
gpio22_blue = PiPiper::Pin.new(:pin => 22, :direction => :out)

gpio22_blue.on   #blue LED

#LED白
gpio27_white = PiPiper::Pin.new(:pin => 27, :direction => :out)
gpio27_white.on
sleep(0.5)
#LED黄
gpio18_yellow = PiPiper::Pin.new(:pin => 18, :direction => :out)
gpio18_yellow.on 
sleep(0.5)
#LED緑
gpio17_green = PiPiper::Pin.new(:pin => 17, :direction => :out)
gpio17_green.on
sleep(0.5)
# SW1 GPIO05(タクトSW) 
# SW2 GPIO06(タクトSW)


gpio05_SW1 = Pin.new pin:5, direction: :in, pull: :up
gpio06_SW2 = Pin.new pin:6, direction: :in, pull: :up



gpio05_SW1.read
gpio05_SW1_v = gpio05_SW1.value
gpio06_SW2.read
gpio06_SW2_v = gpio06_SW2.value

puts "SW1:P05="+gpio05_SW1_v.to_s
puts "SW2:P06="+gpio06_SW2_v.to_s
sleep(0.5)
gpio22_blue.off
gpio27_white.off
gpio18_yellow.off
gpio17_green.off

このソースもrootユーザでruby check_sw.rbと記述することで、LEDの点灯と2つのSW情報の読み出し、LEDの消灯操作ができます。

センサやLED,SW制御には、rootユーザでアプリ実行が必要です。
このボードでは、ボード上に実装されたセンサから読み出す方法とケーブルで延長したセンサから読み出す方法も可能です。ボードの温度などの影響を受けない考慮ができるようになっています。
赤外線の操作は省略しますが、商品の紹介では、センサで状態を確認してエアコン制御する事例が掲載されています。自宅IoTの実装例ですね

次回の記事では、センサから読み出した情報をWeb(Webix)で表示する内容を紹介します。

この記事が気に入ったらサポートをしてみませんか?