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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

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

Q&A

1回答

141閲覧

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

panjun

総合スコア6

Arduino

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

0グッド

0クリップ

投稿2017/12/22 05:19

悩んでいます。下記の内容の対応はどの様にすれば解決するのでしょうか回答をお待ちします。
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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

C++

1void loop(){ 2 PIN12 = digitalRead(...); 3 if(...){ 4 a(); 5 } 6} 7 8void a(){ 9 for(...){ 10 if(PIN12 == LOW){} // <- a()に入る直前のPIN12の値をずっと見ている 11 } 12}

投稿2017/12/22 05:28

編集2017/12/22 05:30
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panjun

2017/12/22 05:36

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

2017/12/22 05: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));
ozwk

2017/12/22 06:08 編集

> 関数内の動作は停止してしまいました どういう意味ですか? プログラムがフリーズしたのか、 途中で終わって呼び出し元に戻ったのか。
ozwk

2017/12/22 06:12

もしやりたいことが 1.画面に何も写っていない 2.ボタンを押している間は画面にアニメーションが流れる 3.ボタンを押していない場合は画面に何も映さない であり、3.が実現できていないなら、 3.の実装がどこにもないので当然です。
panjun

2017/12/22 08:17

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

2017/12/22 08:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問