温度差が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電源で動作するものが手元にあったので使いました。アマゾンですとこんなやつです。
3.6V電源はhttps://www.marutsu.co.jp/contents/shop/marutsu/datasheet/lm317t.pdfの回路図を使用しました。
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
さんが
2024/01/30
に
編集
をしました。
(メッセージ: 初版)
-
Makato-kan
さんが
2024/04/02
に
編集
をしました。
-
Makato-kan
さんが
2024/04/02
に
編集
をしました。
ログインしてコメントを投稿する