ESP32モジュールボードを使ってみる ー その2:『シリアル通信、スイッチ入力、Wi-Fi接続』編(DOIT ESP32 DEVKIT V1使用)

📅
アナログハード屋がスマートホームの汎用トリガーを目指してESP32モジュールボードに取り組む第2弾です。PCとESP32ボードの接続とLチカ(LEDの点滅)に成功した第1弾に続いての今回は『シリアル通信、スイッチ入力、Wi-Fi接続』編です。


■ESP32ボードの『シリアル通信、スイッチ入力、Wi-Fi接続』の確認

以下は、
  • シリアル通信
  • スイッチ入力
  • Wi-Fi接続
の確認用プログラムとその動作確認です。

使用するESP32ボードは前回と同じ『DOIT ESP32 DEVKIT V1』です。
(PCとボードの接続方法、プログラム(スケッチ)の書き込み方法はこちら『ESP32モジュールボードを使ってみる - その1:『PCセットアップ(Lチカまで)』編』を参照ください。)

●シリアル通信の確認

まず、USB経由でESP32ボードから任意のメッセージをPCに送信する動作を確認します。


・プログラム(スケッチ) - シリアル通信

プログラムの動き:10秒おきにPCにメッセージ”Hello World.”を送信します。

ーーーサンプルプラグラム(シリアル通信)ーーー
 (" // ... "の部分(黄色)はコメントです。)
void setup() {
  Serial.begin(115200);  // シリアル通信のデータ転送レートの設定
}

void loop() {
  Serial.println("Hello World."); // "Hello World."をシリアルポートへ出力
  delay(10000);                   // 10秒ウェイト
}
ーーーサンプルプラグラムおわりーーー


・動作確認 - シリアル通信

プログラム(スケッチ)を実行し、Arduino IDEのシリアルモニタで確認します。

シリアルモニタ画面を開くにはArduino IDEの右上の虫眼鏡アイコンをクリックします。


すると開いたシリアルモニタ画面に10秒おきに”Hello World.”が表示されます。

以上でシリアル通信の確認は完了です。


●スイッチ入力の確認

次にESP32ボードのIOポートに接続したスイッチのON/OFFを確認します。


・回路 - スイッチ入力

ESP32ボードのIOポート23(D23)とGNDの間にLEDと電流制限抵抗(100Ω)を接続します。
IOポート22(D22)には(3.3VとGND間に10kΩとスイッチを挿入し)スイッチ出力を接続します。
回路図(スイッチ入力)

実装例(スイッチ入力)


・プログラム(スケッチ) - スイッチ入力

プログラムの動き:スイッチが押下された時にLEDを0.1秒間隔で2回点滅します。さらにシリアル通信でPCにスイッチのON/OFF状態のメッセージを送信します。

ーーーサンプルプラグラム(スイッチ入力認識)ーーー
 (" // ... "の部分(黄色)はコメントです。)
// ハード定義
const int buttonPin = 22;     // スイッチを割り当てるポート
const int ledPin = 23;        // LEDを割り当てるポート

// 変数定義
int buttonState;             // スイッチの今回状態
int lastButtonState = LOW;   // スイッチの前回状態

// 以下の変数はミリ秒単位の時間なので、すぐに大きくなってしまうので"long"で定義します
unsigned long lastDebounceTime = 0;  // スイッチ出力が切り替わってからのタイマー
unsigned long debounceDelay = 50;    // スイッチの押下か? or ノイズか? の判定基準時間(50m秒)


void setup() {
  
  // IOポートのモード設定
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  
  // シリアル通信のデータ転送レートの設定
  Serial.begin(115200);
}


