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

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

ただいまの
回答率

90.84%

  • Arduino

    474questions

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

関数内からの即時脱出方法

受付中

回答 1

投稿

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

panjun

score 2

悩んでいます。下記の内容の対応はどの様にすれば解決するのでしょうか回答をお待ちします。
Arduinoのディジタル入力(PIN12:プルアップ)が、HIGHからLOWになればaという関数(a())に飛ぶように
作成しています。
このa()内では、for文で回数が多く、且つ1ループごとにdelay(100);が有るので1ループごとの時間が掛るため
デジタル入力PIN12が、HIGHに変っているのに戻ってくるのに時間がかかります。
実際は、デジタル入力はPin8~Pin12、デジタル制御(出力)をPin0~Pin7まで同様な使用方法をしています。
ループしている中でも即関数を抜け出る方法があるでしょうか。
While文、for文内にif(PIN12==LOW)等でbreak;を使いましたが解決していません。(入れる場所が適切でないのかも知れません)

よろしくお願いいたします。

該当のソースコード

Win10PCで、Arduino1.8.1を使用、ターゲットはArduinoUNOです。
void loop() {
Vala = digitalRead(digitalPin1);     //  (HIGH:停止/LOW:演出)
Valb = digitalRead(digitalPin2);    //  (HIGH:停止/LOW:演出)
Valc = digitalRead(digitalPin3);     //  (HIGH:停止/LOW:演出)
Vald = digitalRead(digitalPin4);     //  (HIGH:停止/LOW:演出)
if(Vala == HIGH){                    // 演出停止
}else{
RyuseiKIIRO();                 // 黄色
}
if(Valb == HIGH){                   // 演出停止
}else{
RyuseiAO();                  // 青色
}
if(Valc == HIGH){                   // 演出停止
}else{
RyuseiORENJI();               // オレンジ
}
if(Vald == HIGH){                   // 演出停止
}else{
RyuseiKIIRO_SLO();         // 黄色
}
}

//** 黄色*********************************
void RyuseiKIIRO_SLO(){
for (int q=0; q < 17; q++) {
for (int i=0; i < strip1.numPixels(); i=i+17) {
strip1.setPixelColor(i+q-1, strip1.Color(50,38,0)); 
strip2.setPixelColor(i+q-1, strip2.Color(5,35,0));
strip3.setPixelColor(i+q-1, strip3.Color(50,35,0));   
strip1.setPixelColor(i+q-2, strip1.Color(50,38,0));
strip2.setPixelColor(i+q-2, strip2.Color(50,35,0));
strip3.setPixelColor(i+q-2, strip3.Color(50,35,0));    
strip1.setPixelColor(i+q-3, strip1.Color(20,14,0));
strip2.setPixelColor(i+q-3, strip2.Color(One,110,0));
strip3.setPixelColor(i+q-3, strip3.Color(One,110,0));
strip1.setPixelColor(i+q-4, strip1.Color(13,10,0));
strip2.setPixelColor(i+q-4, strip2.Color(two,70,0));
strip3.setPixelColor(i+q-4, strip3.Color(two,70,0));
strip1.setPixelColor(i+q-5, strip1.Color(10,8,0));
strip2.setPixelColor(i+q-5, strip2.Color(three,60,0));
strip3.setPixelColor(i+q-5, strip3.Color(three,60,0));
strip1.setPixelColor(i+q-6, strip1.Color(4,4,0));
strip2.setPixelColor(i+q-6, strip2.Color(four,45,0));
strip3.setPixelColor(i+q-6, strip3.Color(four,45,0));
strip1.setPixelColor(i+q-7, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-7, strip2.Color(five,25,0));
strip3.setPixelColor(i+q-7, strip3.Color(five,25,0));
strip1.setPixelColor(i+q-8, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-8, strip2.Color(six,15,0));
strip3.setPixelColor(i+q-8, strip3.Color(six,15,0));
strip1.setPixelColor(i+q-9, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-9, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-9, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-10, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-10, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-10, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-11, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-11, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-11, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-12, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-12, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-12, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-13, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-13, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-13, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-14, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-14, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-14, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-15, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-15, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-15, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-16, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-16, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-16, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-17, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-17, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-17, strip3.Color(seven,8,0));
}
strip1.show();
strip2.show();
strip3.show();
delay(500);
}
}

試したこと

