ArduinoUNOミニウェザーステーション
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
<図>
これは、Wi-Fi接続を備えたArduinoベースのミニウェザーステーションの第1世代であり、ThingSpeakプラットフォームを使用してオンラインでデータを公開することができます。
気象観測所は、さまざまなセンサーを使用して、気象と環境に関連する次のデータを収集します。
- 温度
- 湿度
- 大気圧
- 光の強さ
- UVインデックス
- 粉塵濃度
目的は、オープンハードウェアを使用して、小さくてシンプルな気象観測所を作成することです。
始めて楽しんでみましょう!
電子部品 <図> <図> <図> <図> <図> <図> <図> <図>
このプロジェクトの組み立てに特定のツールは必要ありません。すべてのコンポーネントは、お気に入りのeコマースストアでオンラインで見つけることができます。
回路はUSBポート(コンピューターまたは通常の電話充電器に接続)から電力を供給されますが、外部DC電源またはArduino電源ジャックに接続されたバッテリーを追加することもできます。
ウェザーステーションサーキットのケースは、このプロジェクトの範囲外です。
パーツの接続 <図> <図>
回路図に従ってすべてのコンポーネントを接続します。各センサーをブレッドボードに接続するには、ジャンパー線が必要です。プロトシールド(よりコンパクトな回路用)、通常のブレッドボードを使用するか、Arduinoシールドを独自に設計することができます。
USBケーブルをArduinoUnoボードに接続し、次の手順に進みます。
コード <図>
最新のArduinoIDEをすでにインストールしている場合は、次のライブラリをダウンロードしてインストールします。
- DHT22ライブラリ
- AdafruitBMP085ライブラリ
ライブラリをArduinoIDEに追加する方法については、次のArduinoガイドを確認してください。
Arduinoコードをダウンロードします( weatherBox.ino
)コードセクションに含まれています。 XXXXX
を置き換えます WiFiルーターのSSIDで、 YYYYY
ルーターのパスワード、および ZZZZZ
ThingSpeakチャネルでAPIキーを書き込みます(次のステップで取得する方法を参照してください)。
ArduinoボードをコンピューターのUSBポートに接続し、コードをアップロードします。
ThingSpeakの構成 <図> <図> <図> <図>
- ThingSpeakアカウントを作成する
- 新しいチャンネルを作成する
気象観測所の名前と説明を指定します。次のチャネルを割り当てて、チャネルを保存します。
- チャンネル1 =光
- チャネル2 =湿度
- チャネル3 =温度(DHT22から)
- チャンネル4 =UVインデックス
- チャネル5 =粉塵濃度
- チャネル6 =圧力
- チャネル7 =温度(BMP085から)
API書き込みキーをコピーします。これは、Arduinoコードの前のステップで使用されます。ステーションの電源がオンになると、センサー値が定期的にチャネルにアップロードされます。各変数のパブリックおよびプライベートの視覚化を構成できます。
公開チャンネルの例:https://thingspeak.com/channels/35540
Androidアプリの使用
どのブラウザでも気象観測所のデータを視覚化できます。ただし、Androidベースのスマートフォンで確認して、いつでも視覚化することもできます。
- AndroidデバイスのGooglePlayストアからThingsViewアプリをダウンロードしてインストールします
- アプリで、チャンネルID番号を挿入し、[追加]をクリックします。 IDはThingSpeakチャネル構成にあります
- 各変数の現在の値がグラフに表示されます
楽しんでください!
コード
- weatherBox.ino
weatherBox.ino Arduino
#include#include #include #include #include #include #define SSID "XXXXX "// XXXXXをルーターに置き換えますSSID#define PASS" YYYYY "// YYYYYをルーターに置き換えますpassword#define IP" 184.106.153.149 "// thingspeak.com IP#define DHT22_PIN 2String GET =" GET / update?key =ZZZZZ&field1 ="; // ZZZZZをThingSpeakチャネルに置き換えますwritekeySoftwareSerial monitor(10、11); // ESP8266モジュール(RX、TX)へのシリアル通信dht DHT; Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified(10085); // VariablesintluminancePin =A0; int uvPin =A1; int dustPin =8; unsigned long duration; unsigned long starttime; unsigned sampletime_ms =30000; unsigned long delay_time =60000; unsigned long lowpulseoccupancy =0; float ratio =0; floatdensity =0; // setupvoid setup(){//シリアル通信を開始Serial.begin(9600); monitor.begin(9600); Serial.println( "初期化中..."); // Arduinoピンを構成しますpinMode(dustPin、INPUT); //圧力センサーを初期化しますSerial.println( "BMP085圧力センサーを検出しています..."); if(!bmp.begin()){Serial.println( "BMP085センサーが検出されませんでした。接続またはI2CADDDRを確認してください!"); while(1); } Serial.println( "BMP085が検出されました!"); // Wi-Fiモジュールとの通信monitor.flush(); monitor.println( "AT"); delay(2000); if(monitor.find( "OK")){Serial.println( "ESP8266モジュールとの通信:OK"); } else {Serial.println( "ESP8266モジュールエラー"); } // Wi-Fiルーターを接続するconnectWiFi(); Serial.print( "Sampling("); Serial.print(sampletime_ms / 1000); Serial.println( "s)..."); //タイマーの開始時間を初期化=millis();} void loop(){//ダスト粒子の持続時間を測定=pulseIn(dustPin、LOW);低パルス占有率=低パルス占有率+持続時間; // 30秒のcicleif((millis()-starttime)> =sampletime_ms){ratio =lowpulseoccupancy /(sampletime_ms * 10.0); //パーセンテージ(de 0 a 100%)濃度=1.1 * pow(ratio、3)-3.8 * pow(ratio、2)+ 520 * ratio + 0.62; //データシートからlowpulseoccupancy =0; //他のセンサーを読み取るcharbuffer [10]; //光センサーフロート輝度=analogRead(luminancePin); // UVセンサーfloatuv =analogRead(uvPin); uv =uv * 0.0049; //値をボルトに変換しますuv =uv * 307; // mW /m²に変換uv =uv / 200; // UVインデックスを計算します//温度と湿度intchk =DHT.read22(DHT22_PIN);フロート湿度=DHT.humidity;フロート温度=DHT.temperature; //圧力と温度1sensors_event_tevent; bmp.getEvent(&event);フロート圧力=0;フロート温度1 =0; if(event.pressure){pressure =event.pressure; bmp.getTemperature(&temperature1); } //センサー値を文字列に変換するStringluminanceStr =dtostrf(luminance、4、1、buffer); luminanceStr.replace( ""、 "");文字列uvStr =dtostrf(uv、4、1、buffer); uvStr.replace( ""、 "");文字列humidityStr =dtostrf(humidity、4、1、buffer);湿度Str.replace( ""、 "");文字列temperatureStr =dtostrf(temperature、4、1、buffer); temperatureStr.replace( ""、 "");文字列dustStr =dtostrf(concentration、4、1、buffer); dustStr.replace( ""、 "");文字列pressureStr =dtostrf(pressure、4、1、buffer); pressureStr.replace( ""、 "");文字列temperature1Str =dtostrf(temperature1、4、1、buffer); temperature1Str.replace( ""、 ""); //データをThingSpeakに送信updateSensors(luminanceStr、HydriumStr、temperatureStr、uvStr、dustStr、pressureStr、temperature1Str); //次のサンプリングサイクルを待つSerial.print( "Wait"); Serial.print(delay_time / 1000); Serial.println( "次のサンプリング用"); Serial.println(); delay(delay_time); //新しいサイクルを初期化しますSerial.println(); Serial.print( "Sampling("); Serial.print(sampletime_ms / 1000); Serial.println( "s)..."); starttime =millis(); }} // ThingSpeakvoidにデータを送信updateSensors(StringluminanceStr、StringhimureStr、StringtemperatureStr、String uvStr、StringdustStr、StringpressureStr、Stringtemperature1Str){String cmd ="AT + CIPSTART =\" TCP \ "、\" "; cmd + =IP; cmd + ="\"、80 "; monitor.println(cmd); delay(2000); cmd =GET; cmd + =luminanceStr; cmd + ="&field2 ="; cmd + =湿度Str; cmd + ="&field3 ="; cmd + =temperatureStr; cmd + ="&field4 ="; cmd + =uvStr; cmd + ="&field5 ="; cmd + =dustStr; cmd + ="&field6 ="; cmd + =pressureStr; cmd + ="&field7 ="; cmd + =temperature1Str; cmd + ="\ r \ n"; delay(1000); int strsize =cmd.length(); monitor.println( "AT + CIPSEND =" + String(strsize)); delay(2000); monitor.print(cmd); if(monitor.find( "OK")){Serial.println( "送信が正常に完了しました"); } else {Serial.println( "送信に失敗しました!"); }} void sendDebug(String cmd){Serial.print( "SEND:"); Serial.println(cmd); monitor.println(cmd);} boolean connectWiFi(){Serial.println( "Connecting wi-fi ..."); String cmd ="AT + CWMODE =1"; monitor.println(cmd); delay(2000); monitor.flush(); //バッファをクリアしますcmd ="AT + CWJAP =\" "; cmd + =SSID; cmd + =" \ "、\" "; cmd + =PASS; cmd + =" \ ""; monitor.println(cmd); delay(5000); if(monitor.find( "OK")){Serial.println( "接続に成功しました!"); trueを返します。 } else {Serial.println( "接続に失敗しました!"); falseを返します。 } Serial.println();}
Github
https://github.com/adafruit/DHT-sensor-libraryhttps://github.com/adafruit/DHT-sensor-libraryGithub
https://github.com/adafruit/Adafruit-BMP085-Libraryhttps://github.com/adafruit/Adafruit-BMP085-Library製造プロセス