Arduinoでもっと電子工作を9
Lesson8
週末はDCCをお休みして、汎用の電子工作で遊んでます。今回は、やはり定番の電子ルーレットを作ってみました。停止位置は良く見かける乱数関数は使わず、表示を見て意図的に止められる方法にしました。但し実際に狙った値で止まるかはあなたの腕次第です。
[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 »
「電子工作」カテゴリの記事
- Arduinoでもっと電子工作を11(2021.08.24)
- Arduinoでもっと電子工作を10(2021.06.22)
- Arduinoでもっと電子工作を9(2021.06.06)
- Arduinoでもっと電子工作を8(2021.05.18)
- Arduinoでもっと電子工作を7(2021.05.15)
コメント