質問: HIGH)`を`if(digitalWrite(9, HIGH))`にしてみましたがエラーが出ました。エラーメッセージは error: could not convert 'difitalWrite(9u, 1u)' from 'void' to 'bool' でした ### 補足情報(FW/ツールのバージョンなど) 。
回答: 一番悪い点は、SWの状態の読み取りとLEDの点灯位置とが無関係になっている点です。 LEDが移動していく最中もSWの状態を見て、どこで押したのかを判断する必要があります。 例えば、下の例だと、10msでwhileの中を回しています。 その回数を数えてLEDを操作しています。 LEDが9個なので、計9秒(cntだと900)で一巡する計算になります。 つまりcntが、0,100,200...のタイミングLEDnを点灯させる 50,150,250...のタイミングで、LEDnを消灯させる という事で、各LEDを操作します。 そして、SWを押したらwhileを抜ける→その時のcntがSWを押したときの状態になります。 で、cntが400~450なら9ピンのLEDが押した時に相当しますから、 その時に成功のイベント、それ以外の時は失敗のイベントになります。 後の注意事項は ・LEDピンは配列にした方が解り易いです。 ・圧電スピーカはOUTPUT(出力)です。ただし、tone関数を使うなら出力設定は要りません。 ・SWを押した時にHIGHにするのなら、『プルダウン抵抗を付けて』、PIN-SW-5Vと繋ぎます。 ``` void setup() { for(int i=5; i<14; i++) { pinMode(i, OUTPUT); //LED } pinMode(1, INPUT); //スイッチ // pinMode(2, OUTPUT); //圧電スピーカー } void loop() { word cnt=0; while(1) { if(cnt%100==0)digitalWrite(cnt/100+5,HIGH); else if(cnt%100==50)digitalWrite(cnt/100+5,LOW); if(digitalRead(1)==HIGH)break; delay(10); if(++cnt==900)cnt=0; } if(cnt>=400 &&cnt<450) {//成功なら for(byte i=5; i<14; i++)digitalWrite(i,HIGH); //ファンファーレ delay(4000);//音の代わり for(byte i=5; i<14; i++)digitalWrite(i,LOW); } else {//失敗なら for(byte i=5; i<14; i++)digitalWrite(i,LOW); //ブブー delay(4000);//音の代わり } } ```