2021年4月13日火曜日

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、照度センサーモジュールの照度データを送信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、照度センサーモジュールの照度データを送信/受信するには、以下の手順を実行します。

Raspberry Pi ZeroとTSL25721 照度センサーの接続は「Raspberry Pi Zeroと照>度センサーモジュールで照度を測る」を参照してください。

〇開発手順
1. pipenvの導入
pipenvをインストールしていない場合は、以下のコマンドを実行します。
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

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. paho-mqttモジュールとsmbusがインストールされた仮想環境作成
pipenvを使用する場合は以下のコマンドで、paho.mqttとsmbus用の仮想環境を作成します。
mkdir -p ~/smbus_mqtt

cd ~/smbus_mqtt

pipenv --python 3

pipenv install paho-mqtt smbus

pipenv shell

3. paho MQTTでメッセージを受信するプログラムを作成する
以下のプログラムで受け取った照度データを表示します。

mosquitto_sub_lux.py
import paho.mqtt.client as mqtt
import time

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(topic)

def on_message(client, userdata, msg):
    print("received: {}".format(msg.topic))
    print(str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(host, port, secs_keep_alive)

client.loop_forever()

・実行方法
以下のコマンドで受信プログラムを実行します。止める場合はCtrl+Cで止めてください。
python3 mosquitto_sub_lux.py

5. 照度データの送信
以下のプログラムで照度データを送信します。

mosquitto_pub_lux.py
import paho.mqtt.publish as publish
import smbus
import time

i2c = smbus.SMBus(1)
addr_tsl25721=0x39

FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 #  Auto-increment protocol transaction

REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN

REG_C0DATA = 0x14 # CH0 ADC low data register

# Initialize
# Reset Control Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, VAL_CONTROL_RESET)

# Reset Config Register
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, VAL_CONFIG_RESET)

# Set ALS time
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, VAL_ATIME_C64)

# Power on and enable ALS
i2c.write_byte_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, VAL_ENABLE)

def read_lux():
  atime = 0xC0 # 192
  gain = 1.0

  dat = i2c.read_i2c_block_data(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2]

  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
  lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
  lux = 0
  if ((lux1 <= 0) and (lux2 <= 0)) :
    lux = 0
  if (lux1 > lux2) :
    lux = lux1
  elif (lux1 < lux2) :
    lux = lux2

  return lux

topic = "mosquitto/test"
host = "localhost"
port = 1883
secs_keep_alive=60

lux= read_lux()
publish.single(topic, "lux:{:.1f}".format(lux), hostname=host, port=port, keepalive=secs_keep_alive)

・実行方法
以下のコマンドで送信プログラムを実行します。
python3 mosquitto_pub_lux.py

0 件のコメント:

コメントを投稿