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

Makato-kan が 2024年01月30日08時51分40秒 に編集

初版

タイトルの変更

+

温度差が3度以上あればファンを動かして、快適な部屋にしたい。

タグの変更

+

SPRESENSE

+

DHT11

+

W5500

+

ethernet

+

MQTT

記事種類の変更

+

製作品

本文の変更

+

#### 概要: ”暖かい空気は軽く、冷たい空気は重い”このことを 踏まえて 部屋の温度環境を知り、改善できるか というやつを作りました。 #### 写真:  ![機能部](https://camo.elchika.com/57f64e0c30f07d13cb80cb009ffc9ddf2bbf3c50/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f34363233336435622d373036652d343464612d626462312d663731323839383830316261/) ![本体全景](https://camo.elchika.com/8e8bbfa3bf3fbd4765ee8352386cddfd628f6289/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f31376636333965662d393336322d343633632d393463392d633932363539356363393035/) #### ハードウェア:  ソニー スプレセンス メイン基板 elchika様よりご提供いただきました。  W5500 イーサネット基板      elchika様よりご提供いただきました。  DHT11 3個  120mmPCケース用FAN 1個 DC12Vで動作します。  リレー(互換品のarduino用リレー基板です。5V電源で動作します  電源:ACアダプタを使いDC12V    LDRを使いDC5V(リレー基板用)    出力電圧可変のLDRを使いDC3.6V(スプレセンス本体用)を作っています #### 動作の仕様:  部屋の上と下の温度差が3度以上ならファンを運転する  そして2分おきに状態を調べてMQTTサーバーに温湿度データを送信する #### 回路概要:  DHT11を3つ接続し、電源はスプレセンスの3.3Vを使います。  ファンは12V DCアダプタを使い リレー基板(5V)でON/Off操作します。  ちなみにディープスリープを使うとファンが停止してしまうのでdelay()で 1分毎に温度測定しています。 #### 電源について:  DC12VのアダプタをPOEもどきのアダプタケーブル使い機能部に供給しております #### 回路図: 本体はスプレセンスメインボードにW5500イーサネット基板をつけて、以下のピンヘッダーを使いました。  3.3VとGND DHT11用電源  D00,D01,D27をDHT11のデータ用に使います。  D20をリレーの操作に使います。  リレー基板は5V電源で動作するものが手元にあったので使いました。アマゾンですとこんなやつです。 ![5Vリレーモジュール](https://camo.elchika.com/757d0bad481982f77a4c6ae7251b239c347e1bc5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f63646433343938642d366264322d346466342d613130362d363065363032303732623936/)    3.6V電源はhttps://www.marutsu.co.jp/contents/shop/marutsu/datasheet/lm317t.pdfの回路図を使用しました。 ![3.6V電源部](https://camo.elchika.com/9302c01810b2b94781f91844cc776e67d701e2d5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f33333363663462312d623936372d346262352d613565362d333562323338626139373661/) 5V電源はhttps://www.nisshinbo-microdevices.co.jp/en/pdf/datasheet/NJU7223_E.pdfのテスト回路で作りました。 ![キャプションを入力できます](https://camo.elchika.com/427d83d63be0760672142aabae5fe7fbb9097583/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f66373831653764372d303336352d343131662d613663362d3663623238333931346464342f31383237316232652d326231362d346338622d616662662d386263646265626366336332/)  ファンはDC12Vアダプタをリレー経由で駆動します。 ちょっとした事 回路を自作した時はポリヒューズ等の保護部品を組み込んでおくと、後悔する事が減ります。 #### プログラム本体:  MQTTのパスワード等はMQTT-config.hとして別ファイルにしました。 ```3度違えばFANを動かす // ----------------------------------------------------------------------- // #include "MQTT-config.h" void callback(char* topic, byte* payload, unsigned int length) { } EthernetClient ethClient; PubSubClient client(mqttServer, mqtt_port, callback, ethClient); // ----------------------------------------------------------------------- // //Add-onボード搭載EEPROMへのアクセス用 M24C64 eep; // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- // //Add-onボード用のSPIはSPI5となるため、本ライブラリ使用時は以下の定義が必要(socket.cpp内にて使用) //参考:https://developer.sony.com/develop/spresense/docs/arduino_developer_guide_ja.html#_spi_%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA #define USE_SPRESENSE_SPI5 // ----------------------------------------------------------------------- // // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x98, 0x01 }; IPAddress ip(192, 168, 0, 240); // Initialize the Ethernet server library // with the IP address and port you want to use // (port 80 is default for HTTP): bool isI2C(uint8_t address) { Wire.beginTransmission(address); if (Wire.endTransmission() == 0) { return true; } return false; } void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // ----------------------------------------------------------------------- // // W5500-Ether用の初期化方法 digitalWrite(21, LOW);//W5500_Eth RESET# = HIGH delay(500); digitalWrite(21, HIGH);//W5500_Eth RESET# = HIGH Serial.println("W5500 reset done."); Ethernet.init(19);// use I2S_DIN pin for W5500 CS pin // ----------------------------------------------------------------------- // Serial.println("DHT11x3 Servo FAN"); delay(100); // ----------------------------------------------------------------------- // // W5500-Ether用のMACアドレス取得処理 // I2C device scan Serial.print(F("I2C Devices(0x) : ")); Wire.begin(); //I2C spec. have reserved address!! these scanning escape it address. for (uint8_t ad = 0x08; ad < 0x77; ad++) { if (isI2C(ad)) { Serial.print(ad, HEX); Serial.write(' '); } } Serial.write('\n'); //EEPROM MAC ADDRESS read eep.init(0x57); Serial.println("MAC read from on board eeprom."); for(int i=0;i<6;i++) { mac[i] = eep.read(i); Serial.print(mac[i],HEX); Serial.print(":"); } Serial.println(""); // ----------------------------------------------------------------------- // // start the Ethernet connection and the server: Ethernet.begin(mac, ip); // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) { Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) { delay(1); // do nothing, no point running without Ethernet hardware } } if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); } delay(100); //DHT11の初期化 pinMode(DHTPIN1, INPUT_PULLUP); delay(25); dht1.begin(); delay(25); pinMode(DHTPIN2, INPUT_PULLUP); delay(25); dht2.begin(); delay(25); pinMode(DHTPIN3, INPUT_PULLUP); delay(25); dht3.begin(); delay(25); //DHT11の初期化 } 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.print("connected"); delay(1000); Serial.println(" MQTT Broker"); } else { Serial.print("failed with state "); Serial.println(client.state()); //Wait 5 seconds before retrying delay(5000); } } } void loop() { float h1 = dht1.readHumidity(); float t1 = dht1.readTemperature(); if (isnan(h1) || isnan(t1)) { Serial.println("Failed to read from DHT1 sensor!"); return; } delay(18); float h2 = dht2.readHumidity(); float t2 = dht2.readTemperature(); if (isnan(h2) || isnan(t2)) { Serial.println("Failed to read from DHT2 sensor!"); return; } delay(18); float h3 = dht3.readHumidity(); float t3 = dht3.readTemperature(); if (isnan(h3) || isnan(t3)) { Serial.println("Failed to read from DHT3 sensor!"); return; } //ファンの運転 if (max(dht1.readTemperature() , dht2.readTemperature()) - min(dht1.readTemperature() , dht2.readTemperature() ) > 3){ digitalWrite(RelayPIN1, HIGH); FANvalu = "FAN-ON-HIGH"; delay(100);} else {digitalWrite(RelayPIN1, LOW); FANvalu = "FAN-OFF"; delay(500); } //ファンの運転 //MQTT送信 Serial.println("data transfer by MQTT"); if (!client.connected()) { reconnect(); } if(!client.loop()) { client.connect(MQTT_ID,mqtt_user,mqtt_password); } delay(200); String data = ""+String(t3)+","+String(h3)+", "+String(t1)+","+String(h1)+", "+String(t2)+","+String(h2)+", "+String(FANvalu); delay(800); Serial.println(data); delay(600); client.publish(dht11_topic, data.c_str(), false); delay(60000);//1分待つんだぞ //MQTT送信 } ``` #### インクルードファイル:  名前は MQTT-config.hとしてプログラム本体と同じフォルダにいれてくださいませー ``` /*各種設定のヘッダーファイル MQTTの設定は最後にあるで 使用するピン Ethernet SPI-5 D21 D19 DHT11 D00 D01 D27   ※D25 D26使うとW5500作動しなかった Fan control D20 */ #include <SPI.h> #include <PubSubClient.h> #include <DHT.h> // ----------------------------------------------------------------------- // //Add-onボード用インクルード #include "src/Ethernet.h" #include "src/M24C64.h" //Add-onボード用インクルード //DHT11 #define DHTTYPE DHT11 #define DHTPIN1 00 //上 #define DHTPIN2 01 //下 #define DHTPIN3 27 //中央 DHT dht1(DHTPIN1,DHTTYPE); DHT dht2(DHTPIN2,DHTTYPE); DHT dht3(DHTPIN3,DHTTYPE); //DHT11 //リレーピン #define RelayPIN1 20 char* FANvalu = "FAN-???"; //リレーピン //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 = "DHT11-x3FAN"; // Name of our device, must be unique #define dht11_topic "sensor/dht11" #define TIMER_SET 12 //12 x 15 = 3min //MQTT ``` #### 開発環境  ArduinoIDE  はんだごて、ニッパー、ラジオペンチ、テスター、カッターナイフ #### 本体  1x1,1800mmの木材3本  5mmのスチレンボードを加工し、基板はセロハンテープで固定しました。 #### MQTTで送信した情報例 ※時刻はデータ受信側で付加しています。 $tail DHT11.log 2024,01,26,"19:03",16.50,74.00, 18.50,74.00, 14.60,78.00, FAN-ON-HIGH 2024,01,26,"19:04",16.30,72.00, 18.40,74.00, 15.30,76.00, FAN-ON-HIGH 2024,01,26,"19:05",15.90,73.00, 18.30,74.00, 15.50,75.00, FAN-OFF 2024,01,26,"19:06",15.60,74.00, 18.20,75.00, 15.50,74.00, FAN-OFF 2024,01,26,"19:07",15.60,74.00, 18.10,74.00, 15.00,74.00, FAN-ON-HIGH 2024,01,26,"19:08",15.80,74.00, 18.00,75.00, 14.50,76.00, FAN-ON-HIGH