Makato-kanのアイコン画像
Makato-kan 2022年04月01日作成 (2022年04月03日更新)
製作品 製作品 閲覧数 1256
Makato-kan 2022年04月01日作成 (2022年04月03日更新) 製作品 製作品 閲覧数 1256

使い道はさておき SeeeduinoXIAOにEthertnet付けてMQTTで温度湿度送信する

使い道はさておき SeeeduinoXIAOにEthertnet付けてMQTTで温度湿度送信する

漠然と、無線LANよりイーサネット接続の方が消費電流少ないとおもったので、
SpeeeduinoXIAOにイーサネットアダプタをつけて
温度・湿度測定した値をMQTT送信出来るようにしたのを作ってみました。

概要:

SpeeeduinoXIAOにENC28J60イーサネットアダプタをSPI接続し、
DHT11温度・湿度センサーを1Wire接続しています。
DHT11にはデータ線にプルアップ抵抗必要なので10kΩの抵抗をつけます。

プログラムはイーサネットを利用可能にした後、センサー値を読み取り、
MQTTでブローカー(ラズベリーパイ)に送信しています。

部品表:

Seeeduino XIAO
 ENC28J60 イーサネットアダプタ 
 DHT11 温度・湿度センサー
 プルアップ用10kΩ抵抗
 モバイルバッテリー

回路図:

キャプションを入力できます

DHT11 XIAO 備考
VCC 3.3V
DATA D3 変更するならプログラム修正する
ENC28J60 XIAO VCCは3.3Vでも動作しました。
VCC 5V ENC28J60は3.3V LDR付
CS D1 変更するならプログラム修正する
SCK D8
SO D9
SI D10

プログラム:

ArduinoIDEを使っています。
 XIAOは”追加のボードマネージャー”に以下のURLを追記して設定します。

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

DHT11は"ライブラリを管理"でDHT11を検索し"DHT sensor library by Adafrut"をインストールします。
 ENC28J60は”ENC28J60”で検索し"EthernetENC by Notbert,Juraj,,," をインストールします。

XIAO-DHT11-ENC28J60.ino

#include "EthernetENC.h" #include <PubSubClient.h> #include <DHT.h> //ENC28J60 #define USE_THIS_SS_PIN 1 #define MODULE "ENC28J60" byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //ENC28J60 //DHT11 DHT 22 (AM2302) DHT 21 (AM2301) #define DHTPIN 3 #define DHTTYPE DHT11 // DHT 11 DHT22 DHT21 DHT dht(DHTPIN, DHTTYPE); //DHT11 //MQTT const char* mqttServer = "192.168.0.XXX"; // Broker address const int mqtt_port = 1883; const char* mqtt_user = "USER-NAME"; const char* mqtt_password = "USER-PASSWD"; const char* MQTT_ID = "XIAO-ENC28J60"; // Name of our device, must be unique #define dht11_topic "sensor/dht11" #define dht11_topic2 "sensor/dummy-110" #define TIMER_SET 10 //10 x 15 = 2.5min //MQTT void callback(char* topic, byte* payload, unsigned int length) { } EthernetClient ethClient; PubSubClient client(mqttServer, mqtt_port, callback, ethClient); void setup() { dht.begin(); // Serial.begin(115200); // while (!Serial); //ENC28J60 delay(10); Ethernet.init(USE_THIS_SS_PIN); Ethernet.begin(mac); // Serial.print(F("Connected! IP address: ")); // Serial.println(Ethernet.localIP()); delay(10); client.setServer(mqttServer, mqtt_port); client.setCallback(callback); // Allow the hardware to sort itself out delay(10); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { // Serial.println("Attempting MQTT connection..."); delay(10); if (client.connect(MQTT_ID,mqtt_user,mqtt_password)) { // Serial.println("connected"); } else { // Serial.print("failed with state "); // Serial.println(client.state()); // Wait 5 seconds before retrying delay(5000); } } } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { // Serial.println("Failed to read from DHT sensor!"); return; } if (!client.connected()) { reconnect(); } if(!client.loop()) { client.connect(MQTT_ID,mqtt_user,mqtt_password); } delay(100); String data = ""+String(t)+","+String(h); Serial.println(data); delay(500); client.publish(dht11_topic, data.c_str(), false); delay(500); // Wait uint8_t count; // 15Sec x TIMER_SET for( count=0; count<TIMER_SET; count++) { delay(15000); client.publish(dht11_topic2,"", false); delay(1000); } delay(100); }

