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

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

必要な部品と材料

部品 数量 備考
Arduino UNO 1 メインMCU
ESP8266 ESP-01 1 WiFi通信モジュール
DHT22 温湿度センサー 1 気温・湿度用
DS18B20 防水温度センサー 1 土壌温度用
LDR(光センサー) 1 照度測定用
2チャネル 5V リレーモジュール 1 ポンプ・ランプ制御用

使用アプリ・オンラインサービス

プロジェクト概要

ローカルユニット(センサー・アクチュエーター)からデータを収集し、インターネット経由でクラウド(ThingSpeak)に送信。世界中どこからでもデータを確認し、遠隔でアクチュエーターを操作できるシステムを構築します。

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

以前はNodeMCUやESP32を使っていましたが、Arduino UNOとESP-01という初期の組み合わせで、より基礎的なIoTの仕組みを理解することを目的としています。

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ThingSpeakを中心に、ローカルユニットがセンサーデータを「書き込み」、アクチュエーター制御コマンドを「読み取り」ます。Androidアプリも同様にStatus Channelを読み取り、Actuator Channelに書き込みます。

Step 1: はじめに

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

以下のデータを収集・制御します。

センサー(5項目)

アクチュエーター(2項目)

アクチュエーターのON/OFF状態もクラウドに送信します。

判断ロジック:

遠隔操作用にAndroidアプリも作成します。

Step 2: 部品表(BoM)

主要部品の目安価格(USD):

Step 3: ハードウェア組み立て手順

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

段階的に組み立て・テストすることを推奨:

  1. センサーを個別に設置・テスト
  2. ESP-01をベアミニマム構成で設定・テスト
  3. ESP-01を最終配線に変更してテスト
  4. ThingSpeak Status Channel設定
  5. ArduinoにThingSpeak送信コードを書き込み、クラウドで確認
  6. Androidアプリ第1版(ステータス表示)作成
  7. アクチュエーター(LED、リレー)設置
  8. ThingSpeak Actuator Channel設定
  9. アクチュエーター制御コードを書き込みテスト
  10. Androidアプリ最終版作成

Step 4: センサー配線

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

必要なライブラリと初期設定:

// DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int soilTemp = 0;

// DHT22
#include "DHT.h"
#include <stdlib.h>
int pinoDHT = 11;
int tipoDHT = DHT22;
DHT dht(pinoDHT, tipoDHT);
int airTemp = 0, airHum = 0;

// LDR
#define ldrPIN A1
int light = 0;

// 土壌湿度
#define soilHumPIN A0
int soilHum = 0;

void setup() {
  Serial.begin(9600);
  DS18B20.begin();
  dht.begin();
}

void loop() {
  readSensors();
  displaySensors();
  delay(10000);
}

void readSensors() {
  airTemp = dht.readTemperature();
  airHum = dht.readHumidity();
  DS18B20.requestTemperatures();
  soilTemp = DS18B20.getTempCByIndex(0);
  soilHum = map(analogRead(soilHumPIN), 1023, 0, 0, 100);
  light = map(analogRead(ldrPIN), 1023, 0, 0, 100);
}

void displaySensors() {
  Serial.print("airTemp (oC): "); Serial.println(airTemp);
  Serial.print("airHum (%): "); Serial.println(airHum);
  Serial.print("soilTemp (oC): "); Serial.println(soilTemp);
  Serial.print("soilHum (%): "); Serial.println(soilHum);
  Serial.print("light (%): "); Serial.println(light);
  Serial.println("");
}

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Step 5: ESP-01初期設定(ATコマンド)

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ESP-01をシリアルブリッジ(ATコマンドモード)として使用します。工場出荷時は115,200 baudのことが多いため、9,600 baudに変更します。

  1. ArduinoにBareMinimumスケッチを書き込み(シリアル競合防止)
  2. ESP-01を接続し、シリアルモニタを115,200 baudで開く
  3. AT → OK確認
  4. ボーレート変更: AT+UART_DEF=9600,8,1,0,0
  5. シリアルモニタを9,600 baudに切り替え、ATで確認
  6. ステーションモード設定: AT+CWMODE=1
  7. WiFi接続: AT+CWJAP="SSID","PASSWORD"
  8. WIFI CONNECTED / WIFI GOT IP 確認
  9. IP確認: AT+CIFSR

Step 6: ESP-01動作テスト

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

最終配線:

ATコマンドパススルー用テストコード:

#include <SoftwareSerial.h>
SoftwareSerial esp8266(6, 7); // Rx=D6, Tx=D7
#define speed8266 9600

void setup() {
  esp8266.begin(speed8266);
  Serial.begin(speed8266);
  Serial.println("ESP8266 Setup test - use AT commands");
}

void loop() {
  while(esp8266.available()) Serial.write(esp8266.read());
  while(Serial.available()) esp8266.write(Serial.read());
}

テストコマンド:

起動時自動接続用関数も用意:


void connectWiFi() {
  sendData("AT+RST\r\n", 2000, 0);
  sendData("AT+CWJAP=\"YOUR_SSID\",\"YOUR_PASS\"\r\n", 2000, 0);
  delay(3000);
  sendData("AT+CWMODE=1\r\n", 1000, 0);
  sendData("AT+CIFSR\r\n", 1000, 0);
  Serial.println("8266 Connected");
}

String sendData(String command, const int timeout, boolean debug) {
  String response = "";
  EspSerial.print(command);
  long int time = millis();
  while ((time + timeout) > millis()) {
    while (EspSerial.available()) {
      char c = EspSerial.read();
      response += c;
    }
  }
  if (debug) Serial.print(response);
  return response;
}

Step 7: センサーとESP-01の統合

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Step 8: ThingSpeak設定

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ThingSpeakアカウント作成後、以下のフィールド構成でStatus Channelを作成:

フィールド 内容
Field 1 アクチュエーター1(ポンプ)
Field 2 アクチュエーター2(ランプ)
Field 3 気温(℃)
Field 4 湿度(%)
Field 5 土壌温度(℃)
Field 6 土壌湿度(%)
Field 7 照度(%)
Field 8 スペア(通信エラーカウンター等)

Write API Keyを控えておきます。

Step 9: ステータスデータのクラウド送信

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ThingSpeakへの書き込みはHTTP GETリクエストで行います:

  1. AT+CIPSTART="TCP","184.106.153.149",80 (接続開始)
  2. AT+CIPSEND=116 (データ長送信)
  3. GET文字列送信: GET /update?api_key=YOUR_KEY&field1=...&field8=...

完全な送信コード(抜粋):


// Thingspeak
String statusChWriteKey = "YOUR_WRITE_KEY";
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(6, 7);
#define HARDWARE_RESET 8

// センサー設定(Step 4と同様)
// ... 省略 ...

long writeTimingSeconds = 17;
long startWriteTiming = 0, elapsedWriteTime = 0;
boolean pump = 0, lamp = 0;
int spare = 0;
boolean error;

void setup() {
  Serial.begin(9600);
  pinMode(HARDWARE_RESET, OUTPUT);
  digitalWrite(HARDWARE_RESET, HIGH);
  DS18B20.begin();
  dht.begin();
  EspSerial.begin(9600);
  EspHardwareReset();
  startWriteTiming = millis();
}

void loop() {
  start:
  error = 0;
  elapsedWriteTime = millis() - startWriteTiming;
  if (elapsedWriteTime > (writeTimingSeconds * 1000)) {
    readSensors();
    writeThingSpeak();
    startWriteTiming = millis();
  }
  if (error == 1) {
    Serial.println(" <<<< ERROR >>>>");
    delay(2000);
    goto start;
  }
}

void writeThingSpeak() {
  startThingSpeakCmd();
  String getStr = "GET /update?api_key=";
  getStr += statusChWriteKey;
  getStr += "&field1=" + String(pump);
  getStr += "&field2=" + String(lamp);
  getStr += "&field3=" + String(airTemp);
  getStr += "&field4=" + String(airHum);
  getStr += "&field5=" + String(soilTemp);
  getStr += "&field6=" + String(soilHum);
  getStr += "&field7=" + String(light);
  getStr += "&field8=" + String(spare);
  getStr += "\r\n\r\n";
  sendThingSpeakGetCmd(getStr);
}

// ESPリセット、TCP接続、GET送信関数は本文参照

Step 10: Androidアプリ第1部 - ステータス監視

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

MIT App Inventorで作成。2秒ごとにThingSpeak Status Channelを読み取り、センサー値とアクチュエーター状態を表示。閾値判定でアラート表示(点滅)も実装。

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト
Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト
Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Step 11: アクチュエーター(LED・リレー)設置

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ローレベルトリガーのフォトカプラ付きリレーモジュールを使用。リレーGNDはArduino GNDと接続せずノイズ対策。

Step 12: ThingSpeakアクチュエーターチャンネル設定

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

アクチュエーターごとに専用チャンネルを作成(Field 1のみ使用):

