0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラズパイで部屋の環境(温度湿度気圧CO2)をモニタリングするIoTデバイスを作る① ~センサーデータをPythonで取得する~

Last updated at Posted at 2024-11-17

はじめに

皆さんはご家庭に眠らせたままのラズパイやCO2センサ(MH-Z19C)、温湿度気圧センサ(BME280)はありませんか?
私はあります。

過去に市中製品でCO2濃度を取得できる良さげなIoTデバイスがなく自作しようと部品だけ集めて満足していたのですが、いつの間にかSwitchBotからCO2センサーが出てしまいました😇

このまま家のガラクタでいてもらうのも悲しいので、重い腰を上げ真っ当なIoTデバイスとして部屋の環境モニタリングで活躍してもらうことにします💪

使用するラズパイの情報

モデル Raspberry Pi 3 Model B+
OS Raspberry Pi OS 12 (bookworm)
Kernel 6.6.47
Python 3.11.2

※OSインストール方法等については触れませんので他の記事をご覧ください。

シリアル通信とI2Cの有効化

今回利用するCO2センサ(MH-Z19C)はシリアル通信で、温湿度気圧センサ(BME280)はI2C通信でデータを取得します。
そのためこれらの通信を有効化する必要があります。

シリアル通信の有効化

  1. 設定画面を開く

    $ sudo raspi-config
    
  2. 「3 Interface Options」を選択

    001.png

  3. 「I6 Serial Port」を選択

    002.png

  4. 「Would you like a login shell to be accessible over serial?」は「いいえ」

    003.png

  5. 「Would you like the serial port hardware to be enabled?」は「はい」

    004.png

  6. 設定結果が表示されるので「了解」

    005.png

I2C通信の有効化

  1. 「3 Interface Options」を選択

    001.png

  2. 「I5 I2C」を選択

    006.png

  3. 「Would you like the ARM I2C interface to be enabled?」は「はい」

    007.png

  4. 設定結果が表示されるので「了解」

    008.png

  5. 「Finish」を選択して完了

    009.png

再起動

設定が完了したら再起動しておきます。

$ sudo reboot

ラズパイと各種センサーの接続

ラズパイと各種センサーはこのように配線しました。
※今回使用しているBME280は3.3V駆動なので注意

配線図_ブレッドボード.png

Pythonの仮想環境作成

ラブパイのPythonにはデフォルトで様々なライブラリが入っています。
環境を分けるためvenvを使用して仮想環境を作成し、そこに必要なライブラリをインストールします。

  1. 仮想環境の作成とアクティベート
    「EnvDataCollector」という名前で仮想環境を作成し、仮想環境をアクティベートします。

    $ python -m venv EnvDataCollector
    $ cd EnvDataCollector/
    $ source bin/activate
    (EnvDataCollector) $
    
  2. 温湿度気圧センサ(BME280)用ライブラリのインストールと動作確認
    仮想環境にcgsensorライブラリをインストールします。

    (EnvDataCollector) $ pip install cgsensor
    ~省略~
    Successfully installed cgsensor-1.1 docopt-0.6.2 smbus2-0.5.0
    

    センサーを接続していればコマンドで動作確認できます。

    (EnvDataCollector) $ cgsensor bme280
    BME280 測定
      温度[°C]:  25.4
      湿度[%]:   55.5
      気圧[hPa]: 1019.5
    
  3. CO2センサ(MH-Z19C)用ライブラリのインストール
    仮想環境にmh-z19ライブラリをインストールします。

    (EnvDataCollector) $ pip install mh-z19
    ~省略~
    Successfully installed RPi.GPIO-0.7.1 argparse-1.4.0 certifi-2024.8.30 charset-normalizer-3.4.0 colorzero-2.0 getrpimodel-0.1.26 gpiozero-2.0.1 idna-3.10 lgpio-0.2.2.0 mh-z19-3.1.6 pyserial-3.5 requests-2.32.3 urllib3-2.2.3
    

    センサーを接続していればコマンドで動作確認できますが、root権限が必要なため仮想環境から抜けてから実施します。

    (EnvDataCollector) $ deactivate
    $ sudo bin/python -m mh_z19
    {"co2": 1846}
    

    (高いですね...通りで眠いわけだ😴)

Pythonでのセンサーデータの取得

次のコードで各種センサーの値を取得します。

main.py
import mh_z19
from cgsensor import BME280

class EnvDataCollector:
    def __init__(self) -> None:
        self._bme280: BME280 = BME280()

    def _get_data_from_mh_z19c(self) -> int:
        return mh_z19.read()["co2"]

    def _get_data_from_bme280(self) -> tuple[float, float, float]:
        self._bme280.forced()
        return self._bme280.temperature, self._bme280.humidity, self._bme280.pressure

    def execute(self) -> bool:
        is_succeeded: bool = True

        try:
            concentration: int = self._get_data_from_mh_z19c()
            print(f"{concentration=}")
        except Exception as e:
            print(f"{e=}")
            is_succeeded = False

        temperature: float
        humidity: float
        pressure: float
        try:
            temperature, humidity, pressure = self._get_data_from_bme280()
            print(f"{temperature=}")
            print(f"{humidity=}")
            print(f"{pressure=}")
        except Exception as e:
            print(f"{e=}")
            is_succeeded = False

        return is_succeeded

if __name__ == "__main__":
    print(f"result: {EnvDataCollector().execute()}")

root権限で実行し各種センサー値をプログラムで取得できていることが確認できます。
※MH-Z19Cからのデータ取得にroot権限が必要です。

$ sudo bin/python main.py
concentration=1161
temperature=25.6
humidity=45.2
pressure=1018.7
result: True

さいごに

センサーからデータ取得できるようになりましたが、このままではシェル上にしかデータを表示できないのでIoTデバイスとは呼べません。
次の記事ではIoTデバイスたらしめるため、AWS IoTCoreに接続しデータを送信できるようにしていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?