プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

ルーレット

しばらく、水遣りとは違うことをやってみます。

前回、Loggingをやるといいましたが、なかなか複雑なので逃避します。

ゲーム的なものを作ってみます。

スイッチを押すと、だんだんゆっくりになりランダムな場所に止まります。

6つのLEDをさいころの1~6に見立てて、擬似乱数によりいづれかの数字にとまります。

だんだんゆっくりになるところや、1~6にすばやく切り替わるところはこのように動くとそれっぽく見えるので入れてみました。

==================================

void setup() {

randomSeed(analogRead(0));

void loop() {

randNumber = random(6, 12); // 10から12の乱数を生成

==================================

setupのなかにrandomSeedとloopのなかにrandNumberを記述し、乱数を生成します。

ここでは6~11のpinにLEDを接続しているので、6~11の乱数が発生するようにします。

random関数では、6以上から12未満と記述します。

randNumber = random(6, 12);

LEDを順番に点灯するには、forを利用して、LEDの接続しているPin Noを順番に変更していきます。これが、ゲームスタートの動きです。

=================================

for (i = 6; i < 12; i++) {

digitalWrite(i, HIGH);

delay(wait);

digitalWrite(i, LOW);

Serial.println("k");

} //for

==================================

Digital/AnalogのピンNo.にも、for による変数を利用できるのですね。

この応用が、Setupの中で、OUTPUTの宣言にも使用できます。

==================================

oid setup() {

Serial.begin(9600);

for (i = 6; i < 12; i++) {

pinMode(i, OUTPUT);

==================================

これで、

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

pinMode(8,OUTPUT);

と同じ意味になります。

6つぐらいでしたら、すべて記載してもたいしたことは無いですが、コードの読みやすさを考えてこのような方法を使うほうがよいらしいです。

ちなみに、loopのなかではArduinoの電源が入っていて、その構文に戻ってくる限り永遠にこの宣言がやり直されますが、Setupの中では電源ONの最初に一回が実施されるだけです。

ですが、もちろんpinModeの宣言は一度でよいので、これでよいのです。

==============================================

if (sw1 == 1) {

state = 1;

}

else if (state == 1) {

==============================================

ifでタクトスイッチを検出し、stateという変数によりスイッチが押されたことを検出し、状態を変更します。

state = 1;

そして、続けて

else if (state == 1) {

に入ります。

実験段階で、二つ目のタクトスイッチを使っていましたが、最終的にはなくしました。

==============================================

//ルーレット

int i = 6;

int sw1 = 0;

int sw2 = 0;

int state = 0;

int wait = 30;

int k = 0;

int randNumber;

void setup() {

Serial.begin(9600);

for (i = 6; i < 12; i++) {

pinMode(i, OUTPUT);

}

pinMode(A1, INPUT);

pinMode(2, INPUT);

randomSeed(analogRead(0));

}

void loop() {

randNumber = random(6, 12); // 10から12の乱数を生成

sw1 = digitalRead(A1) ;

if (sw1 == 1) {

state = 1;

}

else if (state == 1) {

wait = wait + 10;

Serial.println("state");

Serial.print(sw1);

Serial.print(',');

Serial.println(sw2);

if (sw2 == 1) {

state = 0;

}

for (i = 6; i < 12; i++) {

if (i == randNumber && wait > 80) {

digitalWrite(i, HIGH);

delay(2500);

wait = 30;

state = 0;

}

else {

digitalWrite(i, HIGH);

delay(wait);

digitalWrite(i, LOW);

}

} //for

}

else {

for (i = 6; i < 12; i++) {

digitalWrite(i, HIGH);

delay(wait);

digitalWrite(i, LOW);

Serial.println("k");

} //for

}

}