TOP > カテゴリ > ロボット・電子工作・マイコン >

スマホでLEDを点灯させる (クライアント版)

ArduinoとESP-WROOM-02を使用して「スマホでLEDを点灯・消灯」する方法です。今回はESP-WROOM-02をステーションモードのクライアント(無線LAN子機)として使用しています。

関連記事:データを送受信をするIoTデバイスの作り方[Arduino版]
※はじめての方はこの関連記事を先にお読みください。

使用部品・材料

総額で約1000円です。(Arduino本体の値段を除く)

部品/材料値段備考
ブレッドボード¥270秋月電子の通販コード(P-00315)
Wi-Fiモジュール ESP-WROOM-02 DIP化キット¥650秋月電子の通販コード(K-09758)
低損失三端子レギュレーター 3.3V500mA TA48M033F¥100電解コンデンサと積層セラミックコンデンサが付属。

ESP-WROOM-02の電源は3Vから3.6Vまでですので、Arduino UNOの5V電源を3.3Vに降圧するレギュレーターです。

Arduinoには3.3Vの電源がありますが、最大電流が50mAです。ESP-WROOM-02の平均電流は80mAで最大電流は170mAですので安定化の為、500mAのレギュレーターを使用します。

また、ArduinoへのUSB給電は「USB 3.x」(USBポートが青色)を使用すると給電量が多いです。

秋月電子の通販コード(I-00538)
カーボン抵抗器数円10kΩ(3個)、220Ω(1個)を使用
LED10円今回は赤色(1個)を使用しています。

配線図

前回の記事にLED関連のパーツを追加しただけです。
※相性が良い「ロジック変換」が見つからないので「TX/RX」は5Vで接続しています。

システムの概要

Webサーバーを利用してLEDのオン/オフを切り替えます。サーバー側でLEDの状態を保存するにはデータベースではなく、簡易なテキストファイルを使用しています。

Webサーバーをお持ちでない方は「Apache HTTP Server」などでローカルサーバーを設置して下さい。

setIoT.php

WebサーバーにPHPファイルを設置後、最初にブラウザでこのファイルを表示して「オン or オフ」ボタンを押して下さい。

※設定ファイル(iot.txt)を生成する為です。

<?php
  define("FILE_IOT_LED","iot.txt");     
  
  // 設定ファイルの作成        
  if($_GET['value'] === "1"){
      $result = file_put_contents(FILE_IOT_LED,1);
  }else{
      $result = file_put_contents(FILE_IOT_LED,0);
  }
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
</head>
<body>
<br>
<br>
<br>
<input type="button" value="オン" style="font-size:32px;" onclick="location.href='setIoT.php?value=1';">&nbsp;&nbsp;&nbsp;
<input type="button" value="オフ" style="font-size:32px;" onclick="location.href='setIoT.php?value=0';">
</body>
</html>

getIoT.php

<?php
  define("FILE_IOT_LED","iot.txt");     
  
  // 設定ファイルの読み込み
  $LED = file_get_contents(FILE_IOT_LED);
  
  // 出力メッセージ用    
  if($LED === FALSE){
    $msg = 0;   
  }else{
    $msg = $LED; 
  }       

  // ヘッダの出力
  // ※以下の2行は必ず出力して下さい。
  header("Content-Type: text/html; charset=utf-8");
  header("Content-Length: " . strlen($msg));
  
  echo $msg;
  
  // ファイル末尾に空白や改行などがあるとその文字列も出力されるので注意して下さい。
?>

コピペした後にはファイル末尾の「?>」の後ろにある空白または改行コードを必ず削除して下さい。

スケッチ(Arduino)

SSID、PASSWORD 、HOST、PATHは各自の環境に合わせてください。また、WiFi接続をDHCPではなく固定IPアドレスにする場合は前回の記事をご覧下さい。

#include <TESP8266.h>

// Wifi
const char* SSID = "xxx";
const char* PASSWORD = "xxx";

// URL
// (例) http://www.example.com/iot/led/getIoT.php
const char* HOST = "www.example.com";
const char* PATH = "/iot/led/getIoT.php";

// LED
const int PIN_LED =  8;

TESP8266 httpClient(Serial);   

void setup() {      
  
    // LED
    pinMode(PIN_LED, OUTPUT); 
    
    // HardwareSerialの通信速度(115.2kbps)
    Serial.begin(115200);

    // ESP-WROOM-02との接続確認(ATコマンドのテスト)
    while(true) {
        if(httpClient.statusAT(true)) { Serial.println("*** ESP-WROOM-02と接続しました。"); break; }
        else Serial.println("*** ESP-WROOM-02と接続できません。");
        delay(1000);
    }

    // アクセスポイントに接続(DHCP)
    while(true) { 
        if(httpClient.connectAP(SSID, PASSWORD)) { Serial.println("*** アクセスポイントに接続しました。"); break; }
        else Serial.println("*** アクセスポイントに接続できませんでした。 再試行中...");
        delay(1000);
    }
 
    // Wifi接続の確認
    while(true) {
        if(httpClient.statusWiFi()) { Serial.println("*** Wifi接続しました。"); break; }
        else Serial.println("*** Wifi接続できません。");
        delay(1000);
    }
}

void loop() {

  // ファイルを取得する
  // ※環境にもよりますがファイルの取得に2秒前後かかります。
  uint32_t filesize = 0; // (戻り値)ファイルサイズ 
  String raw  = httpClient.get(HOST, PATH, filesize);  
  
  if(filesize == raw.length()){
      // LEDの点灯
      if(raw == "1"){
          digitalWrite(PIN_LED, HIGH);  
      // LEDの消灯
      }else{
          digitalWrite(PIN_LED, LOW); 
      }
  }else{
    // エラー時
    digitalWrite(PIN_LED, LOW); 
  }

  // レンタルサーバーを利用する場合は
  // サーバーの負担を減らす為に、ディレイの間隔を長くして下さい。
  // delay(1000); 
}

最後に

Webサーバーとクライアント(Arduino)の「タイムラグ」でLEDのオン/オフの切り替えに約2、3秒の時間がかかります。

リアルタイムで切り替えをしたい場合はESP-WROOM-02をWebサーバーにすると「タイムラグ」はなくなります。





掲示板

ソフトウェア、ハードウェアのプログラミング用の掲示板を作成しました。質問やわからない事は@掲示板でユーザー同士で情報を共有して下さい。

関連記事



公開日:2017年04月10日 最終更新日:2017年08月20日
記事NO:02319