LoginSignup
4
3

More than 3 years have passed since last update.

はじめに

この記事はAizu Advent Calendar 202023日目の記事です。
時間がギリギリで少し適当な節がありますが、ご了承ください。

ESP32 とは

ESP32シリーズは Wi-FiとBluetoothを内蔵する低コスト、低消費電力なSoCのマイクロコントローラ (Wikipediaより)

ということらしいです。
下記に自分が思った利点を簡単にまとめます。

Wi-Fiが扱える

WebサーバアクセスポイントWebクライアントになる。
GETを送れば、Webからマイコンを操作できます。(今回はこれを説明します。)

Bluetoothが扱える

スマホとの通信Bluetoothマウス・キーボードになる。
特にBluetoothマウス・キーボードを使えば、ゲームコントローラーの自作も可能。

安い

RaspberryPiなどの他のBluetoothやWi-Fiを扱えるマイコンに比べて安いです。
今回説明していく、Arduino互換のESP32はAmazonで1000円ぐらいです。

WebからLEDを操作

実際にESP32で、簡単なWebサーバを作って、WebからLEDを操作していこうと思います。

1.Webページを作る

操作用のWebページを作っていきます。
※CSSとJavaScriptはHTMLファイルの中に直接書いてください。
※ダブルクォーテーションはなるべく使わずにシングルクォーテーションを使ってください。
ESPWebページ.PNG

ctrl.html
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' name='viewport' content='width =device-width, initial-scale=1'>
    <title>ESP32 RGB LED controller</title>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
    <style>
        .btn{
            width:30%;
            font-size:100px;
        }
    </style>
</head>
<body>
    <script>
        $.ajaxSetup({ timeout: 1000 });
        function Send(btn) {
            $.get('/' + btn);
            { Connection: close };
        }
    </script>
    <input type='button' class='btn' id='cold' value='H' onclick='Send("H")'/>
    <input type='button' class='btn' id='stop' value='L' onclick='Send("L")'/>

</body>
</html>

JS部分の説明をしていきます

16行目
$.ajaxSetup({ timeout: 1000 });

Ajax通信のタイムアウトを設定しています。

Send関数
function Send(btn) {
    $.get('/' + btn);
    { Connection: close };
}

ESP側に"/"+btnのGETを送ります。
つまり、Hのボタンを押すと、/Hが、Lのボタンを押すと/Lが送られます。

2.ESP32に書き込むプログラムを作る

WebServer.ino
#include <WiFi.h>

const char* ssid     = "ssid";
const char* password = "password";

const String HTML="さっき作ったWebページ(改行なし)";
WiFiServer server(80);
const int LED=23;

void setup()
{
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (client) {
    Serial.println("New Client.");
    String header="";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c=='\r')continue;
        header.concat(String(c));
        if (c == '\n') {
          Serial.print(header);
          if(header.indexOf("GET")>=0){
            if(header.indexOf("/H")>=0){
              digitalWrite(LED,HIGH);
            }else if(header.indexOf("/L")>=0){
              digitalWrite(LED,LOW);
            }else{
              client.println("HTTP/1.1 200 OK");
              client.println("Content-type:text/html");
              client.println("Connection: close");
              client.println();
              client.println(HTML);
            }
            break;
          }
        }
      }
    }
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

ほとんど、おまじないなので重要な部分だけ説明していきます。

3,4行目
const char* ssid     = "ssid";
const char* password = "password";

ここには、自分の家のルータのssidとパスワードを入れてください。
因みに、Windowsの人はモバイルホットスポットを使うと楽だと思います。

6行目
const String HTML="さっき作ったWebページ(改行なし)";

ここには、先ほど作ったWebページを改行を無くして代入してください。
改行をなくすには、このようなサイトが便利です。

setup関数はほとんどおまじないなので、軽い説明だけです。
setup関数
void setup()
{
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password); //WiFiに接続

  while (WiFi.status() != WL_CONNECTED) { //接続できるまでループ
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP()); //IPアドレスの表示
  server.begin(); //Webサーバの開始
}



loop関数のwhileの中
while (client.connected()) { // Webサーバに接続している間、ループする
  if (client.available()) { //ESP32にデータが送られている場合に実行
    char c = client.read(); //送られてきたデータを一文字読み込む
    if (c == '\r')continue; //\rは無視
    header.concat(String(c)); //headerの末尾にcを追加する
    if (c == '\n') {
      Serial.print(header);
      if (header.indexOf("GET") >= 0) { //GETだったら実行
        if (header.indexOf("/H") >= 0) { // /Hなら、LEDを光らせる
          digitalWrite(LED, HIGH);
        } else if (header.indexOf("/L") >= 0) { // /Lなら、LEDを消す
          digitalWrite(LED, LOW);
        } else { // /等の場合はWebページを送る
          client.println("HTTP/1.1 200 OK");
          client.println("Content-type:text/html");
          client.println("Connection: close");
          client.println();
          client.println(HTML);
        }
        break;
      }
    }
  }
}

簡単に説明すると、
1. GETなどのデータがheaderに入り、
2. それがGETの/H/Lだった場合はLEDを制御して、
3. GETの/の場合はWebページ(HTML)のデータを送る。

まとめ

ESP32は安い&簡単にBluetooth通信やWebの通信が取り扱えます。
皆さんも、RaspberryPiだけでなくESP32も使っていきましょう!
今度、書けなかったBluetoothに関する記事を書こうと思っています。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3