ESP8266でロータリエンコーダ「KY-040」からデータを入力します。

ESP8266とロータリエンコーダの接続

ロータリーエンコーダは回転を調べる装置です。次のような形状をしています。

デジタルピンDT、CLKを調べ、前回のDTの値と今回のDTの値が異なると回転したことが分かります。そして、CLKとDTを比較して異なると時計回り、一致すると反時計回りしたと判断します。

ESP8266とロータリエンコーダの接続を次に示します。

ESP8266 KY-040
IO2 CLK
IO0 DT
IO16 SW

ESP8266とロータリエンコーダの接続画像を次に示します。

ロータリエンコーダ入力ソフトの作成

次のようにロータリエンコーダ入力ソフトを作成します。

rotary.ino

 int pinA = 2;  // KY-040のCLKにつなぐ
 int pinB = 0;  // KY-040のDTにつなぐ
 int pinSW = 16;  // KY-040のSWにつなぐ
 int encoderPosCount = 0; //カウント数
 int pinALast; //前回の最後のピンAの値(初期値) 
 int aVal;
 boolean bCW;//時計回り(1)か、そうでないか(0)

 void setup() { 
   pinMode (pinA,INPUT);
   pinMode (pinB,INPUT);
   pinMode (pinSW,INPUT);
   pinALast = digitalRead(pinA); //ピンAの状態は前回の最後の位置を表す(初期値)  
   Serial.begin (9600);
 } 

 void loop() { 
   aVal = digitalRead(pinA);//ピンAの状態を読み込む
   if (aVal != pinALast){ // 読み込んだピンAの値が初期値と違う場合は回転している
     // 回転方向を決めるためにピンBの状態を調べる
     if (digitalRead(pinB) != aVal) {  
      // ピンBの値がピンAと異なる場合はピンAが先に値が変わったことになり、時計回りと判断される
       encoderPosCount ++; //時計回りの場合はカウントを増やす
       bCW = true; //時計回り
     } else {// そうでなければ反時計回りと判断される
       bCW = false; //反時計回り
       encoderPosCount--; //反時計回りではカウントは減らす
     }
     Serial.print ("Rotated: ");
     if (bCW){
       Serial.println ("clockwise");
     }else{
       Serial.println("counterclockwise");
     }
     Serial.print("Encoder Position: ");
     Serial.println(encoderPosCount);
     
   } 
   pinALast = aVal;
   
     Serial.print("SW: ");
     Serial.println(digitalRead(pinSW)); 
     delay(1000);
 } 

ロータリエンコーダ入力ソフトの実行

スイッチを押すと「SW: 0」と表示されます。ロータリエンコーダのノブを時計回り/反時計回りするとエンコードの位置が増減されます。

?HpI<・l$・b8薔SW: 1
SW: 1
SW: 1
SW: 1
SW: 0
SW: 1
SW: 1
Rotated: counterclockwise
Encoder Position: -1
SW: 1
SW: 1
SW: 1
SW: 1
Rotated: counterclockwise
Encoder Position: -2
SW: 1
Rotated: clockwise
Encoder Position: -1
SW: 1
Rotated: counterclockwise
Encoder Position: -2
SW: 1
SW: 1
Rotated: clockwise
Encoder Position: -1
SW: 1
SW: 1
SW: 1
SW: 1
Rotated: counterclockwise
Encoder Position: -2
SW: 1
Rotated: counterclockwise
Encoder Position: -3
SW: 1
SW: 1
SW: 1
Rotated: clockwise
Encoder Position: -2