ArduinoとThingSpeakで作るリアルタイム気象モニタリングシステム
必要な部品と材料
| Arduino UNO | ×1 |
| Espressif ESP8266 ESP-01(Wi-Fiモジュール) | ×1 |
| DHT11 温湿度センサー(3ピンタイプ) | ×1 |
| ブレッドボード | ×1 |
| ジャンパーワイヤー | ×1セット |
| ブレッドボード用電源モジュール 5V/3.3V | ×1 |
使用アプリとオンラインサービス
- ThingSpeak API
- Arduino IDE
- Microsoft Windows 10
プロジェクト概要
IoTへの第一歩
IoT初心者にとって、膨大な選択肢からどこから始めればよいか迷うものです。ThingSpeakなら安価で理解しやすく、しかも「かっこいい」最初のプロジェクトになります。
必要なもの
- Arduino UNO
- ESP-01
- DHT-11センサー
- ブレッドボード
- ブレッドボード用電源モジュール
- ジャンパーワイヤー
重要: ESP-01のピーク電流はArduinoからの給電では賄えません。必ず外部電源(ブレッドボード用電源モジュール等)を使用してください。
配線
ESP-01接続
- VCC → 3.3V
- GND → GND
- CH_PD → 3.3V
- RESET → 3.3V
- TX → Arduino D2
- RX → Arduino D3
DHT-11接続
- VCC → 5V
- OUT → A0
- GND → GND
ブレッドボード電源モジュールのジャンパーを3.3V側に設定するのを忘れずに。
ThingSpeakセットアップ
- ThingSpeakでアカウント作成
- New Channel作成、フィールドを「Temperature」「Humidity」の2つに設定
- API Keysタブの「Write API Key」をメモ(後でコードに貼り付け)
Arduino IDEライブラリ設定
以下2つのライブラリをZIP形式でダウンロードし、IDEの「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」で追加:
SoftwareSerial.hは標準ライブラリなので追加不要。
コードの準備と書き込み
コード: GitHub または以下をコピー
書き込み前の修正箇所
- Write API Keyをコード内の
myAPIkeyに貼り付け - Wi-FiのSSIDとパスワードを設定
String myAPIkey = "Your Write API key here";
#include <SoftwareSerial.h>
#include <DHT.h>;
SoftwareSerial ESP8266(2, 3); // Rx, Tx
#define DHTTYPE DHT11
#define DHTPIN A0
DHT dht(DHTPIN, DHTTYPE,11);
float humidity, temp_f;
long writingTimer = 17; // 17秒間隔(ThingSpeak無料版は15秒以上)
long startTime = 0;
long waitTime = 0;
boolean relay1_st = false;
boolean relay2_st = false;
unsigned char check_connection=0;
unsigned char times_check=0;
boolean error;
void setup() {
Serial.begin(9600);
ESP8266.begin(9600);
dht.begin();
startTime = millis();
ESP8266.println("AT+RST");
delay(2000);
Serial.println("Connecting to Wifi");
while(check_connection==0) {
Serial.print(".");
ESP8266.print("AT+CWJAP=\"Wifi Network's name\",\"PassWord\"\r\n");
ESP8266.setTimeout(5000);
if(ESP8266.find("WIFI CONNECTED\r\n")==1) {
Serial.println("WIFI CONNECTED");
break;
}
times_check++;
if(times_check>3) {
times_check=0;
Serial.println("Trying to Reconnect..");
}
}
}
void loop() {
waitTime = millis()-startTime;
if (waitTime > (writingTimer*1000)) {
readSensors();
writeThingSpeak();
startTime = millis();
}
}
void readSensors(void) {
temp_f = dht.readTemperature();
humidity = dht.readHumidity();
}
void writeThingSpeak(void) {
startThingSpeakCmd();
String getStr = "GET /update?api_key=";
getStr += myAPIkey;
getStr += "&field1=";
getStr += String(temp_f);
getStr += "&field2=";
getStr += String(humidity);
getStr += "\r\n\r\n";
GetThingspeakcmd(getStr);
}
void startThingSpeakCmd(void) {
ESP8266.flush();
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += "184.106.153.149"; // api.thingspeak.com IP
cmd += "\",80";
ESP8266.println(cmd);
Serial.print("Start Commands: ");
Serial.println(cmd);
if(ESP8266.find("Error")) {
Serial.println("AT+CIPSTART error");
return;
}
}
String GetThingspeakcmd(String getStr) {
String cmd = "AT+CIPSEND=";
cmd += String(getStr.length());
ESP8266.println(cmd);
Serial.println(cmd);
if(ESP8266.find(">")) {
ESP8266.print(getStr);
Serial.println(getStr);
delay(500);
String messageBody = "";
while (ESP8266.available()) {
String line = ESP8266.readStringUntil('\n');
if (line.length() == 1) {
messageBody = ESP8266.readStringUntil('\n');
}
}
Serial.print("MessageBody received: ");
Serial.println(messageBody);
return messageBody;
} else {
ESP8266.println("AT+CIPCLOSE");
Serial.println("AT+CIPCLOSE");
}
}
動作確認
書き込み成功後、ThingSpeakのチャネルページで温度・湿度グラフが15秒間隔で更新されます。
問題があればコメント欄で質問してください。詳細はvirginrobotics.blogspot.comも参照。
回路図
コード: GitHub
製造プロセス
- Raspberry Pi 2とADS-WS1で屋外気象観測ステーションを構築
- Raspberry Piで気象観測ステーションを構築し、日次天気データをメール送信
- 高度気象ステーション v2.0:温度・気圧・湿度・高度のリアルタイム監視
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduino駆動3Dプリントロボットアームの製作:ステップバイステップガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- 10ドルで作る携帯型Arduino気象観測ステーション – Nano、DHT22、BMP180、LCDで簡単DIY
- eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)
- ゲーム用カスタムArduinoジョイスティックハンドルの製作