//** 黄色流星流れ*********************************
void RyuseiKIIRO_SLO(){
while(!Vald){
for (int q=0; q < 17; q++) {
while(!Vald){
for (int i=0; i < strip1.numPixels(); i=i+17) {
strip1.setPixelColor(i+q-1, strip1.Color(50,38,0)); 
strip2.setPixelColor(i+q-1, strip2.Color(5,35,0));
strip3.setPixelColor(i+q-1, strip3.Color(50,35,0));   
strip1.setPixelColor(i+q-2, strip1.Color(50,38,0));
strip2.setPixelColor(i+q-2, strip2.Color(50,35,0));
strip3.setPixelColor(i+q-2, strip3.Color(50,35,0));    
strip1.setPixelColor(i+q-3, strip1.Color(20,14,0));
strip2.setPixelColor(i+q-3, strip2.Color(One,110,0));
strip3.setPixelColor(i+q-3, strip3.Color(One,110,0));
strip1.setPixelColor(i+q-4, strip1.Color(13,10,0));
strip2.setPixelColor(i+q-4, strip2.Color(two,70,0));
strip3.setPixelColor(i+q-4, strip3.Color(two,70,0));
strip1.setPixelColor(i+q-5, strip1.Color(10,8,0));
strip2.setPixelColor(i+q-5, strip2.Color(three,60,0));
strip3.setPixelColor(i+q-5, strip3.Color(three,60,0));
strip1.setPixelColor(i+q-6, strip1.Color(4,4,0));
strip2.setPixelColor(i+q-6, strip2.Color(four,45,0));
strip3.setPixelColor(i+q-6, strip3.Color(four,45,0));
strip1.setPixelColor(i+q-7, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-7, strip2.Color(five,25,0));
strip3.setPixelColor(i+q-7, strip3.Color(five,25,0));
strip1.setPixelColor(i+q-8, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-8, strip2.Color(six,15,0));
strip3.setPixelColor(i+q-8, strip3.Color(six,15,0));
strip1.setPixelColor(i+q-9, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-9, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-9, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-10, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-10, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-10, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-11, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-11, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-11, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-12, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-12, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-12, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-13, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-13, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-13, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-14, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-14, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-14, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-15, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-15, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-15, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-16, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-16, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-16, strip3.Color(seven,8,0));
strip1.setPixelColor(i+q-17, strip1.Color(1,1,0));
strip2.setPixelColor(i+q-17, strip2.Color(seven,8,0));
strip3.setPixelColor(i+q-17, strip3.Color(seven,8,0));
}
strip1.show();
strip2.show();
strip3.show();
delay(500);
}
}

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

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

While文、for文内にif(PIN12==LOW)等でbreak;を使いましたが解決していません。

想像ですが、PIN12の値は関数呼出し前のピン状態のままじゃないですか?

void loop(){
    PIN12 = digitalRead(...);
    if(...){
        a();
    }
}

void a(){
   for(...){
      if(PIN12 == LOW){} // <- a()に入る直前のPIN12の値をずっと見ている
   }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/22 14:36

    その通りです。ありがとうございます。
    While文内で再読み込みを入れてみます。

    キャンセル

  • 2017/12/22 14:46

    While文を下記のように関数トップに入れましたが関数内の動作は停止してしまいました。
    (少しでも高速に関数を抜け出たいので各for文の前に入れました。

    void RyuseiKIIRO_SLO(){
    while(!Vald){
    Vald = digitalRead(digitalPin4); // (HIGH:停止/LOW:演出)
    for (int q=0; q < 17; q++) {
    while(!Vald){
    Vald = digitalRead(digitalPin4); // (HIGH:停止/LOW:演出)
    for (int i=0; i < strip1.numPixels(); i=i+17) {
    strip1.setPixelColor(i+q-1, strip1.Color(50,38,0));
    strip2.setPixelColor(i+q-1, strip2.Color(5,35,0));

    キャンセル

  • 2017/12/22 14:51 編集

    > 関数内の動作は停止してしまいました

    どういう意味ですか?
    プログラムがフリーズしたのか、
    途中で終わって呼び出し元に戻ったのか。

    キャンセル

  • 2017/12/22 15:12

    もしやりたいことが
    1.画面に何も写っていない
    2.ボタンを押している間は画面にアニメーションが流れる
    3.ボタンを押していない場合は画面に何も映さない

    であり、3.が実現できていないなら、
    3.の実装がどこにもないので当然です。

    キャンセル

  • 2017/12/22 17:17

    すいません、言葉足らずでした。
    実は関数の内容は、テープLEDを順番に点灯させていく物ですが、LEDが点灯しないのです。
    while(!Vald){
    Vald = digitalRead(digitalPin4); // (HIGH:停止/LOW:演出)の追加部分をコメントすると
    動作(LEDの順次点灯)します。
    ただしfor文が終了し関数を抜けないとdigitalRead(digitalPin4);でHIGHを検出してくれません。
    (上記PinがLOWで関数が呼び出されます。)
    なぜfor文が実行されないか不明です。入れる場所が悪いのでしょうか。

    キャンセル

  • 2017/12/22 17:21

    またまた言葉足らずでした。
    先ほどの場合、関数内でループしている感じで、他のデジタルピンの状態も見に行っていない状態です。
    関数内には入っているようですが、LEDが全く点灯しないままです。
    デジタルピン(4本)をHIGH、LOWしても無反応です。

    キャンセル

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

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

関連した質問

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

  • Arduino

    474questions

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