ESP32でIO制御#2|ボタン押したらLED緑点灯・離したら赤点灯させる

ESP32でIO制御#2|ボタン押したらLED緑点灯・離したら赤点灯させる

今回は、ESP32を使って、IO制御を行おうと思います。

作成手順も記載してますので、良かったらぜひ実践してみてください。

ちなみに前回は、スマートタグとESP32のBLE通信のサンプルになりますので、こちらも良かったらご覧になって頂けたらと思います。

概要

やりたい事

以下の事をやりたいと思います。

  • ボタン押したら、LED緑を点灯します。
  • ボタン離したら、LED赤を点灯します。
  • PCにもログを出力します。

配線情報

HW担当より、以下のように配線して頂きました。ありがとうございます!

  • タクトSW・・・P15
  • LED赤・・・P19
  • LED緑・・・P18

用語解説

タクトスイッチ

写真のような見た目のボタンの事を「タクトスイッチ」と呼んでます。

日本語でいうと「感触のあるボタン」を意味します。押してやった感があるボタンの事を指します。

お求めになりやすい価格のボタン・スイッチになります。

IO

InputとOutputの略になります。

Inputとは入力のことで、主にボタンのように、押したか押されていないかを「取得」する目的で使用するものに対し、こう表現します。

Outputとは出力のことで、主にLEDのように、点灯させる・消灯させるといった「設定」する目的で使用するものに対し、こう表現します。

作成手順

開発環境

開発環境は、Arduino IDEを使用します。
Arduino IDEはオープンソースですので無料でダウンロード&インストール可能です。
プログラミング言語はC++です。

※今回使用したESP32開発ボードは、「Node MCU ESP32」です。
※環境設定などは省略いたします。各ESP32開発ボードのマニュアルに従って設定してください。

ESP32側のプログラミング

  • ボタン(タクトSW)は、押したか/押されたかの情報を「取得」するため、IO属性は「INPUT」となります。
  • LEDは、光を「点灯」させる動作のため、IO属性は「OUTPUT」となります。
  • ボタンが押されているか、押されていないかの変化を検知するために、前回のボタン状態を保持する変数を1つ用意します。
  • ボタンの変化を検知したら、各LEDの制御と、PCへのログ出力を行います。

以下、サンプルコードになります。

#define SW_KEY   15    // ボタンスイッチのピン番号定義

#define LED_GREEN   18 // 緑LEDのピン番号定義
#define LED_RED     19 // 赤LEDのピン番号定義

#define SW_ON   0  // ボタンが押された状態。PULLUP(ON/OFF反転)指定の為、ONは1でなく、0で定義
#define SW_OFF  1  // ボタンが押されていない状態。

#define LED_ON   1 // LED点灯
#define LED_OFF  0 // LED消灯

int m_iSwKey;    // 前回SW状態保持用

// 最初に1回だけ実行
void setup()
{
  Serial.begin(115200);  // ログ出力準備

  // ピン情報設定
  pinMode(SW_KEY,INPUT_PULLUP);  // ボタンスイッチのピン番号と、入力(INPUT)を指定

  pinMode(LED_GREEN,OUTPUT);  // LEDのピン番号と、出力(OUTPUT)を指定
  pinMode(LED_RED,OUTPUT);    // LEDのピン番号と、出力(OUTPUT)を指定

  m_iSwKey = -1;

  digitalWrite(LED_GREEN, LED_OFF);
  digitalWrite(LED_RED, LED_OFF);
}

// 以降、ずっと繰り返して呼ばれる関数
void loop()
{
  int iSw;
  // SW状態取得
  iSw = digitalRead(SW_KEY);
  // 変化あり
  if(iSw != m_iSwKey){
    m_iSwKey = iSw;
    // SWが押されていたら
    if(iSw == SW_ON){
      digitalWrite(LED_GREEN, LED_ON);  // 緑点灯
      digitalWrite(LED_RED, LED_OFF);   // 赤消灯
      Serial.println("LED GREEN ON");
    }
    else{
      digitalWrite(LED_GREEN, LED_OFF); // 緑消灯
      digitalWrite(LED_RED, LED_ON);    // 赤点灯
      Serial.println("LED RED ON");
    }
  }
  delay(100);  // 100ミリ秒wait
}

ESP32へ書込み

  • 使用したESP32開発ボードは、「Node MCU ESP32」ですので、メニュー「ツール」-「ボード」の項目は、「NodeMCU-32S」を選択しました。(※1)
  • シリアルポートは、ESP32をUSBでPCと接続すると、COM番号が追加されるので、それを選択します。
  • 書込みは、ツールボックスの「⇒」右矢印ボタンで開始します。
  • ESP32開発ボードの、右側のボタン(IO0)長押しすると、書込み開始するので、直後にボタンを離します。(※2)
  • 書込みが開始されます。

(※1)他のESP32っぽい名前の項目がありますが、書込みできない場合があります。製品のマニュアルをご確認ください。

(※2)機種によって書込み操作が違う場合があります。例えば、IO0ボタン押しながらEN(リセット)ボタンを押さないと書込みできない場合もあります。

実行結果

  • Arduino IDE画面の右上にある虫眼鏡ボタンを押すと、シリアル通信をモニタできます。
  • これでログ出力を確認します。
  • ボーレートを115200bpsに選択します。
  • USBシリアル通信出力例になります。
  • ESP32開発ボードのENボタンを押すとリセットします。
LED RED ON
LED GREEN ON
LED RED ON
    :

ボタンOFF、LED赤点灯

ボタンON、LED緑点灯

最後に

ESP32を使用して、ボタン押下状態によってLED点灯が赤/緑切り替えできていることを確認することができました。

今回は、HW担当よりハンダで接続して頂きましたが、接続先のモジュール基板によっては、ジャンパワイヤーだけでも接続できたりしますので、いろいろお試しできるのではないかと思います。

以下、以前に展示会向けのデモ用として、OLEDとRFIDリーダーをジャンパワイヤーで接続して動作確認したときの写真になります。このようなイメージで、ものによってはジャンパワイヤーだけで動かすことも可能ですのでお手軽にご利用頂けるのではないでしょうか。

次回は、ESP32を使って、ブザーを鳴らす(PWM制御する)方法について解説しておりますので、良かったらこちらもご覧になってください。

最後までご覧頂きましてありがとうございました。