kohacraft Lab
/
kc_shingo2
交差点の信号と、横断歩道の信号を1つのマイコンで再現しました。
Diff: main.cpp
- Revision:
- 1:1943a21b781b
- Parent:
- 0:dff00c5f274e
--- a/main.cpp Sat Apr 28 09:00:24 2018 +0000 +++ b/main.cpp Tue May 01 01:16:45 2018 +0000 @@ -3,6 +3,7 @@ /* 信号機3と信号機4で横断歩道の信号を再現しています */ /* timingの{}の中を変えることで赤黄青の点灯時間を変更できます */ /* 自由に改編して楽しんでください this program is public domain */ +/* May.1.2018 kohacraft.com */ #include "mbed.h" #define BLUE 0 #define YELLOW 1 @@ -32,21 +33,32 @@ DigitalOut(dp17) //信号機4(歩行者用) 赤LED }; +DigitalOut singo5Led[] = { + DigitalOut(dp16), //信号機5 青LED + DigitalOut(dp15), //信号機5 黄LED + DigitalOut(dp14) //信号機5 赤LED +}; + + +DigitalOut sp(dp27); //スピーカー接続 + /* 赤黄青の点灯時間{ 赤の点灯時間 , 青の点灯時間 , 黄色の点灯時間 , 赤の点灯時間 }*/ -/* 点灯時間は1(秒)以上を指定する 0は指定できない */ -int timing1[] = { 1 , 5 , 2 , 5+2+1+2 }; //信号機1の点灯時間の設定 -int timing2[] = { 1+5+2+2 , 5 , 2 , 1 }; //信号機2の点灯時間の設定 -int timing3[] = { 1 , 3 , 2 , 4+3+1+2 }; //信号機3の点灯時間の設定 -int timing4[] = { 1+3+2+2 , 4 , 3 , 1 }; //信号機4の点灯時間の設定 +/* 1は1.5秒 */ +int timing1[] = { 1 , 4 , 2 , 7 }; //信号機1の点灯時間の設定 +int timing2[] = { 8 , 4 , 2 , 0 }; //信号機2の点灯時間の設定 +int timing3[] = { 1 , 6 , 2 , 7 }; //信号機3の点灯時間の設定 +int timing4[] = { 1 , 3 , 2 , 10 }; //信号機4の点灯時間の設定 +int timing5[] = { 10 , 4 , 2 , 0 }; //信号機5の点灯時間の設定 Ticker timer; //歩行者用信号の点滅のためのタイマー -int shingo1mode , shingo2mode , shingo3mode , shingo4mode; //現在の点灯している色(赤:0・青:1・黄:2・赤:3) -int shingo1counter , shingo2counter , shingo3counter , shingo4counter; //次の色に変わるまでの残り時間 +int shingo1mode , shingo2mode , shingo3mode , shingo4mode , shingo5mode; //現在の点灯している色(赤:0・青:1・黄:2・赤:3) +int shingo1counter , shingo2counter , shingo3counter , shingo4counter , shingo5counter; //次の色に変わるまでの残り時間 //使用する関数の宣言 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] ); void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] ); +void sound(); //割り込みによる信号機4の点滅処理 void flip() { @@ -56,15 +68,18 @@ int main() { //初期化 - shingo1mode = 0; shingo2mode = 0; shingo3mode = 0; shingo4mode = 0; + shingo1mode = 0; shingo2mode = 0; shingo3mode = 0; + shingo4mode = 0; shingo5mode = 0; shingo1counter = timing1[0]; shingo2counter = timing2[0]; shingo3counter = timing3[0]; shingo4counter = timing4[0]; + shingo5counter = timing5[0]; singo1Led[BLUE] = 0; singo1Led[YELLOW] = 0; singo1Led[RED] = 1; singo2Led[BLUE] = 0; singo2Led[YELLOW] = 0; singo2Led[RED] = 1; singo3Led[BLUE] = 0; singo3Led[YELLOW] = 0; singo3Led[RED] = 1; singo4Led[BLUE] = 0; singo4Led[RED] = 1; + singo5Led[BLUE] = 0; singo5Led[YELLOW] = 0; singo5Led[RED] = 1; //無限ループ while(1) { @@ -72,7 +87,13 @@ singo( singo2Led , &shingo2mode , &shingo2counter , timing2 ); //信号機2の処理 singo( singo3Led , &shingo3mode , &shingo3counter , timing3 ); //信号機3の処理 hokosya( singo4Led , &shingo4mode , &shingo4counter , timing4 ); //信号機4の処理 - wait(1); //1秒待つ + singo( singo5Led , &shingo5mode , &shingo5counter , timing5 ); //信号機5の処理 + + //歩行者用信号が青の時カッコーを鳴らす + if( shingo4mode == 1 && singo4Led[BLUE]) + sound(); + else + wait(1.5); //それ以外はウェイトで待つ } } @@ -87,6 +108,12 @@ *mode = *mode +1 ; if( *mode > 3 ) *mode = 0; + + //もし点灯時間が0ならば次のmodeに遷移する + if( timeing[*mode] == 0 ) + *mode = *mode +1 ; + if( *mode > 3 ) + *mode = 0; //次の色の点灯時間をカウンターにセット *counter = timeing[*mode]; @@ -125,6 +152,12 @@ if( *mode > 3 ) *mode = 0; + //もし点灯時間が0ならば次のmodeに遷移する + if( timeing[*mode] == 0 ) + *mode = *mode +1 ; + if( *mode > 3 ) + *mode = 0; + //次の色の点灯時間をカウンターにセット *counter = timeing[*mode]; @@ -152,3 +185,33 @@ *counter = *counter -1; } + +//カッコーの音 +void sound() +{ + //ミの音を鳴らす + for( int i=0 ; i<300 ; i++ ) + { + sp = 1; //スピーカーをON OFF させて音を作る + wait(1.0/880.00/4); //1オクターブ上のミ 880*2Hz + sp = 0; + wait(1.0/880.00/4); + + } + sp = 1; //スピーカーをオフする + wait(0.2); + + //ドの音を鳴らす + for( int i=0 ; i<700 ; i++ ) + { + + sp = 1; + wait(1.0/698.45/4); //1オクターブ上のド 698.45*2Hz + sp = 0; + wait(1.0/698.45/4); + + } + sp = 1; + wait(0.5); +} + \ No newline at end of file