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

温度差が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をくっつけています。
ログインしてコメントを投稿する