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

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応

必要な部品と材料

使用するサービス

プロジェクトの概要

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応

これは第1世代のArduinoベース・ミニ気象観測ステーションで、Wi-Fi接続によりThingSpeakプラットフォームへデータを公開します。以下の環境データを各種センサで取得します:

オープンハードウェアで小型・シンプルな気象観測ステーションを作るのが目的です。さあ始めましょう!

電子部品

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応

特別な工具は不要。全ての部品はオンラインショップで入手可能。電源はUSBポート(PCまたはスマホ充電器)から供給しますが、ArduinoのDCジャックに外部電源やバッテリーを接続することも可能です。ケース設計は本プロジェクトのスコープ外です。

部品の接続

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応

回路図に従い、ジャンパーワイヤで各センサをブレッドボード(またはプロトシールド、自作シールド)に接続。USBケーブルをArduino Unoに挿して次へ進みます。

コード

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応

最新のArduino IDEをインストール済みとして、以下のライブラリを追加インストールしてください:

ライブラリ追加方法はArduino公式ガイドを参照。

weatherBox.ino(コードセクションにあります)をダウンロードし、以下を書き換えてください:

ArduinoをPCのUSBポートに接続し、コードをアップロード。

ThingSpeak設定

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
  1. ThingSpeakアカウントを作成
  2. 新規チャネルを作成
  3. 気象観測ステーションの名前と説明を入力。以下のフィールドを割り当てて保存:
    • Field 1 = 照度
    • Field 2 = 湿度
    • Field 3 = 温度(DHT22)
    • Field 4 = UV指数
    • Field 5 = 粉塵濃度
    • Field 6 = 気圧
    • Field 7 = 温度(BMP085)
  4. API Write Keyをコピーし、ArduinoコードのZZZZZに貼り付け

電源投入後、センサ値が定期的にチャネルにアップロードされます。各変数の公開・非公開グラフを設定可能。公開チャネル例: https://thingspeak.com/channels/35540

Androidアプリでの確認

ソースコード(weatherBox.ino)

#include 
#include 
#include 
#include 
#include 
#include 

#define SSID "XXXXX"      // ルータSSIDに書き換え
#define PASS "YYYYY"      // ルータパスワードに書き換え
#define IP "184.106.153.149"  // thingspeak.com IP
#define DHT22_PIN 2

String GET = "GET /update?key=ZZZZZ&field1=";  // Write API Keyに書き換え
SoftwareSerial monitor(10, 11);  // ESP8266との通信 (RX, TX)

dht DHT;
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

// 変数
int luminancePin = A0;
int uvPin = A1;
int dustPin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;
unsigned long delay_time = 60000;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;

void setup() {
  Serial.begin(9600);
  monitor.begin(9600);
  Serial.println("Initializing...");
  pinMode(dustPin, INPUT);
  Serial.println("Detecting BMP085 pressure sensor...");
  if (!bmp.begin()) {
    Serial.println("BMP085 sensor wasn't detected. Verify your connections or I2C ADDR!");
    while (1);
  }
  Serial.println("BMP085 detected!");
  monitor.flush();
  monitor.println("AT");
  delay(2000);
  if (monitor.find("OK")) {
    Serial.println("Communication with ESP8266 module: OK");
  } else {
    Serial.println("ESP8266 module ERROR");
  }
  connectWiFi();
  Serial.print("Sampling (");
  Serial.print(sampletime_ms / 1000);
  Serial.println("s)...");
  starttime = millis();
}

void loop() {
  duration = pulseIn(dustPin, LOW);
  lowpulseoccupancy += duration;

  if ((millis() - starttime) >= sampletime_ms) {
    ratio = lowpulseoccupancy / (sampletime_ms * 10.0);
    concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62;
    lowpulseoccupancy = 0;

    char buffer[10];
    float luminance = analogRead(luminancePin);
    float uv = analogRead(uvPin);
    uv = uv * 0.0049;  // ボルト変換
    uv = uv * 307;     // mW/m²変換
    uv = uv / 200;     // UV指数計算

    int chk = DHT.read22(DHT22_PIN);
    float humidity = DHT.humidity;
    float temperature = DHT.temperature;

    sensors_event_t event;
    bmp.getEvent(&event);
    float pressure = 0;
    float temperature1 = 0;
    if (event.pressure) {
      pressure = event.pressure;
      bmp.getTemperature(&temperature1);
    }

    String luminanceStr = dtostrf(luminance, 4, 1, buffer); luminanceStr.replace(" ", "");
    String uvStr = dtostrf(uv, 4, 1, buffer); uvStr.replace(" ", "");
    String humidityStr = dtostrf(humidity, 4, 1, buffer); humidityStr.replace(" ", "");
    String temperatureStr = dtostrf(temperature, 4, 1, buffer); temperatureStr.replace(" ", "");
    String dustStr = dtostrf(concentration, 4, 1, buffer); dustStr.replace(" ", "");
    String pressureStr = dtostrf(pressure, 4, 1, buffer); pressureStr.replace(" ", "");
    String temperature1Str = dtostrf(temperature1, 4, 1, buffer); temperature1Str.replace(" ", "");

    updateSensors(luminanceStr, humidityStr, temperatureStr, uvStr, dustStr, pressureStr, temperature1Str);

    Serial.print("Wait ");
    Serial.print(delay_time / 1000);
    Serial.println("s for next sampling");
    Serial.println();
    delay(delay_time);
    Serial.println();
    Serial.print("Sampling (");
    Serial.print(sampletime_ms / 1000);
    Serial.println("s)...");
    starttime = millis();
  }
}

void updateSensors(String luminanceStr, String humidityStr, String temperatureStr,
                   String uvStr, String dustStr, String pressureStr, String temperature1Str) {
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += IP;
  cmd += "\",80";
  monitor.println(cmd);
  delay(2000);
  cmd = GET;
  cmd += luminanceStr;
  cmd += "&field2=";
  cmd += humidityStr;
  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("Transmission completed with success");
  } else {
    Serial.println("Transmission failed!");
  }
}

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("Connection succeeded!");
    return true;
  } else {
    Serial.println("Connection failed!");
    return false;
  }
  Serial.println();
}

ライブラリリンク

回路図

Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応

製造プロセス

  1. Raspberry Piで気象観測ステーションを構築し、日次天気データをメール送信
  2. Arduino Unoベースの人間検知レスキューロボット:センサー統合ステップバイステップ
  3. K30 CO2センサで室内空気質をリアルタイム監視する
  4. デジタル身長計の自作:Arduino Nanoとレーザー距離センサーで成長記録
  5. Arduino UNO WiFi Webサーバー:ブラウザからLEDをON/OFF制御
  6. Arduino UNOで作るシンプル電卓 - シリアルモニターで四則演算
  7. ESP32で作るIoT環境モニター:温湿度・気圧・CO2をWebダッシュボードで可視化
  8. Arduino UNOとATtiny85で作る携帯型POV(残像)ディスプレイ
  9. Arduino Nano製ウェザーステーション:気圧・温湿度・UV・時計表示付き
  10. スマート健康モニタリングステーション:Arduino、Bluetooth、センサーで構築
  11. ArduinoとBluetoothでスマートフォン温度監視システムを構築