前提・実現したいこと
LEDを9個接続し真ん中の9番ピンのLEDの発光時にボタンを押すと全てのLEDが発光するものを目指しています。
if文の中が間違っていると思うのですが何をやってもLEDが光るだけでボタンを押しても何も反応しません。
発生している問題・エラーメッセージ
特に出ませんでした。
該当のソースコード
int i;
void setup(){
for(i=5;i<14;i++){
pinMode(i, OUTPUT); //LED
}
pinMode(1, INPUT); //スイッチ
pinMode(2, INPUT); //圧電スピーカー
}
void loop(){
int sw = digitalRead(1);
for(i=5;i<14;i++){
digitalWrite(i, HIGH);
delay(500);
digitalWrite(i, LOW);
delay(500); //500msでLEDの発光
}
if(sw == HIGH){ //9番ピンのLEDが発光した時にスイッチを押すと以下のif文
if(digitalRead(9)== HIGH){
for(i=5;i<14;i++){
digitalWrite(i, HIGH);
}
tone(2,261,100);
delay(100);
tone(2,261,100);
delay(100);
tone(2,261,100);
delay(100);
}
}
}
試したこと
if文の中のif(digitalRead(9) == HIGH)
をif(digitalWrite(9, HIGH))
にしてみましたがエラーが出ました。エラーメッセージは
error: could not convert 'difitalWrite(9u, 1u)' from 'void' to 'bool'
でした
補足情報(FW/ツールのバージョンなど)
。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
コードを見ると、
- スイッチ状態を読み込み
- LEDを回転点灯
- 1で読み込んだスイッチを判定
となってます。そもそもの考え方がおかしいかと。
それに、
if(digitalRead(9)== HIGH){
ってのが意味不明です。2の実行でLEDは全消灯してます
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
一番悪い点は、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);//音の代わり
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる