使い道はさておき 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位消費している)なので、ブレッドボード試作で終了しました。
プログラムはネットで検索したものを組み合わせしました、いろいろな方に感謝です。
投稿者の人気記事
-
Makato-kan
さんが
2022/04/01
に
編集
をしました。
(メッセージ: 初版)
-
Makato-kan
さんが
2022/04/01
に
編集
をしました。
(メッセージ: 目次をつけてみました。)
-
Makato-kan
さんが
2022/04/02
に
編集
をしました。
(メッセージ: 文章の手直し。)
-
Makato-kan
さんが
2022/04/03
に
編集
をしました。
ログインしてコメントを投稿する