2021年4月21日水曜日

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、DHT11の温度・湿度データを送受信する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、DHT11の温度・湿度データを送受信するには、以下の手順を実行します。

〇開発手順

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とdht11用の仮想環境を作成します。
mkdir -p ~/dht11_mqtt

cd ~/dht11_mqtt

pipenv --python 3

pipenv install paho-mqtt dht11

pipenv shell

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

mosquitto_sub_dht11.py
import paho.mqtt.client as mqtt

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_dht11.py

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

mosquitto_pub_dht11.py
import paho.mqtt.publish as publish
import RPi.GPIO as GPIO
import dht11

# initialize...
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

def read_dht11():
  data = ""
  while True:
    instance = dht11.DHT11(pin=14)
    result = instance.read()
    if result.is_valid():
      data = "{},{}".format(result.temperature, result.humidity)
      break
  return data

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

val = read_dht11()
publish.single(topic, "dht11:{}".format(val), hostname=host, port=port, keepalive=secs_keep_alive)

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

0 件のコメント:

コメントを投稿