void loop() {
  
  // スイッチの現状の読み込み
  int reading = digitalRead(buttonPin);
  
  // millis()がオーバーフローしたらタイマーをリセットします
  if (lastDebounceTime > millis()) {
    // タイマーのリセット
    lastDebounceTime = millis();
  }
  
  // 以下はスイッチの現状(reading)を監視して、信号がノイズか本当の押下かの判定です
  
  // スイッチの現状(reading)が前回状態(lastButtonState)からすぐに変わってしまったら
  // ノイズと見なしてタイマーをリセットします
  if (reading != lastButtonState) {
    // タイマーのリセット
    lastDebounceTime = millis();
  }
  
  // スイッチの現状(reading)が判定基準時間以上前回状態(lastButtonState)変化がない
  // 場合はノイズではないと見なします
  if ((millis() - lastDebounceTime) > debounceDelay) {
  
    // スイッチの状態が今回状態(buttonState)から変化がある場合の処理です
    if (reading != buttonState) {
      Serial.print("Button now ");
      Serial.println(HIGH == reading ? "HIGH" : "LOW");
      buttonState = reading;
      
      // スイッチの今回状態(buttonState)がLOWの場合はスイッチ押下とみなして
      // LEDを点滅させます
      if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);   // LED点灯
  delay(100);              // 0.1秒ウェイト
  digitalWrite(ledPin, LOW);    // LED消灯
  delay(100);              // 0.1秒ウェイト
digitalWrite(ledPin, HIGH);   // LED点灯
  delay(100);              // 0.1秒ウェイト
  digitalWrite(ledPin, LOW);    // LED消灯
  delay(100);              // 0.1秒ウェイト
      }
    }
  }
  
  // スイッチの前回状態(lastButtonState)に現状(reading)を保存します
  lastButtonState = reading;
}
ーーーサンプルプラグラムおわりーーー

【参照サイト】CONNECT MAKER TO ANYTHING - IFTTT


・動作確認 - スイッチ入力認識

プログラム(スケッチ)を実行し、スイッチを押下するとLEDが点滅し、Arduino IDEのシリアルモニタにスイッチの状態が表示されます。


以上でシリアル通信の確認は完了です。


●Wi-Fi接続の確認

最後にESP32ボードがWi-Fiに接続できることを確認します。
※ 今回使用しているESP32ボードは2.4GHzのWi-Fiにのみ対応しています。5GHzには対応していませんのでご注意ください。


・プログラム(スケッチ) - Wi-Fi接続

プログラムの動き:Wi-Fiに接続したら、シリアル通信を用いてPCにメッセージを送信します。
(プログラム中の” WiFi_ssid ”と” Password ”は接続するWi-FiネットワークのSSIDとパスワードに書き換えてください。)

ーーーサンプルプラグラム(Wi-Fi接続)ーーー
 (" // ... "と" /* ... */ "の部分(黄色)はコメントです。)
#include <WiFi.h>

// 接続先のSSIDとパスワード
const char ssid[] = "WiFi_ssid";   // WiFi_ssidには接続するWi-FiのSSIDを設定
const char passwd[] = "Password";  // Passwordには接続するWiFiのパスワードを設定

void setup() {
    Serial.begin(115200);
 
    // WiFi接続(Connect WiFi)の実行
    connectWiFi();
}


void loop() {
    // WiFiに接続できていない場合は、再度接続の実行
    if ( WiFi.status() == WL_DISCONNECTED ) {
        connectWiFi();
    }
}


/**
 * サブルーチン:WiFi接続(Connect WiFi)
 */
void connectWiFi() {
    WiFi.begin(ssid, passwd);
    Serial.print("WiFi connecting...");
    while(WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(100);
    }
    Serial.print(" connected. ");
    Serial.println(WiFi.localIP());
}
ーーーサンプルプラグラム [おわり]ーーー

【参照サイト】ESP32をWiFiにつなげる

※ このプログラムはヘッダファイル『 WiFi.h 』を使用していますが、この『 WiFi.h 』はArduino IDEに標準で用意されているようです。別途用意する必要はありませんでした。


・動作確認 - Wi-Fi接続

プログラム(スケッチ)を実行し、Arduino IDEのシリアルモニタで確認するとボードがWi-Fi接続したIPアドレスが表示されます。

シリアルモニタを開いても何も表示されない時はプログラム(スケッチ)がシリアルモニタを開く前に既に実行してしまった可能性があります。ESP32ボードの『ENボタン』を押下してボードをリセットしてみて下さい。プログラム(スケッチ)が最初から再実行され、問題ない場合は上記の表示になります。

以上でWi-Fi接続の確認は完了です。


今回は以上になります。ここまでの確認できれば、あとは時間の問題ですね。いよいよ『スマートホーム向け汎用トリガー』の作成になります😋。


●参照サイト

esp32_setup – スイッチサイエンス(シリアル通信)

CONNECT MAKER TO ANYTHING - IFTTT(スイッチ入力認識)

ESP32をWiFiにつなげる(Wi-Fi接続)

Arduino 日本語リファレンス




0 件のコメント: