アナログハード屋がスマートホームの汎用トリガーを目指してESP32モジュールボードに取り組む第2弾です。PCとESP32ボードの接続とLチカ(LEDの点滅)に成功した第1弾に続いての今回は『シリアル通信、スイッチ入力、Wi-Fi接続』編です。
■ESP32モジュールボードを使ってみる ー その2:『シリアル通信、スイッチ入力、Wi-Fi接続』編(DOIT ESP32 DEVKIT V1使用)
以下は、
- シリアル通信
- スイッチ入力
- Wi-Fi接続
使用するESP32ボードは前回と同じ『DOIT ESP32 DEVKIT V1』です。
●シリアル通信の確認
まず、USB経由でESP32ボードから任意のメッセージをPCに送信する動作を確認します。
・プログラム(スケッチ) - シリアル通信
プログラムの動き:10秒おきにPCにメッセージ”Hello
World.”を送信します。
ーーーサンプルプラグラム(シリアル通信)ーーー
(" // ... "の部分(黄色)はコメントです。)
void setup() {
Serial.begin(115200);
// シリアル通信のデータ転送レートの設定
}
void loop() {
Serial.println("Hello World."); // "Hello World."をシリアルポートへ出力
delay(10000);
// 10秒ウェイト
}
ーーーサンプルプラグラムおわりーーー
【参照サイト】esp32_setup – スイッチサイエンス
・動作確認 - シリアル通信
プログラム(スケッチ)を実行し、Arduino
IDEのシリアルモニタで確認します。
以上でシリアル通信の確認は完了です。
●スイッチ入力の確認
次に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;
}
ーーーサンプルプラグラムおわりーーー
・動作確認 - スイッチ入力認識
以上でシリアル通信の確認は完了です。
●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アドレスが表示されます。
以上でWi-Fi接続の確認は完了です。
今回は以上になります。ここまでの確認できれば、あとは時間の問題ですね。いよいよ『スマートホーム向け汎用トリガー』の作成になります😋。
○参照サイト(外部リンク ⧉)
esp32_setup – スイッチサイエンス(シリアル通信)
CONNECT MAKER TO ANYTHING - IFTTT(スイッチ入力認識)
ESP32をWiFiにつなげる(Wi-Fi接続)
Arduino 日本語リファレンス