Makato-kan が 2022年04月03日08時47分49秒 に編集
コメント無し
本文の変更
漠然と、無線LANよりイーサネット接続の方が消費電流少ないとおもったので、 SpeeeduinoXIAOにイーサネットアダプタをつけて 温度・湿度測定した値をMQTT送信出来るようにしたのを作ってみました。
## 概要:
### 概要:
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について:
### MQTTについて:
XIAOはMQTTのパブリッシャー(送信者)で ブロカーにデータを送信します。 ブローカーはサブスクライバー(受信者)にデータを送信し、サブスクライバーが データを受け取る仕組みです。 私はラズベリーパイにブローカーとサブスクライバーをデータ受信時に受信時刻が記録できるよう設定してXIAOからのデータを受信するようにしています。
## 肝心な所だけMQTTの設定:
### 肝心な所だけ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アドレスについて:
### MACアドレスについて:
このプログラムサンプルに書かれているMACADDRESSはArduinoIDEのサンプルプログラムに書かれていたものです。 とても厳格に実施するなら、もう使っていないイーサネットアダプタや廃棄パソコンから MACADDRESSを拾って割り当てると良いかと思います。
## 最後に:
### 最後に:
無線接続より消費電流低いと思い作ってみましたが、思いのほか消費電流が多い事 (常時160mA位消費している)なので、ブレッドボード試作で終了しました。 プログラムはネットで検索したものを組み合わせしました、いろいろな方に感謝です。 ![キャプションを入力できます](https://camo.elchika.com/7ee45b1de7086f273741eb5606b465094e32647d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f37383362363964342d613531392d343634362d616230392d626533643962313635633437/)