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

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

ただいまの
回答率

90.34%

  • C

    3967questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    573questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

C言語:関数を3回実行してから本文に戻したい。

解決済

回答 2

投稿

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

bobby2128

score 34

前提・実現したいこと

タイトル通りarduinoのプログラミングにて
ボタンが押されてから、関数の内容を3回実行してから本文に戻し、再びボタンを押されるのを待つようにコードを書き換えたいです。

発生している問題・エラーメッセージ

本文が下記だとスイッチを離した瞬間、関数の内容の実行が止まってしまいます。そのため、以下の該当のソースコードに示すように、スイッチが押されてからフラグを立て、そのフラグが立っている間は関数の中を実行するように改善しました。

ところが、現状では一度関数に飛ぶと、そこから本文に戻ってきても、フラグが立っている状態が維持されて、再び関数を実行しループに入ってしまいます。

そのため、関数を指定回数(例えば3回)実行してから、再び本文に戻りボタンプッシュ待機の状態にしたいです。
本文をすっきりさせたいので、できれば関数内でなんとかしたいのですが、関数の中からフラグを0にする手法もうまく浮かばず。。。

何か良いアイデア等ございましたらご教授おねがいいたします。

if(digitalRead(button)==HIGH){sendData();}

該当のソースコード

void loop() { 
if(digitalRead(button)==HIGH){buttonflag=1;}
 if(buttonflag==1){sendData();}
}

void sendData(){
for(i=0;i<3;i++){
実行文;
}
}

補足情報(言語/FW/ツール等のバージョンなど)

Arduino IDE 1.8.0
Arduino M0 Pro

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

こんにちは。

そのような場合は、ボタンのOFF→ONの変化とON→OFFの変化を捉えることが常套手段です。
OFF→ONへ変化した時だけsendData()を呼ぶイメージです。

loop()関数は繰り返し呼ばれ、最初の呼び出し前にbuttonflagがクリアされていると仮定すると、ちょっと手抜きですが下記のようなコードで出来ると思います。(何かミスしていたらごめんなさい。)

void loop()
{
    if(digitalRead(button)==HIGH)
    {
       if(buttonflag==0)
       {
           buttonflag=1;
           sendData();
       }
    }
    else
    {
       buttonflag=0;
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/09 10:16

    Chironian様
    こんにちはいつもお世話になります。ご回答いただきありがとうございます。
    ボタンの押した押してないの判断についてアイデアをいただきありがとうございます。
    プログラムを理解し自身のプログラムに書いてみたのですが、ボタンを押しても、押しっぱなしにしても反応しない現状で試行錯誤しています。

    お手数おかけいたしますがアイデア等ございましたらご教授よろしくお願いいたします。

    キャンセル

  • 2017/03/09 11:05

    変ですね。私の知らない何かがあるのかも知れません。
    でも、既に解決されたようなので、これにて。

    キャンセル

  • 2017/03/09 18:59

    Chironian様
    いつも迅速にご回答いただきありがとうございます。

    関数の呼び出しと実行について、またわからないことが発生し新たに質問させていただきました。
    ご都合がよろしければ、お手数おかけいたしますが、また、ご一読をどうかよろしくお願いいたします。

    キャンセル

checkベストアンサー

+1

以下のような流れでいけると思います。
求める動作にもよりますが、スイッチOFFの状態変化は見なくても大丈夫だと思います。

int sendState = 0;  // send実行状態 0=未実行 1~実行中

void loop() {
    if( sendState <= 0){
        if( digitalRead(button) == HIGH){
            sendState = 1;
        }
    }

    if(sendState > 0){
        sendData();

        // 「実行状態の更新」は こちらでやってもよい

    }
}

void sendData(){
    // 実行文

    // 実行状態の更新
    sendState++;
    if( sendState >= 4){
        sendState = 0;      // 終わり
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/09 10:14

    can110様
    こんにちはご回答いただきありがとうございます。
    ご提供いただきましたコードにて実行した結果、
    「実行状態の更新」箇所を関数の中に入れても本文に入れても同様に、
    ボタンを押している間は処理が実行され、ボタンを話した瞬間処理が止まってしまいます。非常に不思議です。

    キャンセル

  • 2017/03/09 10:34

    can110様
    申し訳ございません。
    シリアルプリントで挙動を確認したところ、自分の実行文と実行状態の更新の位置関係が悪かったみたいで、正常に動作いたしました。

    ありがとうございました。

    キャンセル

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

  • C

    3967questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • Arduino

    573questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。