前提
ArduinoでトグルスイッチがHIGH、LOWと切り替わるたびに
LEDの色を変えるプログラムを作っています。
(割り込み処理を利用して)
ループを利用すれば簡単なのですが、
ここからさらに発展させていくのでループは使用出来ません...
実現したいこと
- 割り込み処理でトグルスイッチを使用したい。
発生している問題
ON、OFFの切り替えが出来る時と出来ない時がある
(LEDの色が変わったり変わらなかったりする)
チャタリングが原因だとしたら、
割り込み処理におけるチャタリング除去方法をご教授頂きたいです。
該当のソースコード
Arduino
1#include "mono_con.h" 2 3volatile bool tswstate; 4 5 6void setup() { 7 8 pinMode(IN2, INPUT); //トグルスイッチ 9 10 pinMode(FCLED_G, OUTPUT); //各種LED 11 pinMode(FCLED_B, OUTPUT); 12 pinMode(FCLED_R, OUTPUT); 13 14 attachInterrupt(digitalPinToInterrupt(IN2), TSWCNT, CHANGE); 15 16 tswstate = LOW; 17 18 digitalWrite(FCLED_G, LOW); 19 digitalWrite(FCLED_B, LOW); 20 digitalWrite(FCLED_R, LOW); 21 22} 23 24void TSWCNT(void) { 25 noInterrupts(); 26 tswstate = !tswstate; 27 interrupts(); 28} 29 30 31 32void loop() { 33 34 if (tswstate) { 35 digitalWrite(FCLED_G, HIGH); 36 digitalWrite(FCLED_B, LOW); 37 digitalWrite(FCLED_R, LOW); 38 delay(100); 39 digitalWrite(FCLED_G, LOW); 40 digitalWrite(FCLED_B, LOW); 41 digitalWrite(FCLED_R, LOW); 42 delay(100); 43 } 44 else { 45 digitalWrite(FCLED_G, LOW); 46 digitalWrite(FCLED_B, LOW); 47 digitalWrite(FCLED_R, HIGH); 48 delay(100); 49 digitalWrite(FCLED_G, LOW); 50 digitalWrite(FCLED_B, LOW); 51 digitalWrite(FCLED_R, LOW); 52 delay(100); 53 } 54 55 delay(10); 56} 57
試したこと
noInterruptsとinterruptsをループの中にも配置した。
→挙動は不審なままだった。
補足情報(FW/ツールのバージョンなど)
Arduino 1.8.19を使用。
回答2件