• ベストアンサー

LED点滅速度

タクトスイッチを使って点滅速度を変えたいのですが、SW1を押してる間は徐々に速度アップ、SW2を押してる間は徐々に速度ダウンというようにしたくて、delayの数値をif文を使って、SWを押してる間数値を上げ下げするやり方で作ったのですがこれだと点滅間隔が長い時はSWを押してもなかなか間隔が短くならず、点滅間隔が短くなるにつれてあっという間に間隔が短くなってしまいます。理由はわかってますが…。 何かイイ方法がありましたらアドバイスお願いします。CCSCコンパイラでやってます。

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

  • ベストアンサー
  • misawajp
  • ベストアンサー率24% (918/3743)
回答No.3

if文を実行する間隔を一定するように 点滅速度とは同期しない様にすればできるはずです (想像ですが、点灯に同期してスイッチを読んでいるのでしょう) 論理的に構築していないための弊害です(質問者は気づいているようですが) 論理の裏動作(AでBならばこうなるはずで設計しても、AでなくてBでない場合等に設計と異なる動作をしてしまう)

その他の回答 (2)

回答No.2

まず、 > 理由はわかってますが…。 最低限、「理由」の説明はしましょう。 その上で、 ・その「理由」と、実際に書かれたソースはつじつまが合っているのか? ・では、点滅間隔の変化をどのようにしたら、自然な変化に感じるのか? くらいは質問の中にあって、 ・そこで、そういう(自然な変化に感じるような)ソースの書き方は何か工夫がないでしょうか? という流れなら、いい回答があるかもしれません。 そもそも、ソースが間違っているという可能性もあるし、ソースは意図したとおりだけど、それだと、人間の感覚として不自然ということもあるし。もっと言えば、ディレイに使っている変数のサイズによっては、どうあがいても、自然な変化は出せないかもしれないし。

回答No.1

…この質問で何かしら有効な答えが得られると思います?

yto0611
質問者

お礼

質問の内容がわからないって事ですか?

