地下室/クロールスペース換気システム
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> ![]() |
|
このプロジェクトについて
機能リスト
- 内部/外部温度/湿度センサー。
- 水分比較によるスマートベントファン制御
- 地下室/クロールスペースの湿気を減らします
- カビの成長を抑えるのに役立ちます
- スマート換気は電力を節約します

換気システムを構築するために必要な部品
- IOエキスパンダー
- 1-I2Cに配線します。
- ArduinoNano。
- 1チャンネルDC5Vリレー。
- x2SHT10湿度センサー。
- I2C SSD1306 OLED128x64ディスプレイ。
- x2 110V 172x150x38mm 0.34A 2400RPMボールベアリングファン。
- 158x90x65mmの透明な防水プラスチックエンクロージャ。
- ip68pg7防水ナイロンケーブルグランド。
- ip68pg9防水ナイロンケーブルグランド。
- x2RJ11キーストーンネジ留め式端子ジャック。
- x2キーストーンエンクロージャー。
- x2 50ft 4C4PRJ11ワイヤー。
- 6 "4C4PRJ11ワイヤー。
- 100フィート110Vワイヤー。
- ACプラグ。
- 2.54mmヘッダーワイヤー。
- 12VDC1Aウォールアダプター電源。
配線図 <図>

OLEDディスプレイ <図>

