2021年4月9日金曜日

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、送信メッセージをキャラクタ液晶ディスプレイに表示する

Raspberry Pi Zero上のEclipse Mosquittoとpaho MQTTで、送信メッセージをキャラクタ液晶ディスプレイに表示するには、以下の手順を実行します。

開発手順

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_display.py
import paho.mqtt.client as mqtt
import smbus
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))
    lines = (msg.payload).decode('utf-8').split("\n")
    print("line0: {}".format(lines[0]))
    print("line1: {}".format(lines[1]))
    for ch in lines[0].encode("shift_jis"):
      i2c.write_byte_data(addr_lcd, 0x40, ch)
      time.sleep(0.01)

    i2c.write_byte_data(addr_lcd, 0x00, 0xc0)
    for ch in lines[1].encode("shift_jis"):
      i2c.write_byte_data(addr_lcd, 0x40, ch)
      time.sleep(0.01)

i2c = smbus.SMBus(1)
addr_lcd=0x3e

# Initialize
# Function Set
i2c.write_byte_data(addr_lcd, 0x00, 0x38)
time.sleep(0.01)

# Function Set
i2c.write_byte_data(addr_lcd, 0x00, 0x39)
time.sleep(0.01)

# Internal OSC frequency
i2c.write_byte_data(addr_lcd, 0x00, 0x14)
time.sleep(0.01)

# Contrast set
i2c.write_byte_data(addr_lcd, 0x00, 0x70)
time.sleep(0.01)

# Power/ICON/Constrast control
i2c.write_byte_data(addr_lcd, 0x00, 0x56)
time.sleep(0.01)

# Follower control
i2c.write_byte_data(addr_lcd, 0x00, 0x6c)
time.sleep(0.01)

# Function set
i2c.write_byte_data(addr_lcd, 0x00, 0x38)
time.sleep(0.01)

# Display ON/OFF control
i2c.write_byte_data(addr_lcd, 0x00, 0x0c)
time.sleep(0.01)

# Clear Display
i2c.write_byte_data(addr_lcd, 0x00, 0x01)
time.sleep(0.1)

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

5. 表示文字列の送信
以下のプログラムでメッセージを送信します。

mosquitto_pub_display.py
import paho.mqtt.publish as publish

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

publish.single(topic, "MQTT\nテスト", hostname=host, port=port, keepalive=secs_keep_alive)

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

関連情報

・秋月電子のRaspberry Piキャラクタ液晶ディスプレイモジュール
https://akizukidenshi.com/catalog/g/gK-11354/

0 件のコメント:

コメントを投稿