関連するQ&A

  • LEDをタイマー機能を使って点滅させるプログラムです

    LEDをタイマー機能を使用し、点滅させるプログラムなのですが、 if(input(PIN_b0)){output_c(0b00001111);} delay_ms(20); {output_c(0b11110000);} : : と続ずいていくのですが、もっと点滅速度を速くするには どうすればよいのでしょうか? また、例えばスイッチ1が押されたら、そこのLEDだけを 繰り返し連続で点滅させるには、どのような感じで記述すればよいのでしょうか? 例えばでいいので、普通のC言語だったらどのように記述するのか 教えてください。

  • PICマイコンでLEDの点滅をC言語で記述法を教えてください

    PICマイコン(PIC16F84A)にLEDを1個接続し点滅だけのプログラムをC言語で記述を書きたいのですが、教えていただけないでしょうか? CCS社のコンパイラを用いた時の記述の書き方を教えていただけないでしょうか? 条件は、 ・電池を繋げるとLEDが点滅、スイッチ素子は用いません。 ・LEDは1秒間隔で点滅し、永遠に点滅 ・LEDは、PICマイコン(PIC16F84A)の9番ピン(RB3に該当)に接続 ・水晶発振子は、10MHzを使用。 ・コンパイラは、CCS社を使用 私が分かる範囲は下記なのですが、これから先の記述方法が分かりません。 #include <16f84a.h> #fuses HS, NOWDT, NOPROTECT #use delay(clock=10000000) #byte port_b=6 main() { この中身の記述方法が分かりません。 教えていただけないでしょうか? } よろしくお願いします。

  • C言語プログラミングについて…Arduinoを用い

    C言語プログラミングについて…Arduinoを用いて、以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを作りました。次にその使用した「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、いろいろと変えてみたのですが、シリアルモニタを見るとif文を用いた時に「RedSwitch」が押された「回数」ではなく連続的に?押した「秒数」をカウントして困ってます。どうやったら改善できるのでしょうかか?ご教授お願いしたします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void) { digitalWrite(13,LED_ON); delay(500); digitalWrite(13,LED_OFF); delay(500); } void loop() { unsigned char SW_CNT=0,SW_TIME=0,i; while( (SW_TIME<100) || (SW_CNT==0) ) { sw_check(); if ( SW_RedSwitch==2 ) { SW_RedSwitch=0; SW_CNT++; SW_TIME=0; } SW_TIME++; delay(20); } for (i=1 ; i<=SW_CNT ; i++) { blink(); } }

  • Ardinoについて…

    C言語プログラミングについて…以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを「switch case」文で作ったものがある。この「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、うまくスイッチの押した回数が読み込めません。となたか解説お願いします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void)

  • LEDの点灯(C言語,PIC)

    PICを用いてLEDを点滅させます. #INT_RTCC rtcc_pulse() { counter++; if(counter == t){ counter = 0; LED1_ON(); delay_ms(10); } else{ LED1_OFF(); } この関数のtの値を変調させ,OFFの時間を徐々に増やしていき,それを繰り返したいのですが,やり方がわからず困ってます. tはfor(t=52;t<=152;t+=10)のように増やしていきたいです.

  • ON→OFF固定モードになるタクトスイッチ

    当方我流で簡単な電子工作の初歩の初歩を現在かじり中です。 チャタリングなどして調子の悪いマウスを分解してタクトスイッチを交換して復活させたりしていたのですが、ボタン不良の水質計を入手し そのうち一つのタクトスイッチが押すと画面表示した数値が固定され もう一回押すと解除される構造になっているようです。 タクトスイッチと言えば押した瞬間だけONになるので普通のタクトスイッチでは上記機能は使えません、試しに普通のタクトスイッチに交換しスイッチを押しっぱなしにしても2~3秒でゼロにもどってしまいます こういった場合対応のタクトスイッチというのは存在するのでしょうか?あるとしたらなんという名称なのでしょうか? ※存在しないとしたら基盤とタクトスイッチの間に制御する回路を設計するかタクトスイッチじゃないON/OFFスイッチを増設しようかなと考えています。

  • ディスプレイの電源を入れると画面が点滅する

    一ヶ月前くらいから、ディスプレイの電源を入れると画面全体が点滅するようになってしまいました。 ディスプレイの電源がONになってから1分~2分程で安定します。 その後は普段どおりで、全く問題はありません。 点滅以外の異常も見られず、画面が暗いとか白っぽいなどといったこともありません。 日増しに点滅の時間が長くなっており、点滅の速度も速くなってきています。 点滅時は「高速⇒中速⇒低速」と徐々に点滅の速度が遅くなり、それぞれの間に1、2秒正常な時間があります。 (高速はポケモン現象か!と思う位の速度です) 点滅していてもPC自体は正常だと思います。プログラムの起動もマウスの反応も通常通りです。 他に気づいた点は ・ディスプレイの電源を切り、すぐにまた電源を入れると点滅は起こらない ・ディスプレイの電源を切り、PCは起動したまま30分程放置し、電源を入れると点滅が起きた ・点滅にあわせてPCから変な音がする事はない ディスプレイは丁度2年前にPCと一緒に購入しました。 品番はLG L1900J-BFです。 寿命なのかもしれませんが、起動時以外は全く問題ないのでまだ使えるといいのですが… アドバイスよろしくお願いします。  

  • 16F88を用いてLEDの点灯パターンを制御する

    16F88を用いてLEDの点灯パターンを制御するプログラムを作ったのですが、思うように動作してくれません。 電源を入れたときはLEDはすべて消灯しており、スタートのためのスイッチを押すとすべてのLEDが3回点滅するはずなのですが、実際のところ、全てのLEDが点灯しっぱなしになってしまいます。 心当たりはコンフィギュレーションビットの設定が間違っている、PICの出力が間違っている(A/Dが正しく設定されていない)といったことを考えたのですが、結局解決には至りませんでした。 ほぼ同じプログラムを16F84Aにて作ったところ正常に作動したため、PICの移行に伴って不具合が生じてしまったのでしょうか。 どなたかお力をお貸しください。 プログラムはMPLAB v8.85 にて作成しており、コンパイラはHI-TECH ANSI C Compiler で、書き込みにはPICKIT2を用いています。 RB0~7にLEDが接続されており、RA0にスイッチが接続されています。 以下、ソースコードになります。 #define _LEGACY_HEADERS #include <htc.h> #define _XTAL_FREQ 20000000 __CONFIG ( HS & WDTDIS & PWRTDIS & UNPROTECT & MCLREN & BOREN & LVPDIS & DEBUGDIS & IESODIS & FCMDIS); void kaeru(void){ ////////////準備点灯3回////////////// PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(800); //////////////////////////////////// //スペースの都合で省略しています。 } void main(void) { ANSEL=0b00000000;//16F88のPORTAのA/D変換の無効化 OPTION=0x7F;//PORTBのプルアップ PORTA=0x00;//初期設定 PORTB=0x00;//初期設定 TRISA=0x01;//RA0を入力 TRISB=0x00;//RB0~7を出力 if(RA0==1) kaeru(); }

  • スイッチを押したタイミングによって止める位置を指定するプログラム

    8つのLEDが高速で順々に点灯していてスイッチを押すと徐々に速度を落としていき やがて1つのLEDに止まり点滅するプログラムを作成いないといけないのですが、 スイッチを押したタイミングによって止める位置を指定する方法がわかりません。 よかったら教えてください<(_ _)>

  • switch文かif文か?

    スイッチ(SW50~SW80)を押したら、それに対応したコマンドを送る。というものを作っています。 スイッチはスライドスイッチなので、 1)ON(0)の間だけコマンドを出して、OFF(1)は止める。 2)ONしている間に別のスイッチが入ったら止める。 という風に組みたいのですが、中々上手くいきません。 8ピンのスライドスイッチなのですが、1~4はIDとして、5~8をコマンドとして使います。 なので、1~4は絶対にONになります。とすると、2)にしたいとき、defaultが使えなくて…if文を入れたらややこしくなりました。 もっと簡潔に、かつ解りやすく書くにはどうしたらいいでしょうか? #define SW1 input(PIN_C0) // ID #define SW2 input(PIN_C1) // ID #define SW3 input(PIN_C2) // ID #define SW4 input(PIN_C3) // ID #define SW50 PIN_C4 #define SW60 PIN_C5 #define SW70 PIN_C6 #define SW80 PIN_C7 uchar LED_ON(void){ uchar DATA; DATA=0x50; DATA+=0x4F; DATA+=0x4E; return(DATA); } uchar LED_OFF(void){ uchar DATA; DATA=0x50; DATA+=0x4F; DATA+=0x46; return(DATA); } void LED(void){ ulong n; uchar DATA; while(1){ WriteFSKbyte(DATA); switch(n){ case SW50:DATA=LED_ON(); if((SW50||SW60||SW80)==0){ DATA=LED_OFF(); } break; case SW60:while(SW60==0){ DATA=LED_ON(); DelayMs(1000); DATA=LED_OFF(); DelayMs(1000); if((SW50||SW70||SW80)==0) break; } break; case SW70:while(SW70==0){ DATA=LED_ON(); DelayMs(500); DATA=LED_OFF(); DelayMs(500); if((SW50||SW60||SW80)==0) break; } break; case SW80:DATA=LED_OFF(); if((SW50||SW60||SW80)==0){ DATA=LED_OFF(); } break; } } }

専門家に質問してみよう