こんにちは、fireflakeのはちまるです。耳慣れないかもしれませんが、MQTTという通信方式をご存じでしょうか?シンプル、軽量、省電力で、一対一だけでなく一対多や多対多の通信も出来るという事で、IoT界隈では人気の通信方式です。MQTTはマッチングサービスに似ていて「特定のラベルが付いたデータ」を「そのラベルが欲しい人」が受け取る仕組みになっています。以下の絵図の感じですね。
MQTTの仕組み
規模が大きいMQTTシステムになると「データを送る人」も「データを欲しがる人」もたくさんいて、多対多の通信が行われたりする訳です。
今回はそんなMQTTを使って、2台のPico Wを一対一で通信させて遠隔制御を行ってみようと思います。まず、こんな感じの2台のPico Wを用意しました。
連携させる2台のPico W
左のPico W(データを送る側)には金色のCO2センサー(MH-Z19C)が付いてます。そして右のPico W(データを欲しがる側)にLEDが付いています。では、左のPico Wが測定するCO2濃度が2000ppmを越えたら、右のPico WのLEDが光る仕組みを作ろうと思います。
ちなみにデータの流れはこんな感じになります。
データの流れ
ではでは、プログラムを書いてみますね(しばらく続くタイピング音)。・・・出来ました。まずデータを送る側である「CO2濃度を測定するPico W」のメイン部分はこんな感じです。手軽なテストという事で、MQTTサーバーはインターネット上のフリーのサーバーを使います。そのMQTTサーバーのリンクも貼っておきますね。
改めてプログラムがこれ。
‘’’「CO2濃度を測定するPico W」のプログラム’’’
‘’’「データを送る人」の役割’’’
# MQTTサーバーに接続する処理
MQTT_SERVER = "broker.hivemq.com"
CLIENT_ID = ubinascii.hexlify(machine.unique_id())
TOPIC = b"co2_send_test_20231021"
c = MQTTClient(CLIENT_ID, MQTT_SERVER)
c.connect()
while True:
co2 = get_co2_data()
oled_show(co2)
# CO2データをMQTTサーバーに送る処理
c.publish(TOPIC, co2.encode())
time.sleep(3)
c.disconnect()
そして、受信側である「LEDを光らせるPico W」のメイン部分はこんな感じです。
‘’’「LEDを光らせるPico W」のプログラム’’’
‘’’「データを欲しがる人」の役割’’’
# MQTTサーバーから来たCO2濃度を判定する処理
def sub_cb(topic, msg):
if int(msg.decode("utf-8")) > 2000: # 2000ppmより上なら
led.on() # LEDをONにする
else:
led.off() # そうじゃないならOFFにする
# MQTTサーバーに繋げる処理
MQTT_SERVER = "broker.hivemq.com"
CLIENT_ID = ubinascii.hexlify(machine.unique_id())
TOPIC = b'co2_send_test_20231021'
c = MQTTClient(CLIENT_ID, MQTT_SERVER)
c.set_callback(sub_cb)
c.connect()
c.subscribe(TOPIC)
while True:
# CO2データが来ていないか確認する処理
c.wait_msg()
time.sleep(3)
c.disconnect()
これで「CO2濃度を測定するPico W」 が測定しているCO2濃度が2000ppmを越えたら、「LEDを光らせるPico W」のLEDが光る仕組み、が出来たはずです。電源投入すると、「LEDを光らせるPico W」のLEDは消えた状態です。ちなみにこの2台のPico Wは同じ場所に置いていますが、通信の状態としては上の絵図のように、一度インターネットを介して繋がっています。
2台のPico Wに電源投入した状態
写真だと見づらいのですが、このときのCO2濃度は758ppmでした。
758ppm
では「CO2濃度を測定するPico W」に息を吹きかけますね。しばらく吹いていると、ディスプレイの表示が2000ppmを越えました。2417ppmになっています。
2417ppm
それを受けてLEDが光ります。
LEDが点灯したところ
そしてCO2濃度が2000ppmを下回ると、LEDは消えました。こんな風に、2台のPico Wを組み合わせる事で、遠隔からのデータ送信を介した制御を行う事も出来ます。
今回は2台のPico Wを同じ場所に置いたので分かりづらいですが、実際はインターネットが繋がるところならどれだけ離れていてもOKなので、例えばすぐには見に行けない場所にセンサーやボタンのついたPico Wを設置しておいて、そこで何か起きたら自分のそばに置いているPico Wに何らかの動きをさせる、という仕組みも比較的簡単に作ることが出来ます。
また、今回はフリーのMQTTサーバーを使いましたが、例えばAmazonのクラウドサービスであるAWSを使えば自分だけのMQTTサーバーを使う事も出来ます。(期限付きの無料枠もありますね。)
今回は遠隔制御の2例目という事で、MQTTを使った話でした。プログラムを書いて現実世界のものを動かせるのって楽しいですよね。ではではまた。恒例の宣伝になりますが、X/Twitterを始めてみたので良かったらフォローお願いします。