Arduinoを使用したサーバーキャビネットの温度制御

以前の投稿の1つで 、FLProgプログラムのユーザーが作成したプロジェクトについて説明しました。 今日は、自分で作成したシステムについてお話したいと思います。



私が仕事をしている駅のサーバールームは、別の部屋にあります。 サーバーを冷却するために、2つのエアコンが取り付けられています。 残念ながら、これらは一般的な家庭用モデルなので、定期的にどちらか一方が修理中です。 FLProgプロジェクトでの私の仕事を知っている部門管理者は、サーバーキャビネット内の温度を監視し、ファンの動作を制御するシステムを作成することを提案しました。 現在の温度に関する情報は、デューティエンジニアの部屋のボードに表示される必要があります。また、温度が一定のしきい値を超えた場合は、アラーム音が鳴ります。 私はこの仕事を始めました、そして、これは起こったことです...



状況は、最も近い文明から200キロ離れているという事実によって複雑になり、私が持っていた保護区と、パントリーの古いゴミからシステムを組み立てる必要がありました。 在庫あり:



1. Arduino Nano

2. DS18B20温度センサー

3. 2つの温度および湿度センサーDHT-22

4. I2Cボードで1行に20文字の4行ディスプレイ



デバイスのスキームが開発されました: 概略図



その後、回路基板を開発しました:





プログラムSprint-Layout_6のメインボード





プログラムSprint-Layout_6のボタンボード



LUTテクノロジー用の鉄と特殊紙はなかったので、子供の頃を思い出し、掃除婦から頼まれたニスでペンでボードを描く必要がありました。













最初の組み立てとトライアルスケッチの記入後、最初の問題が発生しました。 最初に、5ボルトがコイルに来ましたが、リレーは動作を拒否しました。 ボードに取り付ける前に、私はコイルの抵抗を自然にチェックし、トリップのチェックでコイルに電力を印加しました。 リレーは非常に難しいことがわかりました。 内部にダイオードはありませんが(コイルは両側で同じように鳴ります)、コイルの電力極性が役割を果たします。 最も可能性が高いのは、トリップ電流を減らすために磁化された電機子を持っていることです。 このため、リールはボードの反対側に移動しました。 リールを動かした後、すべてがうまくいきました。









次に、ボードの最終ファームウェアが開発されました。



プロジェクトはFLProgプログラムにあります。



