最初のプロジェクトとして、さまざまなライトモードでteensyduinoアンビエントライトを作成することを計画しています。これは、大きなswitchステートメントでチェックされます。今度は、ボタンを押して、あるモードから別のモードに切り替えたいと思います。
グーグルで割り込みを使用するようになりましたが、明確ではない点が1つあります。時間がかかり、多くの変数が使用されている高価な関数でボタンを押すと、割り込みからメインループを呼び出すとどうなりますか。残りの状態はRAMに残り、何度も切り替えたり、クリアしたりすると、スタックオーバーフローが発生します。
ここにいくつかのコードがあります:
const int speed = 30 //milliseconds
const int modes = 11; //maximum number of modes
const int red = 15;
const int green = 14;
const int blue = 12;
volatile int mode = 0;
void setup() {
pinMode(red , OUTPUT);
pinMode(green , OUTPUT);
pinMode(blue , OUTPUT);
randomSeed(analogRead(0));
Serial.begin(9600);
attachInterrupt(0,incMode,CHANGE); // 0 -> digital pin 2
}
void loop() {
switch(mode){
case 0:{
Serial.println("powerdown");
setAll(0);
delay(1000);
break;
}
\\...
case modes:{
\\ expensive long function
}
}
}
void blinkAll(int times){
for(int i=1;i <= times;i++){
setAll(255);
delay(speed*17);
setAll(0);
delay(speed*17);
}
}
void setAll(int bright){
analogWrite(red , bright);
analogWrite(green , bright);
analogWrite(blue , bright);
}
void incMode(){
delay(speed);
blinkAll(2); //to indicate mode has changed
mode = (mode+1) % (modes+1); //switch starts with 0 so use "% modes+1"!
Serial.println("mode increased");
//--> loop();
//--> would resume the main loop but lead to a stackoverflow i presume
}
遅延やスタックの汚染なしに、実行中の機能から抜け出すにはどうすればよいでしょうか。モードを設定して機能が終了するまで待つこともできますが、終了までに数分かかるモードがある場合は、すぐに切り替えられるようにしたいと思います。
PS:私はteensyduinoを使用していますが、arduinoタグを使用します。また、arduinioがタグc /c++を使用する言語がわからないためです。適切でない場合は、これを変更してください。