Makato-kanのアイコン画像
Makato-kan 2024年01月30日作成 (2024年04月02日更新)
製作品 製作品 閲覧数 298
Makato-kan 2024年01月30日作成 (2024年04月02日更新) 製作品 製作品 閲覧数 298

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

概要:

”暖かい空気は軽く、冷たい空気は重い”このことを
踏まえて 部屋の温度環境を知り、改善できるか
というやつを作りました。
 とりあえずの動作確認だけでしたので、見栄えは悪いです。

写真:

機能部

本体全景

ハードウェア:

ソニー スプレセンス メイン基板 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リレーモジュール
 
 3.6V電源はhttps://www.marutsu.co.jp/contents/shop/marutsu/datasheet/lm317t.pdfの回路図を使用しました。
3.6V電源部
5V電源はhttps://www.nisshinbo-microdevices.co.jp/en/pdf/datasheet/NJU7223_E.pdfのテスト回路で作りました。
キャプションを入力できます
 ファンはDC12Vアダプタをリレー経由で駆動します。

ちょっとした事 回路を自作した時はポリヒューズ等の保護部品を組み込んでおくと、後悔する事が減ります。

プログラム本体:

MQTTのパスワード等はMQTT-config.hとして別ファイルにしました。

// ----------------------------------------------------------------------- // #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

最後に

夏場の室内環境を快適にするため、バージョンアップするかもです。

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