■プログラムを書いてみる Lチカ編

それではプログラムを早速書いてみましょう。最も簡単なLED点滅プログラム(Lチカ)を書いてみます。200ミリ秒間隔で指定したピンをHigh-Lowさせるだけのプログラムです。

今回はピンとして26ピンを指定しました。適宜変更してスケッチを書いてみてください。

ESP32-DevKitC-32E実験用ベースボードには6個のLEDが実装されています。各LEDはGPIOがHレベルの時に点灯します。

※但し35,34は入力専用なので使えません。

int LED = 26;
void setup() {
  pinMode(LED,OUTPUT);
}
void loop() {
  digitalWrite(LED,HIGH);
  delay(200);
  digitalWrite(LED,LOW);
  delay(200);
}

では早速コンパイル(ビルド)してプログラムをESP32-WROOM-32Eにダウンロード(書き込み)してみましょう。

ツールバー画面左上にある「→」のボタン(書き込み)を押します。

ファイルを保存していない場合にはファイル保存のダイアログが表示されますので適当なディレクトリに保存してください。

コンパイルは少し時間がかかります。プログラムに誤りがなければコンパイル後に自動的に書き込みが実行されます。
ウインドウ下の「出力」という部分に進捗状況が表示されるので確認してください。
使用されているフラッシュメモリーのサイズやRAMの容量が表示されます。

綴りミスやエラーがある場合にはオレンジ色のエラーが表示されるので確認してください。

書き込みが完了すると「Hard resetting via RTS pin…」と表示されます。

ボード上にあるディップスイッチの26と書かれたスイッチをON位置にセットしてください。

ボード上の26と書かれたLEDが点滅していることを確認してください。

点滅する周期を変更したりしてプログラムを変えてみてお試しください。

■ピンの状態を取得してみる

GPIOを入力設定にしてその状態に応じて処理を分岐するプログラムを作ってみましょう。

本実験ボードには6つのタクトスイッチが実装されています。(1つはリセットスイッチです。)ここではGPIO36のスイッチを押した時にLEDを点灯させてみましょう。

GPIO36を入力ピンとして使います。
入力ピンの場合にはスイッチを押していない時にピンの論理状態をHighにするか、Lowにするかをプルアップ又はプルダウンによって決めなければいけません。ESP32では指定したピンを入力ピンに設定するとともにそのピンを内部プルアップする機能があります。これを使えば外部にプルアップ用抵抗器を接続する必要がなく利用できます。但し、プルダウンの設定はできませんのでご注意ください。

次のプログラムはGPIO36のスイッチを押した時にLEDが点灯、離すと消灯するプログラムです。

const int ledPin = 32;
const int swPin = 0;
void setup() {

  pinMode(ledPin, OUTPUT);
  pinMode(swPin, INPUT_PULLUP);
}
void loop() {

  int sw_state = digitalRead(swPin);

  if (sw_state==HIGH){
    digitalWrite(ledPin, LOW);
  }else{
    digitalWrite(ledPin, HIGH);
  }  

}

適当にファイル名を付けて保存してコンパイルして書き込んでみてください。 pinMode()では入力ピンとする時にだけINPUT_PULLUPを引数として指定すると内部プルアップが有効になります。 ピンの状態はdigitalRead()関数で読み込みます。 戻り値はint型変数に代入します。その値をif文で判定します。 スイッチを押していない時はプルアップによりGPIO0はHighレベルなのでLEDは消灯に、押した時はLowなのでLEDを点灯させます。

if文で判定する条件式では比較演算子を使いますが、「等しい」時は==は2つです。注意してください。

■LCDにADコンバーターで取得した値を表示する

本ボードには、16文字2行のI2CインターフェイスのLCDが搭載できます。ここに文字を表示するにはI2C LCD用のライブラリ ST7032_asukiaaa を使います。

https://github.com/asukiaaa/ST7032_asukiaaa

ライブラリマネージャでインストールするか、上記GitHubからインストールしてください。

