質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.90%

Arduinoを用いてLEDの発光時にif文を用いて動作を分けたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 237

max-321

score 1

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

コードを見ると、

  1. スイッチ状態を読み込み
  2. LEDを回転点灯
  3. 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);//音の代わり
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/18 10:44

    ありがとうございました。もう少し自分の力でできるように勉強します。

    キャンセル

  • 2020/07/18 12:15

    if(cnt>=400 &&cnt<450) {//成功なら

    の部分は下の方が良かったかも。
    つまり、そのまま「9番ピンのLEDが点灯していたら」

    if(digitalRead(9)==HIGH){

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る