※DHT11のデータピンとENC28J60のCSピン接続ピン変更は以下の箇所変更すれば良い。
 #define DHTPIN 3 
 #define USE_THIS_SS_PIN 1
 測定間隔は TIME_SET の値を変更します。

MQTTについて:

XIAOはMQTTのパブリッシャー(送信者)で ブロカーにデータを送信します。
ブローカーはサブスクライバー(受信者)にデータを送信し、サブスクライバーが
データを受け取る仕組みです。
私はラズベリーパイにブローカーとサブスクライバーをデータ受信時に受信時刻が記録できるよう設定してXIAOからのデータを受信するようにしています。

肝心な所だけMQTTの設定:

ラズベリーパイ(rasbian)にmosquitto-clients とmosquittoをインストールします。

sudo apt install mosquitto-clients mosquitto

エディタで平文パスワードファイルを作成します。ファイル名password.txtで中身は以下の通り

USER-NAME:USER-PASSWD

暗号化コマンドでそのファイルを暗号化します。中を見ると暗号化されています。

mosquitto_passwd -U password.txt

暗号化終了したファイルを/etc/mosquittoにコピーします。
/etc/mosquitto/mosquitto.confを編集して暗号化パスワードファイルの位置等を書き込みます

#allow_anonymous true
allow_anonymous false
password_file /etc/mosquitto/password.txt

終わったらmosquittoを再起動します

sudo systemctl restart mosquitto

データの受信:

ラズベリーパイで以下のコマンドを実行します。

$mosquitto_sub -h 192.168.0.xxx -u USER-NAME -P USER-PASSWD -t sensor/dht11 -F '@Y,@m,@d,"@H:@M",%p'

データ受信すると 受信時刻と測定値が表示されます。
受信例 2022,04,01,"16:29",17.60 54.00

※ファイル保存したい場合。※毎回使いたいならこのコマンドを/etc/rc.localに追加します。

mosquitto_sub -h 192.168.0.xxx -u USER-NAME -P USER-PASSWD -t sensor/dht11 -F '@Y,@m,@d,"@H:@M",%p'  >>/home/pi/DHT11.log

ちょっとした事:

1,XIAOはシリアル出力の設定をしたままだとモバイルバッテリーでプログラム起動しませんでした。
 シリアル出力系のコメント外して動作確認時終了したら、コメントにしてモバイルバッテリーに接続すると良いです。
 2,測定はTIME_SETで間隔を指定しています。実際の所20秒間隔以上にすると動作しなくなったので、ダミー送信を15秒に一回するようにしています。ダミーでも本当に送信しているので、ダミーの方のトピックを指定すれば15秒に一回送信しているのが見えます。

MACアドレスについて:

このプログラムサンプルに書かれているMACADDRESSはArduinoIDEのサンプルプログラムに書かれていたものです。
 とても厳格に実施するなら、もう使っていないイーサネットアダプタや廃棄パソコンから
MACADDRESSを拾って割り当てると良いかと思います。

最後に:

無線接続より消費電流低いと思い作ってみましたが、思いのほか消費電流が多い事 (常時160mA位消費している)なので、ブレッドボード試作で終了しました。
プログラムはネットで検索したものを組み合わせしました、いろいろな方に感謝です。
 キャプションを入力できます

1
Makato-kanのアイコン画像
屋外で温度湿度を測定し記録するので、壊れやすいと思い大量にDHT11とESP-WROOM-02を購入したのですが思いのほか壊れなかったので、何にでもDHT11をくっつけています。
ログインしてコメントを投稿する