ADコンバーター用のボリューム(10Kオーム)は、GPIO36に接続されます。ボリュームのすぐ左隣にあるジャンパーをソケットでショートしてください。これでボリュームとGPIO36が接続されます。

サンプル例では、GPIO36に印加されている電圧値をLCDに表示させてみましょう。

#include <ST7032_asukiaaa.h>
ST7032_asukiaaa lcd(0x3E);

const int adcPin = 36;

void setup() {

  Wire.begin(21, 22); // SDA, SCL
  lcd.setWire(&Wire);

  lcd.begin(16, 2);
  lcd.setContrast(30);
  delay(100);
  lcd.clear();

}

void loop() {

  int adcValue = analogRead(adcPin);
  float voltage = (adcValue / 4095.0) * 3.3;

  lcd.setCursor(0, 0);
  lcd.print(adcValue);
  lcd.setCursor(0, 1);
  lcd.print(voltage);

}

■WEBサーバー機能を利用してLEDを制御する

ESP32のWEBサーバー機能を使ってブラウザからESP32にアクセスしてボード上のLEDを制御するプログラムを作ってみましょう。

LEDは、26・27・14・13の4つを使います。ブラウザからESP32にアクセスします。ページには4つのボタンを表示させ、ボタンを1回押すと点灯、もう一度押すと消灯させるようにします。

ブラウザから簡単にLED制御ができることを確認します。

ボードの26・27・14・13のディップスイッチをON位置にセットしてください。

#include <WiFi.h>
#include <WebServer.h>

// Wi-Fi設定
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

WebServer server(80);

// LEDピン番号
int ledPins[] = {26, 27, 14, 13};
bool ledState[4] = {false, false, false, false};

// HTMLページ生成
String makeHTML() {
  String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'>";
  html += "<title>ESP32 LED Control</title>";
  html += "<style>body{text-align:center;font-family:sans-serif;}";
  html += "button{width:120px;height:60px;font-size:18px;margin:10px;}</style>";
  html += "</head><body><h2>ESP32 LED Control</h2>";

  for (int i = 0; i < 4; i++) {
    html += "<p>GPIO " + String(ledPins[i]) + ": ";
    if (ledState[i])
      html += "<b>ON</b>";
    else
      html += "<b>OFF</b>";
    html += "</p>";
    html += "<form action='/toggle' method='GET'>";
    html += "<input type='hidden' name='pin' value='" + String(i) + "'>";
    html += "<button type='submit'>" + String(ledState[i] ? "OFF" : "ON") + "</button></form>";
  }

  html += "</body></html>";
  return html;
}

// トグル処理
void handleToggle() {
  if (server.hasArg("pin")) {
    int index = server.arg("pin").toInt();
    if (index >= 0 && index < 4) {
      ledState[index] = !ledState[index];
      digitalWrite(ledPins[index], ledState[index] ? HIGH : LOW);
    }
  }
  server.send(200, "text/html", makeHTML());
}

// メインページ
void handleRoot() {
  server.send(200, "text/html", makeHTML());
}

void setup() {
  Serial.begin(115200);

  // LEDピン初期化
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }

  // WiFi接続
  WiFi.begin(ssid, password);
  Serial.print("WiFi connecting...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConnected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // ルーティング設定
  server.on("/", handleRoot);
  server.on("/toggle", handleToggle);

  // サーバー開始
  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();
}

YOUR_SSIDとYOUR_PASSWORDには実際のWi-Fiの接続情報を記述してください。

ビルドと書き込みを実行する前に、シリアルモニターを有効にしておきましょう。ESP32にDHCPで割り当てられたIPアドレスが何番かを確認するのにシリアルモニターが必要です。メニューバーの”ツール”→”シリアルモニタ”で表示させます。

書き込みが完了してWi-Fiに接続が開始されます。接続が正常に完了するとシリアルモニタにIPアドレスが表示されます。

このIPアドレスにブラウザからアクセスしてください。

ボタンが4つ表示されます。各ボタンを押すとLEDが点灯、消灯することを確認してください。