Arduino UNOミニ気象観測ステーション – ESP8266でIoT対応
必要な部品と材料
- Arduino UNO × 1
- Espressif ESP8266 ESP-01 × 1
- Arduinoプロトシールド(またはブレッドボード) × 1
- DHT22温度センサ × 1
- Seeed Grove 照度センサ × 1
- Seeed Grove UVセンサ × 1
- Seeed Grove 気圧センサ(BMP085) × 1
- Seeed Grove 粉塵センサ × 1
- 抵抗 1kΩ × 2
- 抵抗 10kΩ × 1
- 抵抗 4.75kΩ × 1
- ジャンパーワイヤ × 1式
使用するサービス
- Arduino IDE
- ThingSpeak API
プロジェクトの概要

これは第1世代のArduinoベース・ミニ気象観測ステーションで、Wi-Fi接続によりThingSpeakプラットフォームへデータを公開します。以下の環境データを各種センサで取得します:
- 温度
- 湿度
- 大気圧
- 照度
- UV指数
- 粉塵濃度
オープンハードウェアで小型・シンプルな気象観測ステーションを作るのが目的です。さあ始めましょう!
電子部品


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


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

最新のArduino IDEをインストール済みとして、以下のライブラリを追加インストールしてください:
- DHT22ライブラリ
- Adafruit BMP085ライブラリ
ライブラリ追加方法はArduino公式ガイドを参照。
weatherBox.ino(コードセクションにあります)をダウンロードし、以下を書き換えてください:
XXXXX→ WiFiルータのSSIDYYYYY→ ルータのパスワードZZZZZ→ ThingSpeakチャネルのWrite API Key(取得方法は次項)
ArduinoをPCのUSBポートに接続し、コードをアップロード。
ThingSpeak設定




- ThingSpeakアカウントを作成
- 新規チャネルを作成
- 気象観測ステーションの名前と説明を入力。以下のフィールドを割り当てて保存:
- Field 1 = 照度
- Field 2 = 湿度
- Field 3 = 温度(DHT22)
- Field 4 = UV指数
- Field 5 = 粉塵濃度
- Field 6 = 気圧
- Field 7 = 温度(BMP085)
- API Write Keyをコピーし、Arduinoコードの
ZZZZZに貼り付け
電源投入後、センサ値が定期的にチャネルにアップロードされます。各変数の公開・非公開グラフを設定可能。公開チャネル例: https://thingspeak.com/channels/35540
Androidアプリでの確認
- Google PlayからThingsViewアプリをインストール
- アプリでチャネルIDを入力し「追加」(IDはThingSpeakチャネル設定画面で確認)
- 各変数の現在値がグラフで表示されます
ソースコード(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(); }
ライブラリリンク
回路図

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