2022年7月9日土曜日

MONOSTICKとTWELITE DIPとSHT31を使用して、温度・湿度を計測する

TWELITE製品を使用して、無線を活用した電子工作を簡単に行うことができます。MONOSTICKとTWELITE DIPとSHT31センサーを使用して、温度・湿度を計測するには、以下の手順を実行します。

〇TWELITE DIPとSHT31センサーの写真

twelite側の手順

1. 部品の準備
MONOSTICK/TWELITE DIPの他、以下の部品を準備します(適宜単3電池2つが入る電池ボックス等も準備してください)

・SHT31使用 高精度温湿度センサモジュールキット
https://akizukidenshi.com/catalog/g/gK-12125/

・片面ガラス・ユニバーサル基板 Cタイプ(72×47.5mm) めっき仕上げ
https://akizukidenshi.com/catalog/g/gP-00517/

・丸ピンICソケット (28P) 600mil 桟ありタイプ
https://akizukidenshi.com/catalog/g/gP-00033/
 ※tweliteを基盤に直にハンダ付けしたくない場合はこちらを使用します。

・ピンソケット(メス) 1×5(5P)
https://akizukidenshi.com/catalog/g/gC-02762/
 ※SHT31を基盤に直にはんだ付けしたくない場合はこちらを使用します。

2. 配線
以下の回路図に基づいて、上記の部品を配線します。
回路図

3.以下のページからTWELITE STAGE SDKをダウンロード
https://mono-wireless.com/jp/products/stage/index.html

4.ダウンロードしたファイル名を/optなどに移動して、解凍します(以下はMWSTAGE-2021-12_linux-1.zipの場合)
unzip MWSTAGE-2021-12_linux-1.zip

5.以下のようなシェルを作成し、TWELITE STAGEを起動します。実行後/dev/ttyUSB0が消えますので、MONOSTICKやTWELITEを抜き差ししてください。
※/optにインストールした場合、適宜パスは読み替えてください(Ubuntu 20.04で動作確認) runtw.sh
#!/bin/bash
sudo rmmod usbserial
sudo rmmod ftdi_sio
/opt/MWSTAGE/TWELITE_Stage.run

sudo chmod +x ./runtw.sh

sudo ./runtw.sh

TWELITE STAGE起動後は、各デバイスの初期設定を行います。
・MONOSTICK
アプリを出荷時から書き換えていた場合は、App_Wingsアプリのイメージに更新します。
Application IDを任意の数値に設定します(例: 0x11223344 -> 入力時は0xを省いて11223344)

・TWELITE DIP
アプリをActエクストラのActEx_Sns_BME280_SHT30イメージに更新します。
Application IDは通信するためにMONOSTICKと同じIDを指定します
Device ID: 任意の値(1や2など)

PC側の操作手順

1.pipenvのインストール
pipenvをインストール済みでない場合は、以下のコマンドでインストールします。
sudo apt-get -y install python3

sudo pip3 install --upgrade pip

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. pyserialのインストール
以下のコマンドでpyserialをインストールした仮想環境を作成します
mkdir twelite
cd twelite
pipenv --python 3

pipenv install pyserial

pipenv shell

3. 以下のように相手端末からの状態通知データをシリアル通信で受信してパースするサンプルプログラムを作成して、実行します。
※データ構造についての詳細は以下のページの「アクト」タブを参照してください。
https://mono-wireless.com/jp/products/TWE-APPS/App_Wings/parent.html

twelite_sht31.py
import serial
import time
import datetime

def parse_act_notification(line):
  if line[0:1] != ':'.encode('utf-8'):
    return []
  # 送信元のデバイスID(1byte)
  device_id = line[1:3]
  # コマンド(1byte) -> 0xAA固定
  command = line[3:5]
  # 応答ID(1byte)
  resp_id = line[5:7]
  # 送信元シリアルID(4byte)
  sender_serial_id = line[7:15]
  # 送信先シリアルID(4byte)
  receiver_serial_id = line[15:23]

  # LQI値(1byte)
  lqi = line[23:25]

  # データのバイト数(2byte)
  data_len = line[25:29]

  # 識別子(4byte) "SBS1" -> 0x53425331
  data_id = line[29:37]
  # SHT3Xの温度(C)x100(2byte)
  sht3x_temp = line[37:41]
  # SHT3Xの湿度x100(2byte)
  sht3x_humi = line[41:45]
  # BME280の温度(C)x100(2byte)
  bme280_temp = line[45:49]
  # BME280の湿度x100(2byte)
  bme280_humi = line[49:53]
  # BME280の気圧(2byte)
  bme280_pres = line[53:57]
  # volt_vcc(2byte)
  volt_vcc = line[57:61]
  # volt_a1(2byte)
  volt_a1 = line[61:65]

  # チェックサム(1byte)
  csv = line[65:67]
  cs = format(256-(sum([ int(line[li:li+2], 16) for li in range(1, len(line)-4, 2) ]) & 0x000000ff), '02x')
  csr = True if csv.decode('utf-8').lower() == cs.lower() else False
  result = {"device_id":device_id, "command":command, "resp_id":resp_id, "sender_serial_id":sender_serial_id, "lqi":lqi, "data_len":data_len,  "data_id":data_id, "sht3x_temp":sht3x_temp,"sht3x_humi":sht3x_humi, "bme280_temp":bme280_temp, "bme280_humi":bme280_humi, "volt_vcc":volt_vcc, "volt_a1":volt_a1,"csr":csr, "sht3x_temp_value":int(sht3x_temp, 16)/100,"sht3x_humi_value":int(sht3x_humi, 16)/100}
  return result
  
ser = serial.Serial(port='/dev/ttyUSB0',baudrate=115200,timeout=10)
try:
  while True:
    rl = ser.readline()
    print(rl)
    result = parse_act_notification(rl)
    if "sht3x_temp_value" in result:
      print(datetime.datetime.now())
      print("temp:{}".format(result["sht3x_temp_value"]))
      print("humidity:{}".format(result["sht3x_humi_value"]))
except KeyboardInterrupt:
  # close
  print("stopped.")
finally:
  ser.close()

・実行コマンド
python twelite_sht31.py

関連情報

MONOSTICKとTWELITE DIPと土壌水分センサーを使用して、水分を計測する

0 件のコメント:

コメントを投稿