• ベストアンサー

Arduino LEDを任意に点灯させたい

LEDが3個とプッシュスィッチ1個の構成で LED1とLED2が10秒毎交互に点灯し続けプッシュスィッチを押した時だけLED3が5秒間点灯するスケッチを教えて下さい。 delayを使うとLED1とLED2の動作が終わるまでLED3が点灯しません スィッチを押したら直ぐにLED3が点灯しその間もLED1とLED2は交互に点灯し続けるようにしたいのですがどなたか宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.3

No.2 補足 割り込みカウンタ を unsigned int に変えると 65535 までカウント可能です 65535 / 2 = 32767.5 ( 3276s , 54min ) static unsigned char led1_cnt = 0 , led3_cnt = 0; ↓ static unsigned int led1_cnt = 0 , led3_cnt = 0;

ainame60
質問者

お礼

期待通りの動きになりこれで水耕栽培の自動化が完成します。 スケッチを自分で作れるようになれば良いのですがかなり難しいです。 今回も助かりました大変有り難うございます。

その他の回答 (2)

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

LED点滅にタイマ割り込みを使ってみました、 スイッチ入力は外部割込みです Arduno UNO で確認 #include <MsTimer2.h> #define SW_P 2 // Uno: pin2(int.0) pin3(int.1) sw_port 固定 const unsigned char LED_P[] = { 3 , 4 , 5 }; // led 1 2 3 port #define LED_ON LOW #define LED_OFF HIGH #define LED1_MAX 100 // 10s #define LED3_MAX 50 // 5s volatile unsigned char sw_flag = 0; void sw_isr(void){ sw_flag = 1; } void led_isr(void){ static unsigned char led1_cnt = 0 , led3_cnt = 0; if ( led1_cnt == 0 ){ digitalWrite( LED_P[0] , LED_ON ); digitalWrite( LED_P[1] , LED_OFF ); } if ( led1_cnt == LED1_MAX ){ digitalWrite( LED_P[0] , LED_OFF ); digitalWrite( LED_P[1] , LED_ON ); } led1_cnt++; if ( led1_cnt >= ( LED1_MAX * 2 ) ){ led1_cnt = 0 ; } if ( sw_flag == 0 ){ return; } if ( led3_cnt == 0 ){ digitalWrite( LED_P[2] , LED_ON ); } led3_cnt++; if ( led3_cnt >= LED3_MAX ){ digitalWrite( LED_P[2] , LED_OFF ); led3_cnt = 0; sw_flag = 0; } } void setup() { unsigned char i; for ( i=0 ; i<3 ; i++ ){ pinMode( LED_P[i] , OUTPUT ); digitalWrite( LED_P[i] , LED_OFF ); } // for pinMode( SW_P , INPUT_PULLUP ); attachInterrupt( 0 , sw_isr , FALLING ); MsTimer2::set( 100 , led_isr ); // 100ms MsTimer2::start(); } void loop() { }

ainame60
質問者

お礼

koujikuuさん  いつもお世話になります Arduino Pro Miniの 2,3,4,5ピンを使いましたが LED3が常時点灯しSW押した時に5秒間消灯する動作になりました 押すとOFFのSW利用すれば良いのかと思いましたが スケッチの  #define LED_ON LOW  #define LED_OFF HIGH のところでLOW HIGH逆にしたら期待した動作になりました。 LED1と2を10分間ずつ交互点灯にさせたくて #define LED1_MAX の数値を6000に変えてみると一方だけ点灯が続き交互になりませんでした。 長時間での交互点灯にしたい場合どこを変更したらよろしいでしょうか? LED3は20秒程度でここは延長可能でした。 早速の回答を頂き有難うございます さらに質問で申し訳ありませんが宜しくお願いします。

  • kaba__san
  • ベストアンサー率45% (27/59)
回答No.1

delay使わない。 millisを使う。 これで検索すりゃ解説がザクザク。

関連するQ&A

専門家に質問してみよう