無料ブログはココログ

« Arduinoでもっと電子工作を7 | トップページ | C-SizeDCC Throttle »

2021年5月18日 (火)

Arduinoでもっと電子工作を8

Lesson7

TM1637は7セグLEDの他に16個のキー読み出しが出来ます。前回の基板にタクトスイッチをはんだ付けして、押したテンキーの数値を7セグLEDに表示してみます。keyscan()関数は反転されたデータが返るので、keyConverter()関数を作って都合の良い値に変換しました。keyscan()の値はLesson6で紹介したSerial.printで確かめました。

Segkey

Arduinoフォーラム(forum.arduino.cc)にアタッチされていた、キースキャンを追加したTM1637ライブラリを拝借して、クラス定義をTM1637keyにしました。

グローバル定義

//定義ファイルインクルード
#include "TM1637key.h"

//デバッグを有効にする
#define DEBUG

//I/Oポート番号定義
#define PIN_CLK 13
#define PIN_DIO 11

//TM1637keyライブラリをクラス定義して初期化
TM1637 tm1637key(PIN_CLK, PIN_DIO);

//グローバル変数定義
byte KeyBuff[] = {0x7f,0x7f,0x7f,0x7f}; //4桁のブランクデータ
byte gKeyByte; //ローカル変数定義

//function
byte keyConverter(byte inkey);

//Task Schedule
unsigned long gPreviousL1 = 0;

セットアップと実行

void setup() {
 Serial.begin(115200);
 while (!Serial);
 
 tm1637key.init();
 tm1637key.set(BRIGHT_TYPICAL);
 
 tm1637key.display(KeyBuff); //ブランク表示

 gPreviousL1 = millis();
}

void loop() {
 byte aKeybyte;
 
 if( millis() - gPreviousL1 > 1000) {
  //Reset task
  gPreviousL1 = millis();
  
  aKeybyte = tm1637key.keyscan();
  if (aKeybyte != 255) {
   #ifdef DEBUG
   Serial.println(aKeybyte);
   #endif
   //7セグ表示に都合の良い値に変換
   gKeyByte = keyConverter(aKeybyte);
   //7セグに表示する
   DisplayKey(gKeyByte);
 }
}

デバッグ出力

247
246
245
244
243
242
241
240
239
238

スキャンデータ変換関数

byte keyConverter(byte inKey)
{
 byte aKey_bit = inKey & 0x1f; //上位3ビットをマスク
 
 aKey_bit = aKey_bit ^ 0x1f; //ビットを反転
 aKey_bit -= 8; //7セグに表示できる値にする
 
 return aKey_bit; //結果を返す
}

表示関数

void DisplayKey(byte inDat)
{
 //直前の表示を上位桁にシフト
 for (byte i=3; i>0; i--) {
  KeyBuff[i] = KeyBuff[i - 1];
 }
 //押されたキーを最下位桁に表示
 KeyBuff[0] = inDat;
 
 //display(uint8_t, int8_t)関数のオーバーロードを使う
 tm1637key.display(KeyBuff);
}

 

« Arduinoでもっと電子工作を7 | トップページ | C-SizeDCC Throttle »

電子工作」カテゴリの記事

コメント

この記事へのコメントは終了しました。