• 締切済み

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(); } }

みんなの回答

  • teuaitou
  • ベストアンサー率32% (10/31)
回答No.3

No.2です ツールと言っても、知識というが技術のことです。モデリングで使うUMLのようなものです。 今後、プログラミングを行うのであれば知っていて損はないと思います。習得するのに数時間程度の難易度だと思います。

  • teuaitou
  • ベストアンサー率32% (10/31)
回答No.2

具体的なコードの話が置いておいて、考え方の話しますね。 先ず処理の流れを、図示するツールは使えますか。ツールと言っても、何かしらのアプリとかじゃなく、フローチャートやPADのような手書きで出来るツールです。 そういったツールを使って、プログラムの処理の流れを書いていけば、自ずと問題点が見えてくると思います。

noname#220339
質問者

補足

ご回答ありがとうございます。 現在そういったツールはないです。

回答No.1

例えば、1行ごとにprintfなんかで処理する内容を表示するようにして、switch使った場合、if使った場合での処理内容を比較し、何が足りないのか?余計なのか?を検討とか。 void sw_check(void) {  printf("switch(SW_RedSwitch=%d)処理開始\n", SW_RedSwitch);  switch(SW_RedSwitch)  {   case 0:    printf(" case 0:を通過\n");    printf(" if ( digitalRead(2)==SW_ON )判定\n");    if ( digitalRead(2)==SW_ON )    {     printf("判定はtrue\n");     printf("SW_RedSwitch=1\n");     SW_RedSwitch=1;    }    printf("break処理\n");    break;   case 1:    printf(" case 1:を通過\n");    printf(" if ( digitalRead(2)==SW_OFF )判定\n");    if ( digitalRead(2)==SW_OFF )    {     printf("判定はtrue\n");     printf("SW_RedSwitch=2\n");     SW_RedSwitch=2;    }    printf("break処理\n");    break;  } ~ だとか。 -- 気をつけるのは、digitalRead関数が何やってるか分かりませんが、    if ( digitalRead(2)==SW_OFF ) のdigitalReadの返り値が見たいからって、    printf("digitalRead(2)の返り値=%d\n", digitalRead(2));    if ( digitalRead(2)==SW_OFF ) とかってしちゃうと、printfで1回呼び出し、その後の処理で1回呼び出ししてしまい、例えば0と1を交互に返すような関数だったら、ふるまいが変わっちゃいます。 もしかして、if文で修正したプログラムの方でそういう事しちゃってると、動作が違ってるとか。 まぁ、デバッガ使える環境なら、もうちょっと楽だったりもしますが…。