« ESP32/ESP8266のMicroPythonでRTCを現在時刻に合わせる方法 | トップページ | ESP8266のMicroPythonに温度センサーTMP102(i2c)を接続する »

2020年3月 6日 (金)

ESP32/ESP8266のMicroPythonのDHTセンサーデータをホストPCのpythonでMQTT受信する

2020/3/6

ESP32/ESP8266 MicroPython DHT Python MQTT test

ESP32/ESP8266 MicroPython DHT Python MQTT test

概要

ESP32/ESP8266のMicroPythonのDHTセンサーデータをホストPCのpythonでMQTT受信する。MicroPython側が送信側、ホストPCのpythonが受信側になる。

接続

Grove-DHT11センサーをGrove-Base-Shield経由でGrove-D5-Slotに接続すると 以下のように接続したことになる。

Grove D5 solot

Arduino-Pin ESP8266
D5 IO04
D6 IO05(NOT USED)
VCC 3.3V
GND GND

受信側Pythonスクリプト

PY_MQTT_DHT_recv.py

#!usr/bin/env python # -*- coding: utf-8 -*- # receving DHT11 sensor data from ESP_MicroPython via MQTT import paho.mqtt.client as mqtt import json def on_connect(client, userdata, flags, respons_code): topic = 'DHT11' print('watch %s' % topic) client.subscribe(topic) def on_message(client, userdata, msg): #print(msg.topic + ' ' + str(msg.payload)) print(msg.topic+':') parsed = json.loads(str(msg.payload)) print('time: '+parsed['time']) print('Temperature: '+str(parsed['Temperature'])) print('Humidity: '+str(parsed['humidity'])) print('---------------------------') client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message #client.connect('5.196.95.208', 1883, keepalive=60) client.connect('test.mosquitto.org', 1883, keepalive=60) client.loop_forever()

該当ライブラリーは以下でインストールする:

pip install paho-mqtt

送信側micropythonスクリプト

MQTT_DHT_send.py
以下は自分の環境に合わせる:
ssid = 'your_ssid'
password = 'your_passwd'

# boot.py ssid = 'your_ssid' password = 'your_passwd' mqtt_server = '5.196.95.208' # Complete project details at https://RandomNerdTutorials.com import time from umqttsimple import MQTTClient import ubinascii import machine import micropython import network import esp esp.osdebug(None) import gc gc.collect() client_id = ubinascii.hexlify(machine.unique_id()) last_message = 0 #message_interval = 5 counter = 0 station = network.WLAN(network.STA_IF) station.active(True) station.connect(ssid, password) while station.isconnected() == False: pass print('Connection successful') print(station.ifconfig()) #=========================================== from machine import RTC import utime import ntptime rtc = RTC() ntptime.settime() # setup time by remote NTP server def get_jst(): tm = utime.localtime(utime.time()) # UTC now jst = str(tm[0])+'/'+str(tm[1])+'/'+str(tm[2])+' '+str((tm[3]+9)%24)+':'+str(tm[4])+':'+str(tm[5]) return jst #=========================================== import ujson import dht from machine import Pin d = dht.DHT11(Pin(4)) message_interval = 1 # sec def connect_and_subscribe(): global client_id, mqtt_server, topic_sub client = MQTTClient(client_id, mqtt_server) # client.set_callback(sub_cb) client.connect() # client.subscribe(topic_sub) # print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_sub)) print('Connected to MQTT broker:'+mqtt_server) return client def restart_and_reconnect(): print('Failed to connect to MQTT broker. Reconnecting...') time.sleep(10) machine.reset() try: client = connect_and_subscribe() except OSError as e: restart_and_reconnect() while True: try: # client.check_msg() if (time.time() - last_message) > message_interval: dict = {} dict['time'] = get_jst() dict['sensorType'] = 'DHT11' d.measure() dict['Temperature'] = d.temperature() dict['humidity'] = d.humidity() msg = ujson.dumps(dict) topic = 'DHT11' print(topic+':'+msg) # debug client.publish(topic, msg) last_message = time.time() counter += 1 except OSError as e: restart_and_reconnect()

実行画面

ESP32/SP8266のMicroPython側は MQTT_DHT_send.py を実行し、
受信側は 「python PY_MQTT_DHT_recv.py」を実行すると
以下のような実行画面になる:

ホストPCのシェル画面:

$ python PY_MQTT_DHT_recv.py watch DHT11 DHT11: time: 2020/3/6 21:56:0 Temperature: 18 Humidity: 13 --------------------------- DHT11: time: 2020/3/6 21:56:2 Temperature: 18 Humidity: 13 --------------------------- ...

おまけ(pythonの受信/送信サンプル)

送信サンプル:
PY_publisher.py

#!usr/bin/env python # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt client = mqtt.Client() #client.connect('5.196.95.208', 1883, keepalive=60) client.connect('test.mosquitto.org', 1883, keepalive=60) for n in range(24): client.publish('test/topic', 'hello world #'+str(n))

受信側サンプル:
PY_subsriber.py

#!usr/bin/env python # -*- coding: utf-8 -*- import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, respons_code): topic = 'test/topic' print('watch %s' % topic) client.subscribe(topic) def on_message(client, userdata, msg): print(msg.topic + ' ' + str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message #client.connect('5.196.95.208', 1883, keepalive=60) client.connect('test.mosquitto.org', 1883, keepalive=60) client.loop_forever()

参考情報

paho-mqtt 1.5.0

MQTT.js

MQTT test server @mosquitto.org
The server listens on the following ports:
1883 : MQTT, unencrypted
8883 : MQTT, encrypted
8884 : MQTT, encrypted, client certificate required
8080 : MQTT over WebSockets, unencrypted
8081 : MQTT over WebSockets, encrypted

MQTT test server @eclipse.org
This is a public test MQTT broker service.
It currently listens on the following ports:
1883 : MQTT over unencrypted TCP
8883 : MQTT over encrypted TCP
80 : MQTT over unencrypted WebSockets (note: URL must be /mqtt )
443 : MQTT over encrypted WebSockets (note: URL must be /mqtt )

10 Free Public & Private MQTT Brokers(For Testing & Production)
http://www.mqtt-dashboard.com/
MQTT is a machine-to-machine (M2M)/"Internet of Things"

ESP32/ESP8266のMicroPythonでMQTTを使ってみた
MQTT(over WebSocket)をブラウザーで使ってみた

MicroPython – Getting Started with MQTT on ESP32/ESP8266

ESP32-DevKitC ESP-WROOM-32開発ボード
MicroPython - Quick reference for the ESP32
Streaming Data from ESP32 using MicroPython and MQTT
ampyを用いたMicroPythonのファイル操作とプログラム実行

以上

|

« ESP32/ESP8266のMicroPythonでRTCを現在時刻に合わせる方法 | トップページ | ESP8266のMicroPythonに温度センサーTMP102(i2c)を接続する »

linux」カテゴリの記事

MicroPython」カテゴリの記事

MQTT」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« ESP32/ESP8266のMicroPythonでRTCを現在時刻に合わせる方法 | トップページ | ESP8266のMicroPythonに温度センサーTMP102(i2c)を接続する »