工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ローカル気象台

コンポーネントと消耗品

>
Arduino Nano R3
× 1
Seed Grove-バロメーターセンサー(BMP280)
× 1
DHT11温度および湿度センサー(4ピン)
× 1
ElectroPeak 0.96 "OLED64x128ディスプレイモジュール
× 1
GUVA-S12SDUVセンサー
× 1
DS3231 RTC
× 1

必要なツールとマシン

>
はんだごて(汎用)
はんだワイヤー、鉛フリー
3Dプリンター(汎用)

アプリとオンラインサービス

>
Arduino IDE
Autodesk Fusion 360

このプロジェクトについて

長い間、インターネットを使わずに気象観測所を作りたかったのです。周囲の気象データを測定し、必要に応じてデータを確認するのは素晴らしいことです。そこで、周囲の気圧、気温、湿度、その日のUVインデックス(窓の近くに置いた場合)を測定できる、かっこいい地元の気象観測所を作りました。それがもっとあるのを待ってください! 😉また、時刻、日付、曜日を表示するための時計画面があります。

<図> <図> <図> <図> <図> <図> <図> <図>

このチュートリアルでは、これらの手順でこの涼しい気象観測所を作成する方法を紹介します。

ステップ1:エンクロージャーの構築

Autodesk Fusion 360 を使用しています エンクロージャーを作成し、緑色のPLAで印刷します。サポートが必要で、Ender 3に70mm / sの速度で20%のインフィルで印刷します。このプロジェクトには、エンクロージャーのSTLファイルがあります。

<図> <図>

ステップ2:BMP280

BMP280は大気圧および温度センサーであり、I2CまたはSPIプロトコルを使用してArduinoと通信します。ここではSPIを使用しています。 SPIを使用するには、接続します-

  • CSからD10
  • SDAからD11
  • SDOからD12
  • SCKからD13

コード部分では、このセンサーを使用するためにライブラリが必要です。まず、ライブラリをコード #include に含めます。 。ここからライブラリをダウンロードできます。

次に、センサーのSPIピンを定義します。セットアップ関数では、BMPセンサーを初期化し、ループ関数では、 bmp.readPressure()を使用して圧力と温度のデータを読み取ります。 および bmp.readTemperature() 指図。圧力値を100で割って、hPa単位の圧力を測定します。高度を測定するには、 bmp.readAltitude(1005.47)を使用します 指図。ここで、値(1005.47)を変更する必要があります お住まいの地域の平均気圧に応じて。

ステップ3:DS3231 RTC

この気象観測所には、弱者の現在の時刻、日付、および曜日を表示できる時間画面もあります。この目的のために、I2Cプロトコルを使用して通信するDS231RTCモジュールを使用します。これを使用するには、接続します-

  • SCLからA5
  • SDAからA4

まず、 DS3231_set.ino を使用して、RTCで日時を設定する必要があります。 ライブラリの例からのプログラム。

メインプログラムには、ライブラリ #include を含めます。 ライブラリからの指示に従って時間データを読み取ります。ここでは、ライブラリの例をコードのリファレンスとして使用します。現在の日を見つけるために、曜日ごとにケースを作成しました。

ステップ4:DHT11

このセンサーを使って湿度を測定しています。そのために、私はそのデータ出力を接続します Arduinoへ D2 。そして、プログラムには、DHTライブラリ #include を含めます。 次に、セットアップでセンサーを初期化し、ループで dht.readHumidity()を使用して湿度値を読み取ります。 コマンド。

ステップ5:GUVA-S12SDUVセンサー

GUVA-S12SD 窒化ガリウムベースのショットキー型フォトダイオードです。それは240-370nmの典型的なUV検出波長を持っています(これはUVBとほとんどのUVAスペクトルをカバーします)。これは、UV光の強度に応じて変化する校正済みのアナログ電圧を出力します。したがって、ArduinoADCを介してアナログ値を読み取ることができます。

ループ関数では、センサー値をアナログで読み取り、UVインデックスを計算します

  float SensorValue =analogRead(A0); 
float SensorVoltage =SensorValue / 1024 * 5.0;
int UV_index =SensorVoltage / 0.1;

ステップ6:OLEDディスプレイ

このプロジェクトでは0.96 "128 * 64 OLEDディスプレイを使用しています。I2Cプロトコルを使用しているため、次のようにArduinoに接続します-

  • SCKからA5
  • SDAからA4

プログラムには、最初にAdafruit_SSD1306とAdafruit_GFXライブラリを含めます

  #include  
#include

次に、表示変数を作成し、画像を表示するためのビットマップも追加します。セットアップでは、表示を初期化します。次に、ループで、 display.print()を使用してすべてのデータを表示します 関数。時間、気圧、温度と湿度、UV_indexの4ページにデータを表示します。すべてのページの間に5秒の遅延があります。

ビデオクリップ