スケッチ
#include <Wire.h> #include <OneWire.h> #include <LiquidCrystal_I2C.h> #include <EEPROM.h> #include "DHT.h" LiquidCrystal_I2C _lcd1(0x3F, 20, 4); int _dispTempLength1=0; boolean _isNeedClearDisp1; byte _d18x2x1Addr[8]={0x28, 0xFF, 0x11, 0x94, 0x3C, 0x4, 0x0, 0x48}; DHT _dht1(11, DHT22); OneWire _ow10(10); bool _gtv1 = 0; bool _gtv3 = 0; bool _gtv4 = 0; bool _gtv5 = 0; int _gtv2 = 23; int _gtv6 = 27; int _gtv7 = 30; int _gtv8 = 35; int _gtv9 = 0; bool _gtv10 = 0; String _gtv11 = "_C"; bool _gtv12 = 0; bool _gtv13 = 0; float _gtv14 = 0; float _gtv15 = 0; bool _gtv16 = 0; int _gtv17 = 10; bool _gtv18 = 0; bool _gtv19 = 0; bool _gtv20 = 0; bool _gtv21 = 0; bool _gtv22 = 0; bool _gtv23 = 0; bool _gtv24 = 0; bool _gtv25 = 0; bool _gtv26 = 0; bool _gtv27 = 0; bool _gtv28 = 0; bool _trgrt9 = 0; bool _trgrt9I = 0; bool _bounse1S = 0; bool _bounse1O = 0; unsigned long _bounse1P = 0UL; bool _trgrt4 = 0; bool _trgrt4I = 0; bool _bounse2S = 0; bool _bounse2O = 0; unsigned long _bounse2P = 0UL; bool _trgrt5 = 0; bool _trgrt5I = 0; bool _bounse3S = 0; bool _bounse3O = 0; unsigned long _bounse3P = 0UL; bool _trgrt8 = 0; bool _trgrt8I = 0; bool _count1I = 0; int _count1P = 0; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; bool _trgrt1 = 0; bool _trgrt1I = 0; bool _trgrt2 = 0; bool _trgrt2I = 0; bool _trgrt3 = 0; bool _trgrt3I = 0; int _disp1oldLength = 0; String _mux1; int _disp3oldLength = 0; int _disp4oldLength = 0; int _disp5oldLength = 0; int _disp6oldLength = 0; int _disp7oldLength = 0; String _swi2; String _swi3; int _disp2oldLength = 0; String _mux2; int _disp8oldLength = 0; int _disp9oldLength = 0; int _disp10oldLength = 0; int _disp11oldLength = 0; int _disp12oldLength = 0; String _swi4; String _swi5; bool _trgrt10 = 0; bool _trgrt10I = 0; bool _trgrt11 = 0; bool _trgrt11I = 0; bool _trgrt12 = 0; bool _trgrt12I = 0; bool _trgrt13 = 0; bool _trgrt13I = 0; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; unsigned long _dht1Tti = 0UL; float _dht1t = 0.00; float _dht1h = 0.00; bool _trgr1 = 0; bool _trgr2 = 0; bool _trgrt6 = 0; bool _trgrt6I = 0; bool _trgr3 = 0; bool _trgr4 = 0; bool _trgrt7 = 0; bool _trgrt7I = 0; bool _trgr5 = 0; bool _pzs1OES = 0; int _pzs1OFS = 0; bool _gen1I = 0; bool _gen1O = 0; unsigned long _gen1P = 0UL; int _swi1; bool _D1B1 = 0; bool _gen2I = 0; bool _gen2O = 0; unsigned long _gen2P = 0UL; String _swi6; int _disp13oldLength = 0; bool _SEEPR1OSN = 0; bool _SEEPR2OSN = 0; bool _SEEPR3OSN = 0; bool _SEEPR4OSN = 0; void setup() { Wire.begin(); pinMode(12, OUTPUT); pinMode(4, OUTPUT); pinMode(3, OUTPUT); pinMode(2, OUTPUT); _lcd1.init(); _lcd1.noBacklight(); _dht1.begin(); } void loop() {if(_isTimer(_dht1Tti, 6000)) { _dht1Tti = millis(); float tempDht11; tempDht11 = _dht1.readTemperature(); if (!(isnan(tempDht11))){_dht1t=tempDht11; } }if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;} if (1) { if (_trgrt9I) { _trgrt9 = 0;} else {_trgrt9 = 1; _trgrt9I = 1;} } else {_trgrt9 = 0; _trgrt9I = 0;}; if (_trgrt9) { _gtv6 = (EEPROMReadInt(0)); } if (_trgrt9) { _gtv7 = (EEPROMReadInt(2)); } if (_trgrt9) { _gtv2 = (EEPROMReadInt(4)); } if (_trgrt9) { _gtv8 = (EEPROMReadInt(6)); } bool _bounceTmp1 = ! (( (analogRead (3))) > (500)); if (_bounse1S) { if (millis() >= (_bounse1P + 40)) {_bounse1O= _bounceTmp1; _bounse1S=0;} } else { if (_bounceTmp1 != _bounse1O ) {_bounse1S=1; _bounse1P = millis();} } if (_bounse1O) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;}; _gtv3 = _bounse1O; _gtv12 = (_trgrt4) && (!(_gtv20)) ; bool _bounceTmp2 = ! (( (analogRead (2))) > (500)); if (_bounse2S) { if (millis() >= (_bounse2P + 40)) {_bounse2O= _bounceTmp2; _bounse2S=0;} } else { if (_bounceTmp2 != _bounse2O ) {_bounse2S=1; _bounse2P = millis();} } if (_bounse2O) { if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;}; _gtv4 = _bounse2O; _gtv13 = (_trgrt5) && (!(_gtv20)) ; bool _bounceTmp3 = ! (( (analogRead (1))) > (500)); if (_bounse3S) { if (millis() >= (_bounse3P + 40)) {_bounse3O= _bounceTmp3; _bounse3S=0;} } else { if (_bounceTmp3 != _bounse3O ) {_bounse3S=1; _bounse3P = millis();} } if (_bounse3O) { if (_trgrt8I) { _trgrt8 = 0;} else {_trgrt8 = 1; _trgrt8I = 1;} } else {_trgrt8 = 0; _trgrt8I = 0;}; _gtv5 = _bounse3O; _gtv19 = (_trgrt8) && (!(_gtv20)) ; if (_gtv19) { if (! _count1I) { _count1P = _count1P+1; _count1I = 1; } } else { _count1I=0; } if (_count1P < 0 ) _count1P = 0; if ( (_gtv1) || (_gtv10) ) _count1P = 0; if (_gtv5) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; if (_gtv3) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; if (_gtv4) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;}; if ( ((_count1P) > (0)) && ((! (_trgrt1) || (_trgrt2) || (_trgrt3) )) ) { if (_tim1I) { if ( _isTimer(_tim1P, 60000)) _tim1O = 1; } else { _tim1I = 1; _tim1P = millis(); } } else { _tim1O = 0; _tim1I = 0; } _gtv9 = _count1P; _gtv1 = _count1P >= 5; _gtv10 = _tim1O; if((_gtv9) == 0) {_mux1 = String("Terst");} if((_gtv9) == 1) {_mux1 = String("Value Off");} if((_gtv9) == 2) {_mux1 = String("Value 1 On");} if((_gtv9) == 3) {_mux1 = String("Value 2 On");} if((_gtv9) == 4) {_mux1 = String("Value Alarm");} if ((_gtv9) > (0)) { _dispTempLength1 = ((_mux1)).length(); if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 0); _lcd1.print((_mux1)); } else { if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} } if ((0) == (_gtv9)) { _dispTempLength1 = (String("SU T:")).length(); if (_disp3oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp3oldLength = _dispTempLength1; _lcd1.setCursor(0, 0); _lcd1.print(String("SU T:")); } else { if (_disp3oldLength > 0) {_isNeedClearDisp1 = 1; _disp3oldLength = 0;} } if ((0) == (_gtv9)) { _dispTempLength1 = ((( _floatToStringWitRaz(_gtv14,1)))).length(); if (_disp4oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp4oldLength = _dispTempLength1; _lcd1.setCursor(5, 0); _lcd1.print((( _floatToStringWitRaz(_gtv14,1)))); } else { if (_disp4oldLength > 0) {_isNeedClearDisp1 = 1; _disp4oldLength = 0;} } if ((0) == (_gtv9)) { _dispTempLength1 = (String("C")).length(); if (_disp5oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp5oldLength = _dispTempLength1; _lcd1.setCursor(9, 0); _lcd1.print(String("C")); } else { if (_disp5oldLength > 0) {_isNeedClearDisp1 = 1; _disp5oldLength = 0;} } if(_gtv21) {_swi2=String("*");} else {_swi2=String("-");} if ((0) == (_gtv9)) { _dispTempLength1 = ((_swi2)).length(); if (_disp6oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp6oldLength = _dispTempLength1; _lcd1.setCursor(11, 0); _lcd1.print((_swi2)); } else { if (_disp6oldLength > 0) {_isNeedClearDisp1 = 1; _disp6oldLength = 0;} } if(_gtv22) {_swi3=String("*");} else {_swi3=String("-");} if ((0) == (_gtv9)) { _dispTempLength1 = ((_swi3)).length(); if (_disp7oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp7oldLength = _dispTempLength1; _lcd1.setCursor(13, 0); _lcd1.print((_swi3)); } else { if (_disp7oldLength > 0) {_isNeedClearDisp1 = 1; _disp7oldLength = 0;} } if((_gtv9) == 0) {_mux2 = String("test");} if((_gtv9) == 1) {_mux2 = (((String(_gtv2))) + (_gtv11));} if((_gtv9) == 2) {_mux2 = (((String(_gtv6))) + (_gtv11));} if((_gtv9) == 3) {_mux2 = (((String(_gtv7))) + (_gtv11));} if((_gtv9) == 4) {_mux2 = (((String(_gtv8))) + (_gtv11));} if ((_gtv9) > (0)) { _dispTempLength1 = ((_mux2)).length(); if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp2oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 1); _lcd1.print((_mux2)); } else { if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;} } if ((0) == (_gtv9)) { _dispTempLength1 = (String("CU T:")).length(); if (_disp8oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp8oldLength = _dispTempLength1; _lcd1.setCursor(0, 1); _lcd1.print(String("CU T:")); } else { if (_disp8oldLength > 0) {_isNeedClearDisp1 = 1; _disp8oldLength = 0;} } if ((0) == (_gtv9)) { _dispTempLength1 = ((( _floatToStringWitRaz(_gtv15,1)))).length(); if (_disp9oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp9oldLength = _dispTempLength1; _lcd1.setCursor(5, 1); _lcd1.print((( _floatToStringWitRaz(_gtv15,1)))); } else { if (_disp9oldLength > 0) {_isNeedClearDisp1 = 1; _disp9oldLength = 0;} } if ((0) == (_gtv9)) { _dispTempLength1 = (String("C")).length(); if (_disp10oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp10oldLength = _dispTempLength1; _lcd1.setCursor(9, 1); _lcd1.print(String("C")); } else { if (_disp10oldLength > 0) {_isNeedClearDisp1 = 1; _disp10oldLength = 0;} } if(_gtv23) {_swi4=String("*");} else {_swi4=String("-");} if ((0) == (_gtv9)) { _dispTempLength1 = ((_swi4)).length(); if (_disp11oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp11oldLength = _dispTempLength1; _lcd1.setCursor(11, 1); _lcd1.print((_swi4)); } else { if (_disp11oldLength > 0) {_isNeedClearDisp1 = 1; _disp11oldLength = 0;} } if(_gtv24) {_swi5=String("*");} else {_swi5=String("-");} if ((0) == (_gtv9)) { _dispTempLength1 = ((_swi5)).length(); if (_disp12oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp12oldLength = _dispTempLength1; _lcd1.setCursor(13, 1); _lcd1.print((_swi5)); } else { if (_disp12oldLength > 0) {_isNeedClearDisp1 = 1; _disp12oldLength = 0;} } if ( (_gtv5) && (_gtv3) && (_gtv4) ) { if (_trgrt10I) { _trgrt10 = 0;} else {_trgrt10 = 1; _trgrt10I = 1;} } else {_trgrt10 = 0; _trgrt10I = 0;}; if ( (_gtv12) && ((_gtv9) == (1)) ) { _gtv2 = (_gtv2)+(1); } if ( ((_gtv9) == (1)) && (_gtv13) ) { _gtv2 = (_gtv2)-(1); } if (_trgrt10) { _gtv2 = 25; } _gtv25 = ( (_gtv12) && ((_gtv9) == (1)) ) || ( ((_gtv9) == (1)) && (_gtv13) ) || (_trgrt10) ; if ( (_gtv5) && (_gtv3) && (_gtv4) ) { if (_trgrt11I) { _trgrt11 = 0;} else {_trgrt11 = 1; _trgrt11I = 1;} } else {_trgrt11 = 0; _trgrt11I = 0;}; if ( (_gtv12) && ((_gtv9) == (2)) ) { _gtv6 = (_gtv6)+(1); } if ( ((_gtv9) == (2)) && (_gtv13) ) { _gtv6 = (_gtv6)-(1); } if (_trgrt11) { _gtv6 = 27; } _gtv26 = ( (_gtv12) && ((_gtv9) == (2)) ) || ( ((_gtv9) == (2)) && (_gtv13) ) || (_trgrt11) ; if ( (_gtv5) && (_gtv3) && (_gtv4) ) { if (_trgrt12I) { _trgrt12 = 0;} else {_trgrt12 = 1; _trgrt12I = 1;} } else {_trgrt12 = 0; _trgrt12I = 0;}; if ( (_gtv12) && ((_gtv9) == (3)) ) { _gtv7 = (_gtv7)+(1); } if ( ((_gtv9) == (3)) && (_gtv13) ) { _gtv7 = (_gtv7)-(1); } if (_trgrt12) { _gtv7 = 30; } _gtv27 = ( (_gtv12) && ((_gtv9) == (3)) ) || ( ((_gtv9) == (3)) && (_gtv13) ) || (_trgrt12) ; if ( (_gtv5) && (_gtv3) && (_gtv4) ) { if (_trgrt13I) { _trgrt13 = 0;} else {_trgrt13 = 1; _trgrt13I = 1;} } else {_trgrt13 = 0; _trgrt13I = 0;}; if ( (_gtv12) && ((_gtv9) == (4)) ) { _gtv8 = (_gtv8)+(1); } if ( ((_gtv9) == (4)) && (_gtv13) ) { _gtv8 = (_gtv8)-(1); } if (_trgrt13) { _gtv8 = 35; } _gtv28 = ( (_gtv12) && ((_gtv9) == (4)) ) || ( ((_gtv9) == (4)) && (_gtv13) ) || (_trgrt13) ; if(_isTimer(_d18x2x1Tti, 5000)) { _d18x2x1Tti = millis(); _d18x2x1O= _readDS18_ow10(_d18x2x1Addr, 0);} _gtv14 = (_d18x2x1O); _gtv15 = _dht1t; if(((int((_gtv14)*(_gtv17)))) < ((_gtv2)*(_gtv17))) _trgr1 = 0; if(((int((_gtv14)*(_gtv17)))) > ((_gtv6)*(_gtv17))) _trgr1 = 1; if(((int((_gtv14)*(_gtv17)))) < ((_gtv2)*(_gtv17))) _trgr2 = 0; if(((int((_gtv14)*(_gtv17)))) > ((_gtv7)*(_gtv17))) _trgr2 = 1; if (((int((_gtv14)*(_gtv17)))) > ((_gtv17)*(_gtv8))) { if (_trgrt6I) { _trgrt6 = 0;} else {_trgrt6 = 1; _trgrt6I = 1;} } else {_trgrt6 = 0; _trgrt6I = 0;}; if(((int((_gtv17)*(_gtv15)))) < ((_gtv2)*(_gtv17))) _trgr3 = 0; if(((int((_gtv17)*(_gtv15)))) > ((_gtv6)*(_gtv17))) _trgr3 = 1; if(((int((_gtv17)*(_gtv15)))) < ((_gtv2)*(_gtv17))) _trgr4 = 0; if(((int((_gtv17)*(_gtv15)))) > ((_gtv7)*(_gtv17))) _trgr4 = 1; if (((int((_gtv17)*(_gtv15)))) > ((_gtv17)*(_gtv8))) { if (_trgrt7I) { _trgrt7 = 0;} else {_trgrt7 = 1; _trgrt7I = 1;} } else {_trgrt7 = 0; _trgrt7I = 0;}; _gtv16 = _trgrt6; _gtv21 = _trgr1; digitalWrite(12, _trgr1); digitalWrite(3, _trgr3); _gtv18 = _trgrt7; _gtv23 = _trgr3; _gtv22 = _trgr2; digitalWrite(4, _trgr2); digitalWrite(2, _trgr4); _gtv24 = _trgr4; if( (_gtv5) || (_gtv3) || (_gtv4) ) _trgr5 = 0; if( (_gtv16) || (_gtv18) ) _trgr5 = 1; if (_trgr5) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0; } if (_gen1I ) { if ( _isTimer ( _gen1P , 500 )) { _gen1P = millis(); _gen1O = ! _gen1O; } } if( (!(_trgr5)) || (_gen1O) ) {if(! _D1B1){_lcd1.backlight(); _D1B1=1; }} else {if(_D1B1){_lcd1.noBacklight(); _D1B1=0; }} if(_gen1O) {_swi1=3000;} else {_swi1=2500;} if(_trgr5) {if((!_pzs1OES) || (_swi1 != _pzs1OFS)){ tone(13, (_swi1)); _pzs1OES =1;_pzs1OFS = _swi1;}} else {if(_pzs1OES){noTone(13); _pzs1OES =0; }} _gtv20 = _trgr5; if (1) { if (! _gen2I) { _gen2I = 1; _gen2O = 1; _gen2P = millis(); } } else { _gen2I = 0 ; _gen2O= 0; } if (_gen2I ) { if ( _isTimer ( _gen2P , 1000 )) { _gen2P = millis(); _gen2O = ! _gen2O; } } if(_gen2O) {_swi6=String("----");} else {_swi6=String("****");} if (1) { _dispTempLength1 = ((_swi6)).length(); if (_disp13oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp13oldLength = _dispTempLength1; _lcd1.setCursor(int((20 - _dispTempLength1)/2), 2); _lcd1.print((_swi6)); } else { if (_disp13oldLength > 0) {_isNeedClearDisp1 = 1; _disp13oldLength = 0;} } if(_gtv26){ if(!_SEEPR1OSN){ EEPROMWriteInt(0, _gtv6); _SEEPR1OSN=1;} }else{ if(_SEEPR1OSN){_SEEPR1OSN=0;}} if(_gtv27){ if(!_SEEPR2OSN){ EEPROMWriteInt(2, _gtv7); _SEEPR2OSN=1;} }else{ if(_SEEPR2OSN){_SEEPR2OSN=0;}} if(_gtv25){ if(!_SEEPR3OSN){ EEPROMWriteInt(4, _gtv2); _SEEPR3OSN=1;} }else{ if(_SEEPR3OSN){_SEEPR3OSN=0;}} if(_gtv28){ if(!_SEEPR4OSN){ EEPROMWriteInt(6, _gtv8); _SEEPR4OSN=1;} }else{ if(_SEEPR4OSN){_SEEPR4OSN=0;}} } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long endTime; endTime = startTime+period; return (millis() >= endTime); } String _floatToStringWitRaz(float value, int raz) { float tv; int ti = int(value); String ts = String(ti); if (raz == 0) { return ts; } ts += "."; float tf = abs(value - ti); for (int i = 1; i <= raz; i++ ) { tv = tf * 10; ti = int(tv); ts += String(ti); tf = (tv - ti); } return ts; } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow10(byte addr[8], byte type_s) { byte data[12]; byte i; _ow10.reset(); _ow10.select(addr); _ow10.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow10.read();} _ow10.reset(); _ow10.select(addr); _ow10.write(0x44, 1); return _convertDS18x2xData(type_s, data);}int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); } void EEPROMWriteInt(int p_address, int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); }
      
      









