多くの異なる長時間実行セクション (一度に 15 分になる場合もあります) を持つプログラムがあり、「IF」ステートメントを使用して実行するセクションを決定します。
私の問題は、ボタンを押して、現在のセクションが完了するのを待たずにすぐに別のセクションに移動できるようにしたいということです。
外部割り込みを使用できると思っていましたが、割り込みによってプログラムが割り込みコードの実行を停止し、割り込みが呼び出される前と同じ場所から実行を継続することがわかりました。
次に、「goto」ステートメントを使用できると考えましたが、ラベルが「goto」ステートメントを使用している関数の外側にある場合、コンパイラーが文句を言うため、それは機能しません。
以下にコードを投稿しました。基本的には、ボタンを押したときにコードが何をしていても、ボタンを押して次の「IF」ステートメントに移動できるようにしたいと考えています。
遅延は、プログラムが何をするかをシミュレートするためのものです。このプログラムは、実際にはさまざまなモードを持つロボット用です。モード 1 では、ナビゲートするだけです。モード 2 では、コントローラーで制御できます。モード 3 では、PIR センサーが何かを検出するまで待機し、その後ローミングを開始します。
つまり、ロボットは、任意のことをしている間、任意の状態にある可能性があることがわかります。ボタンを押して停止し、モードを変更したいと考えています。
サンプルコード
volatile int state = LOW;
int mode = 0;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, blink, RISING);
}
void loop()
{
Serial.println();
Serial.print("##########################");
Serial.println();
Serial.print("Start it again");
Serial.println();
Serial.print("##########################");
if(mode==0)
{Serial.println();
Serial.print("0");
Serial.println();
delay(30000);}
if(mode==1)
{Serial.println();
Serial.print("1");
Serial.println();
delay(30000);}
if(mode==2)
{Serial.println();
Serial.print("2");
Serial.println();
delay(30000);}
if(mode==3)
{Serial.println();
Serial.print("3");
Serial.println();
delay(30000);}
if(mode==4)
{Serial.println();
Serial.print("4");
Serial.println();
delay(30000);}
}
void blink()
{ delay(800); // This is just a delay to allow for the button press
if(mode >= 4)
{mode = 0;}
else{mode = ++mode ;}
}