コード

  • 地域の気象観測所コード
地域の気象観測所コード Arduino
 #include  #include  #include  #include  #include  #include  #include  #include  #include  //#include  #define SCREEN_WIDTH 128#define SCREEN_HEIGHT 64#define OLED_RESET 4Adafruit_ 、OLED_RESET); #define BMP_SCK(13)#define BMP_MISO(12)#define BMP_MOSI(11)#define BMP_CS(10)DS3231 clock; bool Century =false; bool h12Flag; bool pmFlag; Adafruit_BMP280 bmp(BMP_CS、BMP_MOSI、 、BMP_SCK); #define DHTPIN 2#define DHTTYPE DHT11DHT dht(DHTPIN、DHTTYPE); const unsigned char PROGMEM frame0 [] ={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、 0x01、0xFF、0x80、0x00、0x00、0x0F、0xFF、0xF0、0x00、0x00、0x3F、0xFF、0xFC、0x00、0x00、0x7F、0x81、0xFE、0x00、0x00、0xFC、0x00、0x3F 0xF0、0x00、0x0F、0x80、0x03、0xE0、0x18、0x07、0xC0、0x07 、0x86、0x18、0x61、0xE0、0x0F、0x02、0x00、0x40、0xF0、0x0F、0x02、0x00、0x40、0xF0、0x1E、0x00、0x00、0x00、0x78、0x1C、0x40、0x00 、0x61、0x00、0x06、0x3C、0x3C、0x01、0x80、0x00、0x3C、0x38、0x00、0x80、0x00、0x1C、0x38、0x00、0xC0、0x00、0x1C、0x78、0x00、0xE0 、0xC0、0xF0、0x03、0x9E、0x79、0xC0、0x7C、0x03、0x9E、0x78、0x00、0x7E、0x00、0x1E、0x38、0x00、0x7E、0x00、0x1C、0x38、0xFC、0xFC 、0xFC、0x7E、0x3F、0x3C、0x3C、0xFE、0x7E、0x7F、0x3C、0x1C、0x7E、0x18、0x7E、0x38、0x1E、0x3F、0x00、0xFC、0x78、0x0F、0x 、0x0F、0xFF、0xF8、0xF0、0x07、0x87、0xFF、0xE1、0xE0、0x03、0xC1、0xFF、0x83、0xC0、0x03、0xF0、0x3C、0x0F、0xC0、0x01、0xFC、0x 、0x7F、0x81、0xFE、0x00、0x00、0x3F、0xFF、0xFC、0x00、0x00、0x0F、0xFF、0xF0、0x00、0x00、0x01、0xFF、0x80、0x00、0x00、0x00、0x00、0x00 、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00}; const unsigned char PROGMEM frame1 [] ={0x0 0、0x00、0x00、0x00、0x00、0x00、0x00、0x18、0x00、0x00、0x00、0x00、0x7E、0x00、0x00、0x00、0x00、0xC3、0x00、0x00、0x01、0x00、0x9D、0x80 0x03、0x80、0xB4、0xE0、0x00、0x06、0x80、0xA6、0x80、0x00、0x04、0xC0、0xA6、0xE0、0x00、0x0C、0x40、0xA6、0xE0、0x00、0x08、0x60 0x08、0x20、0xA6、0xE0、0x00、0x08、0x60、0xA6、0x80、0x00、0x0E、0xC0、0xA6、0xE0、0x00、0x03、0x80、0xA6、0x80、0x00、0x00、0x10、0x 0x00、0x38、0xA6、0xE0、0x00、0x00、0x38、0xA6、0x80、0x00、0x00、0x6C、0xA6、0xE0、0x00、0x00、0x44、0xA6、0x80、0x00、0x00、0x6C、0x 0x00、0x38、0xA6、0x80、0x00、0x00、0x00、0xA6、0x80、0x00、0x00、0x00、0xA4、0xE0、0x00、0x00、0x00、0xA6、0x80、0x00、0x00、0x40、0xA6 0x00、0xC0、0xA6、0x80、0x00、0x01、0xA0、0xA6、0xE0、0x00、0x01、0x30、0xA6、0xE0、0x00、0x03、0x10、0xA6、0x80、0x00、0x02、0x18、0x 0x06、0x08、0xA6、0x80、0x00、0x06、0x08、0xA6、0x80、0x00、0x02、0x19、0xA6、0xC0、0x00、0x03、0xF3、0 x26、0x60、0x00、0x00、0xC6、0x26、0x30、0x00、0x00、0x0C、0xE3、0x10、0x00、0x00、0x09、0x80、0x98、0x00、0x00、0x19、0x00、0xC8、0x00、0x 0x00、0x6C、0x00、0x00、0x12、0x00、0x6C、0x00、0x00、0x12、0x00、0x6C、0x00、0x00、0x12、0x00、0x6C、0x00、0x00、0x1B、0x00、0x4C、0x00 0x80、0xC8、0x00、0x00、0x0C、0xC1、0x98、0x00、0x00、0x04、0x7F、0x30、0x00、0x00、0x06、0x1C、0x60、0x00、0x00、0x03、0x81、0xC0、0x00 0xFF、0x80、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00}; const unsigned char PROGMEM frame2 [] ={0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF 、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0xFF、0x80}; void setup(){Serial.begin(57600); if(!display.begin(SSD1306_SWITCHCAPVCC、0x3C)){Serial.println(F( "SSD1306 failed")); } Wire.begin(); dht.begin(); if(!bmp.begin()){Serial.println(F( "Problem.bmp")); while(1)delay(10); } display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0、9); display.setFont(&FreeSans9pt7b); display.println( "**** LOCAL ****"); display.setCursor(0、38); display.setFont(&FreeMonoBoldOblique12pt7b); display.println( "wather"); display.setCursor(27、58); display.println( "ステーション"); display.display(); delay(2000); bmp.setSampling(Adafruit_BMP280 ::MODE_NORMAL、/ *動作モード。* / Adafruit_BMP280 ::SAMPLING_X2、/ *温度オーバーサンプリング* / Adafruit_BMP280 ::SAMPLING_X16、/ *圧力オーバーサンプリング* / Adafruit_BMP280 ::FIL_ Adafruit_BMP280 ::STANDBY_MS_500); /* 待機時間。 * /} void loop(){//時間display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(13、15); display.setFont(&FreeMonoBoldOblique12pt7b); display.print(clock.getHour(h12Flag、pmFlag)); display.setCursor(38、15); display.println( ":"); display.setCursor(50、15); display.println(clock.getMinute()); display.setCursor(70、15); if(pmFlag){display.println( "PM"); } else {display.println( "AM"); } display.setFont(&FreeSans9pt7b); display.setCursor(20、60); display.println(clock.getDate()); display.setCursor(40、60); display.println( "/"); display.setCursor(46、60); display.println(clock.getMonth(century)); display.setCursor(65、60); display.println( "/"); display.setCursor(70、60); display.println( "20"); display.setCursor(90、60); display.println(clock.getYear()); display.setCursor(30、30); display.setFont(&FreeSans9pt7b); switch(clock.getDoW()){ケース1:display.println( "Saturday");壊す;ケース2:display.println( "Sunday");壊す;ケース3:display.println( "Monday");壊す;ケース4:display.println( "Tuesday");壊す;ケース5:display.println( "Wednesday");壊す;ケース6:display.println( "Thursday");壊す;ケース7:display.println( "Friday");壊す; } display.display(); delay(5000); // P display.clearDisplay(); display.drawBitmap(0、0、frame0、40、40、1); display.setFont(&FreeSans9pt7b); display.setCursor(41、28); display.println(bmp.readPressure()/ 100); display.setCursor(110、28); display.setFont(); display.println( "hPa"); display.setCursor(0、55); display.setFont(&FreeSans9pt7b); display.println( "高度:"); display.setCursor(65、62); display.println(bmp.readAltitude(1005.47)); display.setCursor(113、62); display.println( "m"); display.display(); delay(5000); // T&RH display.clearDisplay(); display.setFont(&FreeMonoBoldOblique12pt7b); display.drawBitmap(0、5、frame1、40、51、1); display.setCursor(35、30); display.print(bmp.readTemperature()); display.setFont(&FreeSans9pt7b); display.setCursor(102、28); display.println( "*"); display.setCursor(110、31); display.println( "C"); display.setFont(); display.setCursor(66、45); display.println( "RH:");バイトRH =dht.readHumidity(); display.setCursor(95、45); display.println(RH); display.setCursor(110、45); display.println( "%"); display.drawBitmap(0、56、frame2、135、15、1); display.display(); delay(5000); // UV display.clearDisplay(); float SensorValue =analogRead(A0); float SensorVoltage =SensorValue / 1024 * 5.0; int UV_index =SensorVoltage / 0.1; display.setFont(&FreeSans9pt7b); display.setCursor(0、15); display.print( "UV INDEX"); display.setCursor(58、45); display.println(UV_index); display.display(); delay(5000);} 

カスタムパーツとエンクロージャー

回路図


製造プロセス

  1. ラズベリーパイをベースにした気象観測所
  2. Raspberry Pi2ウェザーステーション
  3. ラズベリーパイウェザーステーション
  4. Weather Station V 2.0
  5. 6-シューター:Arduinoドリンクミキシングステーション
  6. マルチ温度センサー
  7. Arduino Powered Weather Balloon Datalogger
  8. $ 10ポータブルArduinoウェザーステーション(AWS)
  9. ThingSpeak Arduino Weather Station
  10. WiFiESP8266およびDHT22センサー
  11. SmartWristband