では、なぜIOエキスパンダーを使用するのですか?
- 設計が簡単
- 既製の部品
- 書き込む1-Wireドライバーはありません
- 書き込むリレードライバーはありません
- 書き込むOLEDディスプレイドライバーはありません
- Arduinoコードスペースを取るための表示フォントはありません
- 湿度センサードライバーを作成する必要はありません
- Arduinoのコードスペースを節約します。わずか6106バイト(19%)
- コードを書くのに1日もかかりません
- 標準のRJ11電話ケーブルを使用して簡単に配線できます
- センサーケーブルの長さの問題はありません
- 商用システムよりも構築が安価
- 個々の要件に合わせて簡単に変更できます
- 単一電源
システムを構築する
ArduinoNanoをIOExpanderに接続し、次のコードでプログラムします。 6ピンヘッダーはソフトウェアのシリアルデバッグポートであり、最終的なインストールでは必要ありません。
<図>
ONEWIRE_TO_I2C_ROMで定義されたアドレスを、1-WireをI2Cアドレスに一致するように変更してください。
/ * IO Expander
*
* Basement / Crawlspace Ventilation System v1.1
*
* /
#include
#include
#include
#include "IOExpander.h"
#define FAHRENHEIT
#define ONEWIRE_TO_I2C_ROM "i4s71"
#define INIT_OLED "st13; si; sc; sd"
#define HUMIDITY_SENSOR_INSIDE "s6t1"
#define HUMIDITY_SENSOR_OUTSIDE "s8t1"
#define FAN_ON "r1o"
#define FAN_OFF "r1f"
#define ABSOLUTE_DELTA_FAN_ON 1 //内側の絶対湿度デルタ> =外側の場合はファンオン
#define ABSOLUTE_DELTA_FAN_OFF 0.5 //場合はファンオフ内側の絶対湿度デルタ<=外側
#define OUTSIDE_RELATIVE_FAN_ON 88 //外側の相対湿度が<=%の場合はファンオン
#define OUTSIDE_RELATIVE_FAN_OFF 90 //外側の相対湿度が> =%の場合はファンオフ
#define MINIMUM_TEMPERATURE 15 // oの場合、ベントのオン/オフを繰り返します外気温<=15C / 59F
#define FAN_ON_TIME(20 * 60 * 1000L)// 20分
#define FAN_OFF_TIME(20 * 60 * 1000L)// 20分
//#define SERIAL_DEBUG
#define SERIAL_TIMEOUT 5000 // DHT22読み取り間の5秒の遅延
#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
# endif
struct HS {
float temp;
float Relative;
float Absolute;
bool error;
};
int led =13;
bool init_oled =true;
long ontime、offtime;
#ifdef FAHRENHEIT
#define C2F(temp)CelsiusToFahrenheit( temp)
float CelsiusToFahrenheit(float celsius)
{
return((celsius * 9)/ 5)+32;
}
#else
#定義C2F(temp)(temp)
#endif
void SerialPrint(const char * str、float decimal、char error)
{
Serial.print(str );
if(error)Serial.print(F( "NA"));
else Serial.print(decimal、1);
}
float DewPoint(float temp、フロート湿度)
{
float t =(17.625 * temp)/(243.04 + temp);
float l =log(humidity / 100);
float b =l + t;
// August-Roche-Magnus近似を使用
return(243.04 * b)/(17.625-b);
}
#define MOLAR_MASS_OF_WATER 18.01534
#define UNIVERSAL_GAS_CONSTANT 8.21447215
float AbsoluteHumidity(float temp、float Relative)
{
//https://carnotcycle.wordpress.com/2012/から取得08/04 / how-to-convert-relative-hu midity-to-absolute-humidity /
//精度は-30から35°Cの範囲で約0.1°C
// 8月-ロシュ-Magnus 6.1094 exp(17.625 x T)/(T + 243.04)
// Buck(1981)6.1121 exp(17.502 x T)/(T + 240.97)
//参照https:// www .eas.ualberta.ca / jdwilson / EAS372_13 / Vomel_CIRES_satvpformulae.html // Buck(1981)を使用
return(6.1121 * pow(2.718281828、(17.67 * temp)/(temp + 243.5))* Relative * MOLAR_MASS_OF_WATER) /((273.15 + temp)* UNIVERSAL_GAS_CONSTANT);
}
voi d ReadHumiditySensor(HS * hs)
{
SerialCmd( "sr");
if(SerialReadFloat(&hs-> temp)&&
SerialReadFloat(&hs-> relative)){
// hs-> dewpoint =DewPoint(hs-> temp、hs-> relative);
hs-> abstract =AbsoluteHumidity(hs-> temp、hs-> relative);
hs-> error =false;
}
else hs-> error =true;
SerialReadUntilDone();
}
void setup(){
Serial.begin(115200);
#ifdef SERIAL_DEBUG
swSerial.begin(115200);
// swSerialEcho =&swSerial;
#endif
pinMode (led、OUTPUT);
wdt_enable(WDTO_8S);
offtime =millis()-FAN_OFF_TIME;
}
void loop(){
HS内部、外部;
static bool fan =false;
static bool cycle =false;
static long last_time =-(60L * 1000L);
Serial.println ();
if(SerialReadUntilDone()){
//湿度センサーを1分に1回だけ読み取るか、読み取りが速すぎると自己発熱します
if(millis()-last _time> 60L * 1000L)
{
if(SerialCmdDone(HUMIDITY_SENSOR_INSIDE))
ReadHumiditySensor(&inside);
if(SerialCmdDone(HUMIDITY_SENSOR_OUTSIDE))
ReadHumiditySensor(&outside);
if(inside.error || Outside.error)fan =false;
else {
if(fan){
if(outside.relative> =OUTSIDE_RELATIVE_FAN_OFF || inside.absolute --outside.absolute <=ABSOLUTE_DELTA_FAN_OFF)
cycle =fan =false;
else {
if(cycle &&external.temp <=MINIMUM_TEMPERATURE &&
millis()-ontime> FAN_ON_TIME)fan =false;
}
if(!fan)offtime =millis();
}
else {
if(outside.relative <=OUTSIDE_RELATIVE_FAN_ON &&inside.absolute --outside.absolute> =ABSOLUTE_DELTA_FAN_ON)
cycle =fan =true;
if(cycle &&outside.temp <=MINIMUM_TEMPERATURE)
fan =(millis()-offtime> FAN_OFF_TIME)? true:false;
if(fan)ontime =millis();
}
}
if(fan)SerialCmdDone(FAN_ON);
else SerialCmdDone(FAN_OFF);
if(SerialCmdNoError(ONEWIRE_TO_I2C_ROM)){
if(init_oled){
SerialCmdDone(INIT_OLED);
init_oled =false;
}
SerialCmdDone( "st13; sc; sf0; sa1; sd70,0、\" INSIDE \ "; sd127,0、\" OUTSIDE \ "; sf1; sa0; sd0,12,248、\" "
#ifdef FAHRENHEIT
"F"
#else
"C"
#endif
"\"; sd0,30、\ "%\"; sf0; sd0,50、\ "g / m \"; sd20,46、\ "3 \"; ");
SerialPrint(" sf1; sa1; sd70,12、\ ""、C2F(inside.temp )、inside.error);
SerialPrint( "\"; sd70,30、\ ""、inside.relative、inside.error);
SerialPrint( "\"; sd70,48、\ " "、inside.absolute、inside.error);
SerialPrint(" \ "; sd127,12、\" "、C2F(outside.temp)、outside.error);
SerialPrint(" \ "; sd127,30、\ ""、outside.relative、outside.error);
SerialPrint( "\"; sd127,48、\ ""、outside.absolute、outside.error);
Serial.print( "\"; ");
Serial.print(" sf0; sa0; sd0,0、\ "");
if(fan)Serial.print( "FAN");
else Serial.print( "v1.1");
シリアル。 println( "\"; sd ");
SerialReadUntilDone();
}
else init_oled =true;
last_time =millis();
}
delay(1000);
}
else {
digitalWrite(led、HIGH);
delay(500);
digitalWrite (led、LOW);
delay(500);
init_oled =true;
}
wdt_reset();
}
注: USBポートを使用してArduinoNanoをプログラムする場合は、IO Expanderから切断する必要があります。これは、同じ単一のシリアルポートも使用しているためです。代わりに、デバッグする場合は、ICSPポートを使用してATmega328Pをプログラムします。ソフトウェアデバッグポートを有効にするには、SERIAL_DEBUG定義のコメントを解除します。
110VACワイヤを両方のファンに接続します。
<図>
PG7およびPG9用に、エンクロージャーの両側に7/16 "および9/16"の穴を開けます。ドレメルツールを使用して、グランドがぴったり合うまで穴を少し拡大します。 PG7は12VDC入力電圧を供給し、PG9はセンサーとファンに供給します。
<図>
開いていて塞がれていない通気口を見つけます。これは、地下室/クロールスペースの空気を吹き飛ばす排気ガスになります。反対側の他のすべての通気口が開いていることを確認してください。これらは空気取り入れ口になります。隣接する通気口を閉じて、地下室/クロールスペース全体に局所的な空気の流れではなく、局所的な空気の流れを作成します。
<図>
タイラップを使用して、通気孔の内側にファンを取り付けます。ファンが空気を吹き出すために正しい方向を向いていることを確認してください。
<図>
既存のアクセスポイントを見つけて、外側の湿度センサーワイヤーを内側に通します。周囲の温度/湿度を正確に測定できるように、湿度センサーが家や障害物から十分に離れていることを確認してください。ローカルで公開されている天気予報と照らし合わせて測定値を確認します。
<図>
外側の湿度センサーをキーストーンジャックとエンクロージャーに配線し、内側に取り付けます。
<図>
内部湿度センサーをキーストーンジャックとエンクロージャーに配線し、内部に取り付けます。追加の湿気制御が必要な中央の場所またはエリアが望ましいです。
<図>
50フィートのRJ11ワイヤーを湿度センサーに接続し、ファンワイヤーを使用して、コントロールエンクロージャーが設置される利用可能なアクセスポイントにワイヤーを配線します。
<図>
すべてのワイヤーを接続し、すべての部品を組み立て/制御エンクロージャーに送ります。 50フィートのRJ11ワイヤに圧着済みのコネクタが付属している場合は、ワイヤをグランドに通して新しいコネクタを圧着するために、それらを切断する必要があります。
<図>
システムをテストし、すべてが正しく動作していることを確認します。リレーとファンをテストするには、ArduinoをIO Expanderから切断し、コンピューターに直接接続して手動で制御します。すべてが動作していることを確認したら、両面テープとパッキングフォームを使用してすべての部品をエンクロージャに組み立て、ボードを固定し、スマート水分制御換気システムの利点と節約を享受します
2019年3月20日更新
過去数か月間、クロールスペースで換気システムを稼働させた後、ハングがゼロで、給湯器からの漏れ後のピーク相対湿度が95%を超えた後、相対湿度を50%未満に下げることに成功しました。換気システムは、機能する継続的な制御システムです!
<図>
SSD1306 0.96 "OLEDディスプレイからSH11061.3" OLEDディスプレイに切り替えました。それははるかに大きくて読みやすいです。 IOExpanderファームウェアのアップデートで簡単に変更できました。コードで「ST10」を「ST13」に変更するだけです。
<図>
2019年9月12日更新
OLEDディスプレイの電源がブランクになるコールドブートの問題を修正したv1.1をリリースしました。まだクロールスペースの通気に取り組んでいます!
コード
- 地下室/クロールスペース換気システム
地下室/クロールスペース換気システム C / C ++
ArduinoNanoを使用してスマート換気システムを作成します/ * IOエキスパンダー**地下/クロールスペース換気システムv1.1 * * /#include#include #include #include "IOExpander.h" #define FAHRENHEIT#define ONEWIRE_TO_I2C_ROM "i4s71" #define INIT_OLED "st13; si; sc; sd" #define HUMIDITY_SENSOR_INSIDE "s6t1" #define HUMIDITY_SENSOR_OUTSIDE "s8 define FAN_OFF "r1f" #define ABSOLUTE_DELTA_FAN_ON 1 //内側の絶対湿度デルタ> =外側の場合はファンオン#defineABSOLUTE_DELTA_FAN_OFF 0.5 //内側の絶対湿度デルタの場合はファンオフ<=outside#define OUTSIDE_RELATIVE_FAN_ON 88 //外側の相対湿度の場合はファンオン湿度は<=%#define OUTSIDE_RELATIVE_FAN_OFF 90 //外部相対湿度が> =の場合はファンオフ%#define MINIMUM_TEMPERATURE 15 //外部温度が<=15C / 59F#define FAN_ON_TIME(20 * 60 * 1000)の場合は換気のオン/オフを繰り返しますL)// 20 min#define FAN_OFF_TIME(20 * 60 * 1000L)// 20 min //#define SERIAL_DEBUG#define SERIAL_TIMEOUT 5000 // DHT22読み取り間の5秒の遅延#ifdefSERIAL_DEBUGSoftwareSerial swSerial(8,7);#endifstruct HS {フロート温度;フロート相対;フロートアブソリュート; bool error;}; int led =13; bool init_oled =true; long ontime、offtime; #ifdef FAHRENHEIT#define C2F(temp)CelsiusToFahrenheit(temp)float CelsiusToFahrenheit(float celsius){return((celsius * 9)/ 5) +32;}#else#define C2F(temp)(temp)#endifvoid SerialPrint(const char * str、float decimal、char error){Serial.print(str); if(エラー)Serial.print(F( "NA")); else Serial.print(decimal、1);} float DewPoint(float temp、float Hydraulic){float t =(17.625 * temp)/(243.04 + temp); float l =log(humidity / 100);フロートb =l + t; // August-Roche-Magnus近似リターン(243.04 * b)/(17.625-b);} #define MOLAR_MASS_OF_WATER 18.01534#define UNIVERSAL_GAS_CONSTANT 8.21447215float AbsoluteHumidity(float temp、float Relative){// https://から取得carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity///精度は-30から35°Cの範囲で約0.1°C // August-Roche- Magnus 6.1094 exp(17.625 x T)/(T + 243.04)// Buck(1981)6.1121 exp(17.502 x T)/(T + 240.97)//参照https://www.eas.ualberta.ca/jdwilson/ EAS372_13 / Vomel_CIRES_satvpformulae.html // Buck(1981)を使用return(6.1121 * pow(2.718281828、(17.67 * temp)/(temp + 243.5))* Relative * MOLAR_MASS_OF_WATER)/((273.15 + temp)* UNIVERSAL_GAS_CONSTANT);} void ReadHumiditySensor(HS * hs){SerialCmd( "sr"); if(SerialReadFloat(&hs-> temp)&&SerialReadFloat(&hs-> relative)){// hs-> dewpoint =DewPoint(hs-> temp、hs-> relative); hs-> abstract =AbsoluteHumidity(hs-> temp、hs-> relative); hs-> error =false; } else hs-> error =true; SerialReadUntilDone();} void setup(){Serial.begin(115200);#ifdef SERIAL_DEBUG swSerial.begin(115200); // swSerialEcho =&swSerial; #endif pinMode(led、OUTPUT); wdt_enable(WDTO_8S); offtime =millis()-FAN_OFF_TIME;} void loop(){HS内部、外部; static bool fan =false;静的ブールサイクル=false; static long last_time =-(60L * 1000L); Serial.println(); if(SerialReadUntilDone()){// if(init_oled){// if(SerialCmdNoError(ONEWIRE_TO_I2C_ROM)){// SerialCmdDone(INIT_OLED); // init_oled =false; //} //} //湿度センサーを1分に1回だけ読み取るか、読み取りが速すぎると自己発熱しますif(millis()-last_time> 60L * 1000L){if(SerialCmdDone(HUMIDITY_SENSOR_INSIDE))ReadHumiditySensor(&inside); if(SerialCmdDone(HUMIDITY_SENSOR_OUTSIDE))ReadHumiditySensor(&outside); if(inside.error || outside.error)ファン=false; else {if(fan){if(outside.relative> =OUTSIDE_RELATIVE_FAN_OFF || inside.absolute --outside.absolute <=ABSOLUTE_DELTA_FAN_OFF)cycle =fan =false; else {if(cycle &&external.temp <=MINIMUM_TEMPERATURE &&millis()-ontime> FAN_ON_TIME)fan =false; } if(!fan)offtime =millis(); } else {if(outside.relative <=OUTSIDE_RELATIVE_FAN_ON &&inside.absolute --outside.absolute> =ABSOLUTE_DELTA_FAN_ON)cycle =fan =true; if(cycle &&external.temp <=MINIMUM_TEMPERATURE)fan =(millis()-オフタイム> FAN_OFF_TIME)?真/偽; if(fan)ontime =millis(); }} if(fan)SerialCmdDone(FAN_ON);それ以外の場合、SerialCmdDone(FAN_OFF); if(SerialCmdNoError(ONEWIRE_TO_I2C_ROM)){if(init_oled){SerialCmdDone(INIT_OLED); init_oled =false; } SerialCmdDone( "st13; sc; sf0; sa1; sd70,0、\" INSIDE \ "; sd127,0、\" OUTSIDE \ "; sf1; sa0; sd0,12,248、\" "#ifdef FAHRENHEIT" F "# else "C" #endif "\"; sd0,30、\ "%\"; sf0; sd0,50、\ "g / m \"; sd20,46、\ "3 \"; "); SerialPrint( "sf1; sa1; sd70,12、\" "、C2F(inside.temp)、inside.error); SerialPrint(" \ "; sd70,30、\" "、inside.relative、inside.error); SerialPrint( "\"; sd70,48、\ ""、inside.absolute、inside.error); SerialPrint( "\"; sd127,12、\ ""、C2F(outside.temp)、outside.error); SerialPrint ( "\"; sd127,30、\ ""、outside.relative、outside.error); SerialPrint( "\"; sd127,48、\ ""、outside.absolute、outside.error); Serial.print( " \ ";"); Serial.print( "sf0; sa0; sd0,0、\" "); if(fan)Serial.print(" FAN "); else Serial.print(" v1.1 "); Serial.println(" \ ";SD"); SerialReadUntilDone(); } else init_oled =true; last_time =millis(); } delay(1000); } else {digitalWrite(led、HIGH); delay(500); digitalWrite(led、LOW); delay(500); init_oled =true; } wdt_reset();}
回路図
Arduino Nanoを使用して、スマート換気システムを作成します。 
製造プロセス