kohacraft Lab
/
kc_shingo2
交差点の信号と、横断歩道の信号を1つのマイコンで再現しました。
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 /* 車両用信号機3つと歩行者用信号機1つを再現するプログラムです */ 00002 /* 信号機1と信号機2で交差点の信号を再現し、 */ 00003 /* 信号機3と信号機4で横断歩道の信号を再現しています */ 00004 /* timingの{}の中を変えることで赤黄青の点灯時間を変更できます */ 00005 /* 自由に改編して楽しんでください this program is public domain */ 00006 /* May.1.2018 kohacraft.com */ 00007 #include "mbed.h" 00008 #define BLUE 0 00009 #define YELLOW 1 00010 #define RED 2 00011 00012 DigitalOut singo1Led[] = { 00013 DigitalOut(dp1), //信号機1 青LED 00014 DigitalOut(dp2), //信号機1 黄LED 00015 DigitalOut(dp4) //信号機1 赤LED 00016 }; 00017 00018 DigitalOut singo2Led[] = { 00019 DigitalOut(dp9), //信号機2 青LED 00020 DigitalOut(dp10), //信号機2 黄LED 00021 DigitalOut(dp11) //信号機2 赤LED 00022 }; 00023 00024 DigitalOut singo3Led[] = { 00025 DigitalOut(dp28), //信号機3 青LED 00026 DigitalOut(dp26), //信号機3 黄LED 00027 DigitalOut(dp25) //信号機3 赤LED 00028 }; 00029 00030 DigitalOut singo4Led[] = { 00031 DigitalOut(dp18), //信号機4(歩行者用) 青LED 00032 DigitalOut(dp17), //ダミー(赤と同じdpを指定する) 00033 DigitalOut(dp17) //信号機4(歩行者用) 赤LED 00034 }; 00035 00036 DigitalOut singo5Led[] = { 00037 DigitalOut(dp16), //信号機5 青LED 00038 DigitalOut(dp15), //信号機5 黄LED 00039 DigitalOut(dp14) //信号機5 赤LED 00040 }; 00041 00042 00043 DigitalOut sp(dp27); //スピーカー接続 00044 00045 /* 赤黄青の点灯時間{ 赤の点灯時間 , 青の点灯時間 , 黄色の点灯時間 , 赤の点灯時間 }*/ 00046 /* 1は1.5秒 */ 00047 int timing1[] = { 1 , 4 , 2 , 7 }; //信号機1の点灯時間の設定 00048 int timing2[] = { 8 , 4 , 2 , 0 }; //信号機2の点灯時間の設定 00049 int timing3[] = { 1 , 6 , 2 , 7 }; //信号機3の点灯時間の設定 00050 int timing4[] = { 1 , 3 , 2 , 10 }; //信号機4の点灯時間の設定 00051 int timing5[] = { 10 , 4 , 2 , 0 }; //信号機5の点灯時間の設定 00052 00053 Ticker timer; //歩行者用信号の点滅のためのタイマー 00054 00055 int shingo1mode , shingo2mode , shingo3mode , shingo4mode , shingo5mode; //現在の点灯している色(赤:0・青:1・黄:2・赤:3) 00056 int shingo1counter , shingo2counter , shingo3counter , shingo4counter , shingo5counter; //次の色に変わるまでの残り時間 00057 00058 //使用する関数の宣言 00059 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] ); 00060 void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] ); 00061 void sound(); 00062 00063 //割り込みによる信号機4の点滅処理 00064 void flip() { 00065 singo4Led[BLUE] = !singo4Led[BLUE]; 00066 } 00067 00068 int main() { 00069 00070 //初期化 00071 shingo1mode = 0; shingo2mode = 0; shingo3mode = 0; 00072 shingo4mode = 0; shingo5mode = 0; 00073 shingo1counter = timing1[0]; 00074 shingo2counter = timing2[0]; 00075 shingo3counter = timing3[0]; 00076 shingo4counter = timing4[0]; 00077 shingo5counter = timing5[0]; 00078 singo1Led[BLUE] = 0; singo1Led[YELLOW] = 0; singo1Led[RED] = 1; 00079 singo2Led[BLUE] = 0; singo2Led[YELLOW] = 0; singo2Led[RED] = 1; 00080 singo3Led[BLUE] = 0; singo3Led[YELLOW] = 0; singo3Led[RED] = 1; 00081 singo4Led[BLUE] = 0; singo4Led[RED] = 1; 00082 singo5Led[BLUE] = 0; singo5Led[YELLOW] = 0; singo5Led[RED] = 1; 00083 00084 //無限ループ 00085 while(1) { 00086 singo( singo1Led , &shingo1mode , &shingo1counter , timing1 ); //信号機1の処理 00087 singo( singo2Led , &shingo2mode , &shingo2counter , timing2 ); //信号機2の処理 00088 singo( singo3Led , &shingo3mode , &shingo3counter , timing3 ); //信号機3の処理 00089 hokosya( singo4Led , &shingo4mode , &shingo4counter , timing4 ); //信号機4の処理 00090 singo( singo5Led , &shingo5mode , &shingo5counter , timing5 ); //信号機5の処理 00091 00092 //歩行者用信号が青の時カッコーを鳴らす 00093 if( shingo4mode == 1 && singo4Led[BLUE]) 00094 sound(); 00095 else 00096 wait(1.5); //それ以外はウェイトで待つ 00097 } 00098 } 00099 00100 //車両用信号の点灯を制御する 00101 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] ) 00102 { 00103 00104 //カウンターが0以下になったら点灯するLEDを変更する 00105 if( *counter <= 0 ){ 00106 00107 //modeを一つ増やす 3を超えたら0に戻す 00108 *mode = *mode +1 ; 00109 if( *mode > 3 ) 00110 *mode = 0; 00111 00112 //もし点灯時間が0ならば次のmodeに遷移する 00113 if( timeing[*mode] == 0 ) 00114 *mode = *mode +1 ; 00115 if( *mode > 3 ) 00116 *mode = 0; 00117 00118 //次の色の点灯時間をカウンターにセット 00119 *counter = timeing[*mode]; 00120 00121 //点灯するLEDを変更する 00122 switch( *mode ) { 00123 case 0 : //赤を点灯 00124 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1; 00125 break; 00126 case 1 : //青を点灯 00127 led[BLUE] = 1; led[YELLOW] = 0; led[RED] = 0; 00128 break; 00129 case 2 : //黄色を点灯 00130 led[BLUE] = 0; led[YELLOW] = 1; led[RED] = 0; 00131 break; 00132 case 3 : //赤を点灯 00133 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1; 00134 break; 00135 default : 00136 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1; 00137 break; 00138 } 00139 } 00140 *counter = *counter -1; 00141 00142 } 00143 00144 //歩行者用信号の点灯を制御する 00145 void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] ) 00146 { 00147 //カウンターが0以下になったら点灯するLEDを変更する 00148 if( *counter <= 0 ){ 00149 00150 //modeを一つ増やす 3を超えたら0に戻す 00151 *mode = *mode +1 ; 00152 if( *mode > 3 ) 00153 *mode = 0; 00154 00155 //もし点灯時間が0ならば次のmodeに遷移する 00156 if( timeing[*mode] == 0 ) 00157 *mode = *mode +1 ; 00158 if( *mode > 3 ) 00159 *mode = 0; 00160 00161 //次の色の点灯時間をカウンターにセット 00162 *counter = timeing[*mode]; 00163 00164 //点灯するLEDを変更する 00165 switch( *mode ) { 00166 case 0 : //赤を点灯 00167 led[BLUE] = 0; led[RED] = 1; 00168 break; 00169 case 1 : //青を点灯 00170 led[BLUE] = 1; led[RED] = 0; 00171 break; 00172 case 2 : //青を点滅 00173 led[BLUE] = 1; led[RED] = 0; 00174 timer.attach(&flip, 0.25); //点滅用タイマー割り込み開始 00175 break; 00176 case 3 : //赤を点灯 00177 timer.detach(); //点滅用タイマー割り込み停止 00178 led[BLUE] = 0; led[RED] = 1; 00179 break; 00180 default : 00181 led[BLUE] = 0; led[RED] = 1; 00182 break; 00183 } 00184 } 00185 *counter = *counter -1; 00186 00187 } 00188 00189 //カッコーの音 00190 void sound() 00191 { 00192 //ミの音を鳴らす 00193 for( int i=0 ; i<300 ; i++ ) 00194 { 00195 sp = 1; //スピーカーをON OFF させて音を作る 00196 wait(1.0/880.00/4); //1オクターブ上のミ 880*2Hz 00197 sp = 0; 00198 wait(1.0/880.00/4); 00199 00200 } 00201 sp = 1; //スピーカーをオフする 00202 wait(0.2); 00203 00204 //ドの音を鳴らす 00205 for( int i=0 ; i<700 ; i++ ) 00206 { 00207 00208 sp = 1; 00209 wait(1.0/698.45/4); //1オクターブ上のド 698.45*2Hz 00210 sp = 0; 00211 wait(1.0/698.45/4); 00212 00213 } 00214 sp = 1; 00215 wait(0.5); 00216 } 00217
Generated on Tue Jul 12 2022 17:30:04 by 1.7.2