無料ブログはココログ

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

2021年6月 6日 (日)

Arduinoでもっと電子工作を9

Lesson8

週末はDCCをお休みして、汎用の電子工作で遊んでます。今回は、やはり定番の電子ルーレットを作ってみました。停止位置は良く見かける乱数関数は使わず、表示を見て意図的に止められる方法にしました。但し実際に狙った値で止まるかはあなたの腕次第です。

7seg1 7seg6 Num6

[ENT]ボタンを押すと開始、もう一度[ENT]を押すと減速して停止します。7個のセグメンを回転表示して、停止を押された時のセグメント位置で1から7の値を決定します。1セグメントだけを点灯させるため coding()を省略したdisplaySegment()関数をTM1637keyライブラリに追加しました。回転速度で難易度が変わるので、こちらに乱数を使いました。停止する時間も回転速度で変わります。
タスクスケジュールは50msec固定で、回転速度と停止時間はカウンターで可変します。
コードが多いのでzipファイルをアップしました。

// グローバル変数定義
byte gRun = 0;
byte gStart = 0;
byte gStop = 0;
byte gCounter;
byte gRouleCount;
byte gSegPos = 0;
byte gStopNum;

//Task Schedule
unsigned long gPreviousL1;

void loop() {
 // ローカル変数定義
 byte aKeybyte;
 
 if (millis() - gPreviousL1 > 50) {
  gPreviousL1 = millis();
  
  aKeybyte = keyConverter(tm1637key.keyscan());
  if (aKeybyte == 12) { // [ENT]
   gRun ^= 1; // 反転
   if (gRun == 1) { // Run
    gStart = random(0, 4); // 回転速度は0から4までの乱数でカウント
    gCounter = 0;
   }
   else {
    gStop = (128 - (gStart << 4)); // 停止タイム 6.4sec - 3.2sec
    gCounter = 0;
    gRouleCount = 0;
    gStopNum = gSegPos + 1; // セグメントカウンタ + 1
   }
  }

  if (gRun == 1) RunRoulette();
  else EndRoulette();
 }
}

// 回転表示
void RunRoulette() {
 gCounter++;
 if (gCounter > gStart) {
  gCounter = 0;
  DisplaySegment(); // 表示を動かす
 }
}

// 停止までの表示
void EndRoulette()
{
 if (gStop > 0) {
  gStop--;
  if (gStop == 0) {
    tm1637key.display(0, gStopNum); // 表示を止める
  }
  else {
   gCounter++;
   if (gCounter > gRouleCount) {
    gCounter = 0;
    DisplaySegment(); // 表示を動かす
    gRouleCount++; // 徐々に遅くする
   }
  }
 }
}

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

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

コメント

コメントを書く

(ウェブ上には掲載しません)

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