システムの仕組み。

コントローラに電源が供給されると、キャビネットファンのステップをオンにするためのしきい値の設定とアラームがEEPROMから差し引かれます。

5秒ごとに、センサーからのデータが読み取られて表示されます。 最初のしきい値のキャビネット内の温度を超えると、最初のファンがオンになり、2番目のファンが2番目にオンになり、緊急温度のしきい値を超えると、2トーンの可聴アラームが鳴り、ディスプレイのバックライトが点滅します。 いずれかのボタンが押されると、アラームの確認が発生します。 温度がファンのシャットダウン設定を下回ると、両方のファンが停止します。

「メニュー」ボタンを押すたびに、すべての設定が表示画面に順番に表示されます。 各設定は、「追加」ボタンと「減少」ボタンを使用して変更できます。 この場合、新しい設定値はすぐにEEPROMに記録されます。

1分以内にボタンでアクションを実行しない場合、メインの温度表示画面に移動します

3つのボタンを同時に押すと、すべての設定がプログラムに記録された初期値にリセットされます。 これは、コントローラを初めて起動するとき、予測できない値がEEPROMにあるときに必要です。 たとえば、緊急時の気温は387度でしたが、「Reduce」ボタンを押して35度に下げるのに非常にうんざりしていました。

テーブルでシステムを起動し、ドライヤーでセンサーを暖めると、プログラムのパフォーマンスが示されました。







センサーが取り付けられ、キャビネットにケーブルで接続された













試運転中に、次の微妙さが明らかになりました。

まず、ファンへのケーブルと一緒にセンサーへのケーブルを敷設しないでください。 小さなファン電流に頼って、私はこの間違いを犯しました。 その結果、ファンが停止すると、時々コントローラーがフリーズします。 ケーブルが互いに間隔を空けた後、これらのフリーズは停止しました。 おそらくそれも役立つでしょう-センサーにシールド線を適用しますが、どれも利用できませんでした。







元のディスプレイマウントに注意を払ってはいけませんが、4行のディスプレイを永続的に配置するには大胆すぎると思い、次のシフトで2行のディスプレイに置き換えます。

現時点では、システムは3週間稼働しており、24時間365日フリーズや障害は発生していません。

ちょっとオタクポルノ。 燃え尽きたDHT-22センサーに抵抗することはできませんでした。 内部では、彼は非常に賢いことが判明しました。












All Articles