あれから試行錯誤したり書籍を購入したりして何とかストップウォッチを作成することができました。
次は第二段階として秒以下を00で止めたときに圧電スピーカーで音を鳴らすようにしたいと考えています。
以下がストップウォッチのプログラムになります。
C++
1#include "mbed.h" 2 3DigitalOut a(p10); 4DigitalOut b(p11); 5DigitalOut c(p12); 6DigitalOut d(p13); 7DigitalOut e(p14); 8DigitalOut f(p15); 9DigitalOut g(p16); 10DigitalOut dp(p17); 11 12DigitalOut dig1(p21); 13DigitalOut dig2(p22); 14DigitalOut dig3(p23); 15DigitalOut dig4(p24); 16 17PwmOut mysp1(p25); 18DigitalIn mysw(p9); 19 20Ticker timer_tick; //測定用タイマ 21Ticker led; //ダイナミック点灯用タイマ 22int sw_time=0; 23unsigned char seg[4]; //7セグ表示用 24 25const char set_num[10] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; 26 27//7セグ,パターンセット 28void set_7seg(char bit,char num){ 29 switch(num){ 30 case 1: dig1=0;dig2=1;dig3=1;dig4=1; 31 break; 32 case 2: dig1=1;dig2=0;dig3=1;dig4=1; 33 break; 34 case 3: dig1=1;dig2=1;dig3=0;dig4=1; 35 break; 36 case 4: dig1=1;dig2=1;dig3=1;dig4=0; 37 break; 38 default:dig1=1;dig2=1;dig3=1;dig4=1; 39 break; 40 } 41 a = (bit&0x80)>>7; 42 b = (bit&0x40)>>6; 43 c = (bit&0x20)>>5; 44 d = (bit&0x10)>>4; 45 e = (bit&0x08)>>3; 46 f = (bit&0x04)>>2; 47 g = (bit&0x02)>>1; 48 dp = (bit&0x01); 49} 50 51void stop_watch(void){ 52 int time_now; 53 char digit[4]; 54 sw_time++; 55 if(sw_time>9999) sw_time=0; 56 time_now = sw_time; 57 digit[0] = time_now/1000; time_now%=1000; 58 digit[1] = time_now/100; time_now%=100; 59 digit[2] = time_now/10; time_now%=10; 60 digit[3] = time_now; 61 seg[0] = set_num[digit[0]]; 62 seg[1] = set_num[digit[1]]|0x01; 63 seg[2] = set_num[digit[2]]; 64 seg[3] = set_num[digit[3]]; 65} 66 67void blink_seg(void){ 68 static int n; 69 n++; 70 if(n>5) n=0; 71 set_7seg(seg[n-1],n); 72} 73 74int main(){ 75 76 timer_tick.attach_us(&stop_watch, 10000); //割り込みタイマ10ms 77 led.attach_us(&blink_seg, 1000); //割り込みタイマ1ms 78 sw_time=0; 79 //loop 80 81 82 while(1) { 83 84 85 if (mysw==1){ 86 timer_tick.detach(); 87 88 if (dig3==dig4==(?)){ 89 mysp1.period(1.0/261.626); // ド 90 mysp1.write(0.5); 91 wait(1); 92 mysp1.period(1.0/293.665); // レ 93 mysp1.write(0.5); 94 wait(1); 95 mysp1.period(1.0/329.628); // ミ 96 mysp1.write(0.5); 97 wait(1); 98 mysp1.period(1.0/349.228); // ファ 99 mysp1.write(0.5); 100 wait(1); 101 mysp1.period(1.0/391.995); // ソ 102 mysp1.write(0.5); 103 wait(1); 104 mysp1.period(1.0/440.00); // ラ 105 mysp1.write(0.5); 106 wait(1); 107 mysp1.period(1.0/493.883); // シ 108 mysp1.write(0.5); 109 wait(1); 110 mysp1.period(1.0/261.626/2); // ド 111 mysp1.write(0.5); 112 wait(3); 113 } 114 115 } 116 } 117} 118
最後のif分(音を定義しているもの)を省くとストップウォッチとして機能していたし、別のプログラムで圧電スピーカーが鳴るのも確認しました。このプログラムでは秒以下の数字のところを左からdig3、dig4としています。dig3とdig4が0と表示されているときに音を鳴らせばいいとわかっているのですが
C++
1if (dig3==dig4==0)
0が消灯、1が点灯で、またダイナミック点灯を用いているのでこのように入力するとどの数字でも音が鳴ってしまうというのは理解できますが、他の入力方法(?)が思いつきません。
どなたかアドバイスを頂けると嬉しいです。