編集履歴一覧に戻る
Makato-kanのアイコン画像

Makato-kan が 2022年04月01日16時53分11秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

XIAO

+

DHT11

+

ethernet

+

MQTT

+

ENC28J60

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

SpeeeduinoXIAOはSPIが使えるので、手持ちにあったイーサネットアダプタをつけて 温度・湿度測定した値をMQTT送信してみました。 消費電流は常時160mA位流れるので、昔のスマホ用充電アダプタ等今となっては 出力電流低くて使えない充電器があれば十分動作します。 出力はカンマ区切りの値なので受信側で時刻をくっつけて保存すれば エクセルなんかでもグラフ化簡単です。 **概要** SpeeeduinoXIAOにENC28J60イーサネットアダプタをSPI接続し、 DHT11温度・湿度センサーを1Wire接続しています。 DHT11にはデータ線にプルアップ抵抗必要なので10kΩの抵抗をつけます。  プログラムはイーサネットを利用可能にした後、センサー値を読み取り、 MQTTでブローカー(ラズベリーパイ)に送信しています。 **部品表**  Seeeduino XIAO  ENC28J60 イーサネットアダプタ   DHT11 温度・湿度センサー  プルアップ用10kΩ抵抗  モバイルバッテリー **回路図** ![キャプションを入力できます](https://camo.elchika.com/a858dbfc5e33218d13481bddfe0f6053cda5895e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f62616436643530652d363563372d343135362d383235302d373837623161633038333138/) | 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,,," をインストールします。 ```arduino: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からのデータを受信するようにしています。 また受信したデータはファイルとして保存してあるので、crontabを使って 必要な分を取り出して外部に送信しブラウザでグラフとして見えるようにしています。 **肝心な所だけ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位消費している)なので、ブレッドボード試作で終了しました。  プログラムはネットで検索しました、いろいろな方に感謝です。  ![キャプションを入力できます](https://camo.elchika.com/7ee45b1de7086f273741eb5606b465094e32647d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f37383362363964342d613531392d343634362d616230392d626533643962313635633437/)