Step 13: アクチュエーター制御コード

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ThingSpeakから「読み取り」を行うコード。10秒ごとに各チャンネルのField 1最新値を取得し、リレーを制御。


// Thingspeak
String canalID1 = "375598"; // Actuator1
String canalID2 = "375599"; // Actuator2
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(6, 7);
#define HARDWARE_RESET 8

long readTimingSeconds = 10;
long startReadTiming = 0, elapsedReadTime = 0;
#define ACTUATOR1 10 // 赤LED → ポンプ
#define ACTUATOR2 12 // 緑LED → ランプ
boolean pump = 0, lamp = 0;
int spare = 0;
boolean error;

void setup() {
  Serial.begin(9600);
  pinMode(ACTUATOR1, OUTPUT);
  pinMode(ACTUATOR2, OUTPUT);
  pinMode(HARDWARE_RESET, OUTPUT);
  digitalWrite(ACTUATOR1, HIGH); // リレーはLowアクティブ
  digitalWrite(ACTUATOR2, HIGH);
  digitalWrite(HARDWARE_RESET, HIGH);
  EspSerial.begin(9600);
  EspHardwareReset();
  startReadTiming = millis();
}

void loop() {
  start:
  error = 0;
  elapsedReadTime = millis() - startReadTiming;
  if (elapsedReadTime > (readTimingSeconds * 1000)) {
    int command = readThingSpeak(canalID1);
    if (command != 9) pump = command;
    delay(5000);
    command = readThingSpeak(canalID2);
    if (command != 9) lamp = command;
    takeActions();
    startReadTiming = millis();
  }
  if (error == 1) {
    Serial.println(" <<<< ERROR >>>>");
    delay(2000);
    goto start;
  }
}

void takeActions() {
  if (pump == 1) digitalWrite(ACTUATOR1, LOW);
  else digitalWrite(ACTUATOR1, HIGH);
  if (lamp == 1) digitalWrite(ACTUATOR2, LOW);
  else digitalWrite(ACTUATOR2, HIGH);
}

int readThingSpeak(String channelID) {
  startThingSpeakCmd();
  String getStr = "GET /channels/" + channelID + "/fields/1/last\r\n";
  String messageDown = sendThingSpeakGetCmd(getStr);
  int command = 9;
  if (messageDown.length() > 7 && messageDown[5] == '1') {
    command = messageDown[7] - '0';
  }
  return command;
}
// 共通関数(EspHardwareReset, startThingSpeakCmd, sendThingSpeakGetCmd)はStep 9と同様

Step 14: ブラウザからのアクチュエーター操作テスト

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

ブラウザで以下のURLを叩いて動作確認:

Step 15: Androidアプリ完成版

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

各アクチュエーターにON/OFFボタンを配置。押下時は色変化でフィードバック。

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト
Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Step 16: 全機能統合

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

定期的なセンサー送信とアクチュエーター受信を両立させ、ESP-01フリーズ検出・自動リセット機能も追加した最終コードはGitHubで公開。

Step 17: 結論

Arduino UNO + ESP-01 + ThingSpeak + MIT App Inventorで作るシンプルIoTプロジェクト

Arduino UNOとESP-01でも十分にIoTシステムが構築可能です。詳細なファイルはGitHub: ArduFarmBot_Light、ブログはMJRoBot.orgをご覧ください。

南半球より、Marcelo

コードリポジトリ

https://github.com/Mjrovai/ArduFarmBot_Light

回路図

Fritzingファイル

製造プロセス

  1. Raspberry Pi 4B+ IoTボードで並列C++17 SYCLコードを構築:Khronos CL/SYCL、hipSYCL、GCC/Clangツールチェーン活用
  2. ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
  3. Arduino UNO WiFi Webサーバー:ブラウザからLEDをON/OFF制御
  4. Arduino UNOで作るシンプル電卓 - シリアルモニターで四則演算
  5. Arduino UNOとATtiny85で作る携帯型POV(残像)ディスプレイ
  6. 非接触温度スクリーニングゲート:Arduino MKR1000で迅速・高精度な検温
  7. Arduino UNO + WiFiシールドで温度をWebリアルタイム表示 — シリアル出力だけでグラフ化
  8. ArduinoとThingSpeakで作るリアルタイム気象モニタリングシステム
  9. 学校向けスマート体温監視システム: 正確、リアルタイム、安全
  10. サーミスタを使った温度測定: Arduinoステップバイステップガイド
  11. Azure IoT対応スマートプール制御システム:水温・気温監視と遠隔ポンプ制御