エアサーファー
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
私は土木技師として、家庭で換気システムがどのように機能するかをよく知っています。そこで、アパートの空気の質を測定するためにCO2モニターを購入しましたが、CO2レベルだけでなく、室温も表示されるのでとても気に入りました。
しかし、これは私にとって十分ではありませんでした。より多くのパラメータを測定したかったので、適切なデバイスを探していました。とてつもなく高価なものを見つけたので、自分で作ることにしました。
当時、私はすでに、さまざまなパイプライン分岐を制御するソレノイドバルブを備えたポンプステーション用のarduinoコントローラーをプログラミングした経験がありました。
私は紙でプロジェクトを作成し、必要なツールとセンサーを注文しました。
ベース
最小10インチの巨大な画面が欲しかったのですが、ポケットがすぐに空になってしまいました。私は現実的であることに決め、tft 3.2420x380ディスプレイを備えたArduinoMega 2560R3を選びました。ディスプレイはarduinoボードに直接接続するため、このセットアップには最小限の配線が必要でした。
残念ながら、Aliexpressに注文したディスプレイは非常に安かったため、うまく機能しませんでした。時間とともに現れる白い小さな点と反転した色がありました。別のライブラリと別のコントローラーを試しましたが、役に立ちませんでした。そこで、コードの色を調整し、午後12時と午前12時に画面を更新するように追加しました。
<図> <図> <図> <図>
センサー
プロジェクトの最も高価な部分はmh-z19CO2センサーでした。信頼性の高い測定と自動校正機能を提供しながら、他のCO2センサーの中でも比較的安価です。
<図> <図>他のモジュールのインストールは比較的簡単でしたが、このセンサーのデータシートには多くの情報がなかったため、フォーラムでコードを探し、すべての情報を組み合わせました。その結果、今ではすべてが完璧に機能し、以前のセンサーよりもさらに優れています。
ただし、それ自体のキャリブレーションには24時間かかったため、最初は読み取り値に一貫性がありませんでした。自動キャリブレーションは簡単です。私がアパートを出るとき、酸素を消費する人がいないので、CO2レベルは400ppmの外部レベルに下がります。読み取り値がこの数値より下のどこかにある場合、センサーは較正します。
UARTとPWMを介して通信できます。信頼性が高いと思うので、最初のものを選びました。
<図>次に、I2Cプロトコルを使用し、SDAピンとSCLピンに接続する屋内監視用のSI7021温度および湿度センサーを使用しました。高価ではなく、工業用の高精度。何の問題もなかったので気に入っています。
<図><図>
外気温については、ステンレス鋼のカプセルに封入されたds18b20を使用しました。安くて正確な測定値。ただし、4.7kオームの抵抗が必要なので、忘れないでください。通信は1線式です。
<図><図> <図> <図>
しばらくの間、I2Cを使用するDS 1307RTCモジュールを購入しました。
<図><図>
次に、CO2レベル用の3つのLED。 400〜800ppmの場合は緑色のLED、800〜1200ppmの場合はオレンジ色のLED、1200ppm以上の場合は赤色のLEDです。
さらに、LED付きの3つのステンレス鋼ボタン。左は何時間も調整するためのものです。真ん中は分用、右はテキストの色変更用です。
さらに、LEDの明るさを調整するためにフォトレジスターを配線しました。夜に明るくなりすぎないようにしたかったのです。
<図><図> <図> <図> <図> <図>
パワー
電源用に、底に穴を開けてDCコネクタを配置しました:
<図>問題は、適切な電源がなかったことです。 Arduinoの推奨電圧は7-12vですが、私は19vと15vの電源アダプターしか持っていませんでした。しかし、私はLM2696DC-DC調整可能電圧レギュレーターをたくさん持っていました。
<図>私はそれを箱の中に入れて、7ボルトに調整しました。 Arduinoが12ボルト未満で非常に急速に加熱していることがわかったので、推奨される最小値を選択しました。その結果、さまざまな電源から供給できるようになりました。
<図>外気温センサーには、飛行士用コネクターと電話線を使用しました。
<図> <図> <図>
ボックス
私は3Dプリンターを持っていなかったので、これは私にとって大きな問題でした。最初はポリマー粘土で作ってみましたが、形がよくありませんでした。それに、オーブンで焼きました。
<図> <図> <図>2番目の試みは6mm合板でした。たいていは大丈夫でしたが、切るのは大変でした。電気のこぎりとドレメルツールを使わなければなりませんでした。
<図> <図> <図> <図> <図> <図> <図> <図>最後の最も成功したものは、電気機器なしで切断でき、カッターナイフとサンドペーパーのみを使用した3mm合板(見つけるのが困難でした)からのものでした。アクリル絵の具で覆った結果、見た目が格段に良くなりました。
<図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>
費用
- Arduino Mega 2560 R3-8,27 $(480Rub)
- ディスプレイTFT3.2 480x320-8 $(400Rub)
- RTCDS1307モジュール-0,55 $(32Rub)
- CO2mh-z19センサー-20 $(1160Rub)
- 温度および湿度センサーSi7021-2 $(118Rub)
- カプセル内の温度センサーDS18b20-1,14 $(66Rub)
- フォトレジスタ-1 $ / 50個(65Rub)
- LED-0,67 $ / 100個(39Rub)
- ステンレス鋼の押しボタン-5,07 $ / 3pcs(294Rub)
- GX12-3ピン航空プラグ(セット)-1,17 $(68Rub)
- DCコネクタ1,25 $ / 10pcs(73Rub)
- LM2596DC-DC調整可能電圧レギュレータ-0,69 $(40Rub)
- 電源アダプター12v-2,14 $(120Rub)
- ワイヤー-1,78 $(100Rub)
- 合板3mm-1,78 $(100Rub)
合計55,51 $(3155摩擦)
コード
- エアサーファーコード
エアサーファーコード Arduino
#include#include "RTClib.h" //#include #include #include #include #include #include #include #define ONE_WIRE_BUS 9#define GREENLED 5#define YELLOWLED 7#define REDLED 8#define BUTTONLED 11OneWire oneWire(ONE_WIRE_BUS); DallasTemperatureセンサー(&oneWire); UTFT myGLCD(CTE32HR、38、39、40、41); HTU21D myHumidity; RTC_DS1307 rtc; extern uint8_t Ubuntu [];バイトcmd [9] ={0xFF、0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; unsigned char response [9]; unsigned int ppm; unsigned long time; int photocellReading; int hourupg; int minupg; float humd; float temp; int tcolor; int Z; // LED輝度ブールリセット=false; //表示をリセットする場合; voidlamps(void){// CO2if(ppm <800){myGLCD.setColor(255,140,255); //緑のmyGLCD.fillCircle(450、87、12); analogWrite(GREENLED、Z); analogWrite(YELLOWLED、0); analogWrite(REDLED、0); } if(ppm> 800&ppm <1200){myGLCD.setColor(70,70,255); //黄色のmyGLCD.fillCircle(450、87、12); analogWrite(GREENLED、0); analogWrite(YELLOWLED、Z); analogWrite(REDLED、0);} if(ppm> 1200){myGLCD.setColor(VGA_AQUA); myGLCD.fillCircle(450、87、12); analogWrite(GREENLED、0); analogWrite(YELLOWLED、0); analogWrite(REDLED、Z); } //ハムif(humd> 30&humd <50){myGLCD.setColor(255,140,255); //緑のmyGLCD.fillCircle(450、149、12); } if(humd> 20&humd <30){myGLCD.setColor(70,70,255); //黄色のmyGLCD.fillCircle(450、149、12); } if(humd <20){myGLCD.setColor(70,70,255); //黄色のmyGLCD.fillCircle(450、149、12); } if(humd> 50&humd <60){myGLCD.setColor(70,70,255); //黄色のmyGLCD.fillCircle(450、149、12); } if(humd> 60){myGLCD.setColor(VGA_AQUA); myGLCD.fillCircle(450、149、12); } // Temp ins if(temp> 20&temp <27){myGLCD.setColor(255,140,255); //緑のmyGLCD.fillCircle(450、213、12); } else {myGLCD.setColor(70,70,255); //YellowmyGLCD.fillCircle(450、213、12); } // Tempouts if(sensors.getTempCByIndex(0)<10){myGLCD.setColor(70,70,255); //YellowmyGLCD.fillCircle(450、278、12);} else {myGLCD.setColor(255,140,255); //緑myGLCD.fillCircle(450、278、12);}} void drawmain(void){myGLCD.setFont(Ubuntu); if(tcolor ==0)myGLCD.setColor(VGA_BLACK); if(tcolor ==1) myGLCD.setColor(VGA_SILVER); if(tcolor ==2)myGLCD.setColor(250,10,250); if(tcolor ==3)myGLCD.setColor(200,100,200); if(tcolor ==4)myGLCD.setColor(100,200,200); if(tcolor ==5)myGLCD.setColor(10,200,200); if(tcolor ==6)myGLCD.setColor(200,200,100); if(tcolor ==7)myGLCD.setColor(250,250,10); if(tcolor ==8)myGLCD.setColor(10,10,250); if(tcolor ==9)myGLCD.setColor(10,250,10); if(tcolor ==10)myGLCD.setColor(250,10,10); if(tcolor ==11)myGLCD.setColor(VGA_TEAL); if(tcolor ==12)myGLCD.setColor(VGA_AQUA); DateTime now =rtc.now(); // Timeif(now.hour()<10){myGLCD.print( "0"、190、7); myGLCD.printNumI(now.hour()、215、7); } else {myGLCD.printNumI(now.hour()、190、7); } myGLCD.print( ":"、240、5); if(now.minute()<10){myGLCD.print( "0"、265、7); myGLCD.printNumI(now.minute()、290、7); } else {myGLCD.printNumI(now.minute()、265、7); } // myGLCD.setColor(VGA_BLACK); myGLCD.print( "CO2"、18、74); if(ppm> 999){myGLCD.printNumI(ppm、250、74);} else {myGLCD.print( ""、250、74); myGLCD.printNumI(ppm、275、74);} myGLCD.print( " ppm "、348、74); myGLCD.print(" Humidity "、18、136); myGLCD.printNumI(humd、343、136); //humdmyGLCD.print("%"、398、136); myGLCD.print( "Temp(in)"、18、200); if(temp> =0){if(temp <10){myGLCD.print( ""、275、200); myGLCD.print( "+"、300、200); //tempmyGLCD.printNumF(temp,1、325、200);} else {myGLCD.print( "+"、275、200); //tempmyGLCD.printNumF(temp,1、300、200);}} if(temp <0){if(temp> -10){myGLCD.print( ""、275、200); myGLCD.printNumF(temp、 1、300、200);} else {myGLCD.printNumF(temp、1、275、200);}} myGLCD.print( "C"、398、200); myGLCD.print( "Temp(out)"、18 、265); if(sensors.getTempCByIndex(0)<-100){myGLCD.print( "Empty"、300、265);} else {if(sensors.getTempCByIndex(0)> =0){if(sensors。 getTempCByIndex(0)<10){myGLCD.print( ""、275、200); myGLCD.print( "+"、300、265); myGLCD.printNumF(sensors.getTempCByIndex(0)、1、325、265);} else {myGLCD.print( "+"、275、265); myGLCD.printNumF(sensors.getTempCByIndex(0)、1、300、265);}} if(sensors.getTempCByIndex(0)<0){if (sensors.getTempCByIndex(0)>-10){myGLCD.print( ""、275、200); myGLCD.printNumF(sensors.getTempCByIndex(0)、1、300、265);} else {myGLCD.printNumF(sensors .getTempCByIndex(0)、1、275、265);}} myGLCD.print( "C"、398、265);}} void dateandtime(void){DateTime now =rtc.now(); hourupg =now.hour (); minupg =now.minute(); //時間調整if(digitalRead(3)==LOW){if(minupg ==59){minupg =0; } else {minupg =minupg + 1; } rtc.adjust(DateTime(0,0,0、hourupg、minupg、0)); } if(digitalRead(2)==LOW){if(hourupg ==23){hourupg =0; } else {hourupg =hourupg + 1; } rtc.adjust(DateTime(0,0,0、hourupg、minupg、0)); }} void co2(void){Serial3.write(cmd、9); memset(response、0、9); Serial3.readBytes(response、9); int i;バイトcrc =0; for(i =1; i <8; i ++)crc + =response [i]; crc =255-crc; crc ++; if(!(response [0] ==0xFF &&response [1] ==0x86 &&response [8] ==crc)){} else {unsigned int responseHigh =(unsigned int)response [2]; unsigned int responseLow =(unsigned int)response [3]; ppm =(256 * responseHigh)+ responseLow; }} void th(void){humd =myHumidity.readHumidity(); temp =myHumidity.readTemperature(); Sensors.requestTemperatures(); //温度測定値を取得するコマンドを送信します} void photosensor(void){photocellReading =analogRead(12); if(photocellReading <150){// Serial.println( "-Dark"); analogWrite(BUTTONLED、5); Z =25; } else if(photocellReading <300){// Serial.println( "--Dim"); analogWrite(BUTTONLED、50); Z =80; } else if(photocellReading <700){// Serial.println( "--Light"); analogWrite(BUTTONLED、100); Z =120; } else if(photocellReading <900){// Serial.println( "--Bright"); analogWrite(BUTTONLED、150); Z =150; } else {// Serial.println( "-非常に明るい"); analogWrite(BUTTONLED、200); Z =200; } // Serial.print(photocellReading);} void screenreset(void){if(((hourupg ==0 &&minupg ==0)||(hourupg ==12 &&minupg ==0))&&Reset ==false ){myGLCD.clrScr(); myGLCD.fillScr(VGA_WHITE); //ディスプレイの色が反転しているためmyGLCD.setBackColor(VGA_WHITE); //ディスプレイの色が反転しているためReset =true;} if((hourupg ==0 || hourupg ==12)&&minupg> 0){Reset =false; }} void setup(void){myGLCD.InitLCD(); myGLCD.clrScr(); myGLCD.fillScr(VGA_WHITE); //ディスプレイの色が反転しているためmyGLCD.setBackColor(VGA_WHITE); //ディスプレイの色が反転しているためSerial3.begin(9600); // Serial.begin(9600); Sensors.begin(); myHumidity.begin(); tcolor =0; rtc.begin(); pinMode(GREENLED、OUTPUT); pinMode(YELLOWLED、OUTPUT); pinMode(REDLED、OUTPUT); pinMode(BUTTONLED、OUTPUT); pinMode(2、INPUT_PULLUP); pinMode(3、INPUT_PULLUP ); pinMode(4、INPUT_PULLUP); Z =0;} void loop(void){co2(); photosensor(); dateandtime(); th(); if(digitalRead(4)==LOW){tcolor =tcolor + 1; } if(tcolor> =13)tcolor =0; drawmain(); lamps(); screenreset();}
回路図
製造プロセス