資料介紹
描述
功能列表
構(gòu)建通風(fēng)系統(tǒng)所需的零件
- IO 擴(kuò)展器
- 1線到I2C。
- 阿杜諾納米。
- 1 通道直流 5V 繼電器。
- x2 SHT10 濕度傳感器。
- I2C SSD1306 OLED 128x64 顯示器。
- x2 110V 172x150x38mm 0.34A 2400 RPM 滾珠軸承風(fēng)扇。
- 158x90x65mm 透明防水塑料外殼。
- ip68 pg7 防水尼龍電纜接頭。
- ip68 pg9 防水尼龍電纜接頭。
- x2 RJ11 Keystone 螺絲端子插孔。
- x2 Keystone 機(jī)箱。
- x2 50 英尺 4C4P RJ11 線。
- 6" 4C4P RJ11 線。
- 100 英尺 110V 電線。
- 交流插頭。
- 2.54 毫米頭線。
- 12VDC 1A 墻壁適配器電源。
接線圖
OLED顯示器
那么為什么要使用 IO 擴(kuò)展器呢?
- 設(shè)計(jì)更簡單
- 現(xiàn)成的零件
- 無需編寫 1-Wire 驅(qū)動程序
- 無需編寫繼電器驅(qū)動程序
- 無需編寫 OLED 顯示驅(qū)動程序
- 沒有顯示字體占用 Arduino 代碼空間
- 無需編寫濕度傳感器驅(qū)動程序
- 節(jié)省 Arduino 上的代碼空間;僅 6106 字節(jié) (19%)
- 寫代碼不到一天
- 使用標(biāo)準(zhǔn) RJ11 電話線輕松接線
- 沒有傳感器電纜長度問題
- 比商業(yè)系統(tǒng)更便宜
- 易于更改以適應(yīng)個(gè)性化需求
- 單電源
構(gòu)建系統(tǒng)
將 Arduino Nano 連接到IO 擴(kuò)展器并使用以下代碼對其進(jìn)行編程。6 針接頭是軟件串行調(diào)試端口,最終安裝時(shí)不需要。
確保更改 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 // Fan on if absolute humidity delta of inside >= outside
#define ABSOLUTE_DELTA_FAN_OFF 0.5 // Fan off if absolute humidity delta of inside <= outside
#define OUTSIDE_RELATIVE_FAN_ON 88 // Fan on if outside relative humidity is <= %
#define OUTSIDE_RELATIVE_FAN_OFF 90 // Fan off if outside relative humidity is >= %
#define MINIMUM_TEMPERATURE 15 // Cycle vent on/off if outside temperature <= 15C/59F
#define FAN_ON_TIME (20*60*1000L) // 20 min
#define FAN_OFF_TIME (20*60*1000L) // 20 min
//#define SERIAL_DEBUG
#define SERIAL_TIMEOUT 5000 // 5 sec delay between DHT22 reads
#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
#define 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 humidity)
{
float t = (17.625 * temp) / (243.04 + temp);
float l = log(humidity/100);
float b = l + t;
// Use the August-Roche-Magnus approximation
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)
{
//taken from https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-hu midity-to-absolute-humidity/
//precision is about 0.1°C in range -30 to 35°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)
//reference https://www.eas.ualberta.ca/jdwilson/EAS372_13/Vomel_CIRES_satvpformulae.html // Use 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->absolute = 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 inside, outside;
static bool fan = false;
static bool cycle = false;
static long last_time = -(60L * 1000L);
Serial.println();
if (SerialReadUntilDone()) {
// Read the humidity sensors only once a minute or they will self heat if read too quickly
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 && outside.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");
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();
}
注意:如果您使用 USB 端口對 Arduino Nano 進(jìn)行編程,則必須將其與IO 擴(kuò)展器斷開,因?yàn)樗彩褂孟嗤膯蝹€(gè)串行端口,而不是如果您想調(diào)試使用 ICSP 端口對 ATmega328P 進(jìn)行編程。要啟用軟件調(diào)試端口,請取消注釋 SERIAL_DEBUG 定義。
將 110VAC 線連接到兩個(gè)風(fēng)扇。
在 PG7 和 PG9 外殼的任一側(cè)鉆一個(gè) 7/16" 和 9/16" 孔。使用 dremel 工具稍微擴(kuò)大孔,直到壓蓋貼合。PG7 將輸入 12VDC 輸入電壓,PG9 將輸入傳感器和風(fēng)扇。
找到一個(gè)打開且未堵塞的通風(fēng)口。這將是我們的排氣,我們將把地下室/爬行空間的空氣吹出。確保另一側(cè)的所有其他通風(fēng)口都打開,因?yàn)檫@些通風(fēng)口將成為您的進(jìn)氣口。關(guān)閉相鄰的通風(fēng)口,以便在整個(gè)地下室/爬行空間中創(chuàng)建區(qū)域而不是局部氣流。
使用扎帶將風(fēng)扇安裝在通風(fēng)口的內(nèi)側(cè)。確保風(fēng)扇指向正確的方向以吹出空氣。
找到一個(gè)現(xiàn)有的接入點(diǎn)并將外部濕度傳感器線穿入內(nèi)部。確保濕度傳感器距離房屋和任何障礙物足夠遠(yuǎn),以便準(zhǔn)確測量環(huán)境溫度/濕度。根據(jù)當(dāng)?shù)匕l(fā)布的天氣報(bào)告驗(yàn)證您的讀數(shù)。
將外部濕度傳感器連接到梯形插孔和外殼并將其安裝在內(nèi)部。
將內(nèi)部濕度傳感器連接到梯形插孔和外殼并將其安裝在內(nèi)部。需要額外濕度控制的中心位置或區(qū)域是首選。
將 50 英尺 RJ11 電線連接到濕度傳感器,并將帶有風(fēng)扇線的電線連接到將安裝控制外殼的可用接入點(diǎn)。
連接所有電線并將所有部件組裝/送入控制柜。如果您的 50 英尺 RJ11 電線帶有預(yù)先壓接的連接器,您必須將它們切斷以將電線穿過壓蓋并壓接新的連接器。
測試系統(tǒng)并確保一切正常。要測試?yán)^電器和風(fēng)扇,請斷開 Arduino 與IO 擴(kuò)展器的連接,并將其直接連接到您的計(jì)算機(jī)以手動控制它。確認(rèn)一切正常后,使用雙面膠帶和包裝泡沫將所有部件組裝到外殼中以固定您的電路板,并享受智能濕度控制通風(fēng)系統(tǒng)的好處和節(jié)省
2019 年 3 月 20 日更新
在過去幾個(gè)月在我的爬行空間中運(yùn)行通風(fēng)系統(tǒng)后,在我的熱水器泄漏后,零掛起和峰值相對濕度大于 95% 后,它已成功將相對濕度降至 50% 以下。通風(fēng)系統(tǒng)是一個(gè)有效的控制系統(tǒng)!
從 SSD1306 0.96" OLED 顯示屏切換到 SH1106 1.3" OLED 顯示屏。它更大,更容易閱讀。使用 IO Expander 固件更新可以輕而易舉地改變它。只需在您的代碼中將“ST10”更改為“ST13”。
2019 年 9 月 12 日更新
發(fā)布了 v1.1,修復(fù)了 OLED 顯示屏供電空白的冷啟動問題。還在為我的爬行空間發(fā)泄!
- 基于Arduino Nano R3的地下室狹小空隙通風(fēng)系統(tǒng) 0次下載
- 基于Arduino Nano R3的地下室狹小空隙通風(fēng)系統(tǒng) 0次下載
- 人民防空地下室設(shè)計(jì)規(guī)范 0次下載
- 地下車庫通風(fēng)變頻調(diào)節(jié)的原理與應(yīng)用 12次下載
- 基于IDL的地下工程通風(fēng)系統(tǒng)設(shè)計(jì) 26次下載
- 無風(fēng)管型誘導(dǎo)通風(fēng)系統(tǒng)自控設(shè)計(jì)說明 68次下載
- 基于ARM的通風(fēng)柜控制系統(tǒng)
- 通風(fēng)系統(tǒng)煤礦通風(fēng)監(jiān)控系統(tǒng)示意圖
- 地下室防水工程監(jiān)理質(zhì)量措施
- 地下室內(nèi)設(shè)置燃?xì)饪照{(diào)機(jī)組的思考
- 三剛一柔復(fù)合型深基礎(chǔ)圍護(hù)的設(shè)計(jì)和施工
- 超深六層地下室堵漏防水綜合技術(shù)
- 混凝土墻體出現(xiàn)裂縫怎么辦
- 通風(fēng)設(shè)計(jì)技術(shù)交流
- 基于PLC的隧道通風(fēng)監(jiān)控系統(tǒng)
- 變配電室使用要求 1552次閱讀
- 基于STM32單片機(jī)的CO(一氧化碳)氣體檢測報(bào)警通風(fēng)系統(tǒng)仿真設(shè)計(jì) 2309次閱讀
- 基于CMOS的簡易水位報(bào)警電路 676次閱讀
- 壓縮空氣在發(fā)電廠暖通設(shè)計(jì)中的拓展應(yīng)用探討 1381次閱讀
- 城市地下管廊智能監(jiān)測系統(tǒng)設(shè)計(jì)方案 1099次閱讀
- 基于P87C591單片機(jī)和P87C591數(shù)模轉(zhuǎn)換器實(shí)現(xiàn)機(jī)車通風(fēng)機(jī)控制系統(tǒng)設(shè)計(jì) 1413次閱讀
- 基于物聯(lián)網(wǎng)與無線網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn)地下水監(jiān)測系統(tǒng)的設(shè)計(jì) 1735次閱讀
- 地下管網(wǎng)的管理如何利用rfid技術(shù) 584次閱讀
- 智慧地下水表解決方案如何實(shí)現(xiàn) 1077次閱讀
- 如何基于現(xiàn)有站址資源合理規(guī)劃部署NB-IoT 900 MHz基站 8192次閱讀
- NB-IoT是怎么工作的,是否支持基站定位? 3.1w次閱讀
- 淺析紅外線感應(yīng)開關(guān)原理和安裝要求 1.3w次閱讀
- 海為PLC在智能通風(fēng)系統(tǒng)的內(nèi)部測試中的應(yīng)用 846次閱讀
- 一文看懂空調(diào)座椅半導(dǎo)體獨(dú)立制冷和原車?yán)錃?b class="flag-6" style="color: red">通風(fēng)系統(tǒng)的區(qū)別 1.2w次閱讀
- 中繼臺的作用和安裝以及對講機(jī)頻率修改 1.4w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多