交差点の信号と、横断歩道の信号を1つのマイコンで再現しました。

Dependencies:   mbed

Committer:
kohacraft
Date:
Tue May 01 01:16:45 2018 +0000
Revision:
1:1943a21b781b
Parent:
0:dff00c5f274e
ver2.0 add one signal and kakko sound.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kohacraft 0:dff00c5f274e 1 /* 車両用信号機3つと歩行者用信号機1つを再現するプログラムです */
kohacraft 0:dff00c5f274e 2 /* 信号機1と信号機2で交差点の信号を再現し、 */
kohacraft 0:dff00c5f274e 3 /* 信号機3と信号機4で横断歩道の信号を再現しています */
kohacraft 0:dff00c5f274e 4 /* timingの{}の中を変えることで赤黄青の点灯時間を変更できます */
kohacraft 0:dff00c5f274e 5 /* 自由に改編して楽しんでください this program is public domain */
kohacraft 1:1943a21b781b 6 /* May.1.2018 kohacraft.com */
kohacraft 0:dff00c5f274e 7 #include "mbed.h"
kohacraft 0:dff00c5f274e 8 #define BLUE 0
kohacraft 0:dff00c5f274e 9 #define YELLOW 1
kohacraft 0:dff00c5f274e 10 #define RED 2
kohacraft 0:dff00c5f274e 11
kohacraft 0:dff00c5f274e 12 DigitalOut singo1Led[] = {
kohacraft 0:dff00c5f274e 13 DigitalOut(dp1), //信号機1 青LED
kohacraft 0:dff00c5f274e 14 DigitalOut(dp2), //信号機1 黄LED
kohacraft 0:dff00c5f274e 15 DigitalOut(dp4) //信号機1 赤LED
kohacraft 0:dff00c5f274e 16 };
kohacraft 0:dff00c5f274e 17
kohacraft 0:dff00c5f274e 18 DigitalOut singo2Led[] = {
kohacraft 0:dff00c5f274e 19 DigitalOut(dp9), //信号機2 青LED
kohacraft 0:dff00c5f274e 20 DigitalOut(dp10), //信号機2 黄LED
kohacraft 0:dff00c5f274e 21 DigitalOut(dp11) //信号機2 赤LED
kohacraft 0:dff00c5f274e 22 };
kohacraft 0:dff00c5f274e 23
kohacraft 0:dff00c5f274e 24 DigitalOut singo3Led[] = {
kohacraft 0:dff00c5f274e 25 DigitalOut(dp28), //信号機3 青LED
kohacraft 0:dff00c5f274e 26 DigitalOut(dp26), //信号機3 黄LED
kohacraft 0:dff00c5f274e 27 DigitalOut(dp25) //信号機3 赤LED
kohacraft 0:dff00c5f274e 28 };
kohacraft 0:dff00c5f274e 29
kohacraft 0:dff00c5f274e 30 DigitalOut singo4Led[] = {
kohacraft 0:dff00c5f274e 31 DigitalOut(dp18), //信号機4(歩行者用) 青LED
kohacraft 0:dff00c5f274e 32 DigitalOut(dp17), //ダミー(赤と同じdpを指定する)
kohacraft 0:dff00c5f274e 33 DigitalOut(dp17) //信号機4(歩行者用) 赤LED
kohacraft 0:dff00c5f274e 34 };
kohacraft 0:dff00c5f274e 35
kohacraft 1:1943a21b781b 36 DigitalOut singo5Led[] = {
kohacraft 1:1943a21b781b 37 DigitalOut(dp16), //信号機5 青LED
kohacraft 1:1943a21b781b 38 DigitalOut(dp15), //信号機5 黄LED
kohacraft 1:1943a21b781b 39 DigitalOut(dp14) //信号機5 赤LED
kohacraft 1:1943a21b781b 40 };
kohacraft 1:1943a21b781b 41
kohacraft 1:1943a21b781b 42
kohacraft 1:1943a21b781b 43 DigitalOut sp(dp27); //スピーカー接続
kohacraft 1:1943a21b781b 44
kohacraft 0:dff00c5f274e 45 /* 赤黄青の点灯時間{ 赤の点灯時間 , 青の点灯時間 , 黄色の点灯時間 , 赤の点灯時間 }*/
kohacraft 1:1943a21b781b 46 /* 1は1.5秒 */
kohacraft 1:1943a21b781b 47 int timing1[] = { 1 , 4 , 2 , 7 }; //信号機1の点灯時間の設定
kohacraft 1:1943a21b781b 48 int timing2[] = { 8 , 4 , 2 , 0 }; //信号機2の点灯時間の設定
kohacraft 1:1943a21b781b 49 int timing3[] = { 1 , 6 , 2 , 7 }; //信号機3の点灯時間の設定
kohacraft 1:1943a21b781b 50 int timing4[] = { 1 , 3 , 2 , 10 }; //信号機4の点灯時間の設定
kohacraft 1:1943a21b781b 51 int timing5[] = { 10 , 4 , 2 , 0 }; //信号機5の点灯時間の設定
kohacraft 0:dff00c5f274e 52
kohacraft 0:dff00c5f274e 53 Ticker timer; //歩行者用信号の点滅のためのタイマー
kohacraft 0:dff00c5f274e 54
kohacraft 1:1943a21b781b 55 int shingo1mode , shingo2mode , shingo3mode , shingo4mode , shingo5mode; //現在の点灯している色(赤:0・青:1・黄:2・赤:3)
kohacraft 1:1943a21b781b 56 int shingo1counter , shingo2counter , shingo3counter , shingo4counter , shingo5counter; //次の色に変わるまでの残り時間
kohacraft 0:dff00c5f274e 57
kohacraft 0:dff00c5f274e 58 //使用する関数の宣言
kohacraft 0:dff00c5f274e 59 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] );
kohacraft 0:dff00c5f274e 60 void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] );
kohacraft 1:1943a21b781b 61 void sound();
kohacraft 0:dff00c5f274e 62
kohacraft 0:dff00c5f274e 63 //割り込みによる信号機4の点滅処理
kohacraft 0:dff00c5f274e 64 void flip() {
kohacraft 0:dff00c5f274e 65 singo4Led[BLUE] = !singo4Led[BLUE];
kohacraft 0:dff00c5f274e 66 }
kohacraft 0:dff00c5f274e 67
kohacraft 0:dff00c5f274e 68 int main() {
kohacraft 0:dff00c5f274e 69
kohacraft 0:dff00c5f274e 70 //初期化
kohacraft 1:1943a21b781b 71 shingo1mode = 0; shingo2mode = 0; shingo3mode = 0;
kohacraft 1:1943a21b781b 72 shingo4mode = 0; shingo5mode = 0;
kohacraft 0:dff00c5f274e 73 shingo1counter = timing1[0];
kohacraft 0:dff00c5f274e 74 shingo2counter = timing2[0];
kohacraft 0:dff00c5f274e 75 shingo3counter = timing3[0];
kohacraft 0:dff00c5f274e 76 shingo4counter = timing4[0];
kohacraft 1:1943a21b781b 77 shingo5counter = timing5[0];
kohacraft 0:dff00c5f274e 78 singo1Led[BLUE] = 0; singo1Led[YELLOW] = 0; singo1Led[RED] = 1;
kohacraft 0:dff00c5f274e 79 singo2Led[BLUE] = 0; singo2Led[YELLOW] = 0; singo2Led[RED] = 1;
kohacraft 0:dff00c5f274e 80 singo3Led[BLUE] = 0; singo3Led[YELLOW] = 0; singo3Led[RED] = 1;
kohacraft 0:dff00c5f274e 81 singo4Led[BLUE] = 0; singo4Led[RED] = 1;
kohacraft 1:1943a21b781b 82 singo5Led[BLUE] = 0; singo5Led[YELLOW] = 0; singo5Led[RED] = 1;
kohacraft 0:dff00c5f274e 83
kohacraft 0:dff00c5f274e 84 //無限ループ
kohacraft 0:dff00c5f274e 85 while(1) {
kohacraft 0:dff00c5f274e 86 singo( singo1Led , &shingo1mode , &shingo1counter , timing1 ); //信号機1の処理
kohacraft 0:dff00c5f274e 87 singo( singo2Led , &shingo2mode , &shingo2counter , timing2 ); //信号機2の処理
kohacraft 0:dff00c5f274e 88 singo( singo3Led , &shingo3mode , &shingo3counter , timing3 ); //信号機3の処理
kohacraft 0:dff00c5f274e 89 hokosya( singo4Led , &shingo4mode , &shingo4counter , timing4 ); //信号機4の処理
kohacraft 1:1943a21b781b 90 singo( singo5Led , &shingo5mode , &shingo5counter , timing5 ); //信号機5の処理
kohacraft 1:1943a21b781b 91
kohacraft 1:1943a21b781b 92 //歩行者用信号が青の時カッコーを鳴らす
kohacraft 1:1943a21b781b 93 if( shingo4mode == 1 && singo4Led[BLUE])
kohacraft 1:1943a21b781b 94 sound();
kohacraft 1:1943a21b781b 95 else
kohacraft 1:1943a21b781b 96 wait(1.5); //それ以外はウェイトで待つ
kohacraft 0:dff00c5f274e 97 }
kohacraft 0:dff00c5f274e 98 }
kohacraft 0:dff00c5f274e 99
kohacraft 0:dff00c5f274e 100 //車両用信号の点灯を制御する
kohacraft 0:dff00c5f274e 101 void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] )
kohacraft 0:dff00c5f274e 102 {
kohacraft 0:dff00c5f274e 103
kohacraft 0:dff00c5f274e 104 //カウンターが0以下になったら点灯するLEDを変更する
kohacraft 0:dff00c5f274e 105 if( *counter <= 0 ){
kohacraft 0:dff00c5f274e 106
kohacraft 0:dff00c5f274e 107 //modeを一つ増やす 3を超えたら0に戻す
kohacraft 0:dff00c5f274e 108 *mode = *mode +1 ;
kohacraft 0:dff00c5f274e 109 if( *mode > 3 )
kohacraft 0:dff00c5f274e 110 *mode = 0;
kohacraft 1:1943a21b781b 111
kohacraft 1:1943a21b781b 112 //もし点灯時間が0ならば次のmodeに遷移する
kohacraft 1:1943a21b781b 113 if( timeing[*mode] == 0 )
kohacraft 1:1943a21b781b 114 *mode = *mode +1 ;
kohacraft 1:1943a21b781b 115 if( *mode > 3 )
kohacraft 1:1943a21b781b 116 *mode = 0;
kohacraft 0:dff00c5f274e 117
kohacraft 0:dff00c5f274e 118 //次の色の点灯時間をカウンターにセット
kohacraft 0:dff00c5f274e 119 *counter = timeing[*mode];
kohacraft 0:dff00c5f274e 120
kohacraft 0:dff00c5f274e 121 //点灯するLEDを変更する
kohacraft 0:dff00c5f274e 122 switch( *mode ) {
kohacraft 0:dff00c5f274e 123 case 0 : //赤を点灯
kohacraft 0:dff00c5f274e 124 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
kohacraft 0:dff00c5f274e 125 break;
kohacraft 0:dff00c5f274e 126 case 1 : //青を点灯
kohacraft 0:dff00c5f274e 127 led[BLUE] = 1; led[YELLOW] = 0; led[RED] = 0;
kohacraft 0:dff00c5f274e 128 break;
kohacraft 0:dff00c5f274e 129 case 2 : //黄色を点灯
kohacraft 0:dff00c5f274e 130 led[BLUE] = 0; led[YELLOW] = 1; led[RED] = 0;
kohacraft 0:dff00c5f274e 131 break;
kohacraft 0:dff00c5f274e 132 case 3 : //赤を点灯
kohacraft 0:dff00c5f274e 133 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
kohacraft 0:dff00c5f274e 134 break;
kohacraft 0:dff00c5f274e 135 default :
kohacraft 0:dff00c5f274e 136 led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
kohacraft 0:dff00c5f274e 137 break;
kohacraft 0:dff00c5f274e 138 }
kohacraft 0:dff00c5f274e 139 }
kohacraft 0:dff00c5f274e 140 *counter = *counter -1;
kohacraft 0:dff00c5f274e 141
kohacraft 0:dff00c5f274e 142 }
kohacraft 0:dff00c5f274e 143
kohacraft 0:dff00c5f274e 144 //歩行者用信号の点灯を制御する
kohacraft 0:dff00c5f274e 145 void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] )
kohacraft 0:dff00c5f274e 146 {
kohacraft 0:dff00c5f274e 147 //カウンターが0以下になったら点灯するLEDを変更する
kohacraft 0:dff00c5f274e 148 if( *counter <= 0 ){
kohacraft 0:dff00c5f274e 149
kohacraft 0:dff00c5f274e 150 //modeを一つ増やす 3を超えたら0に戻す
kohacraft 0:dff00c5f274e 151 *mode = *mode +1 ;
kohacraft 0:dff00c5f274e 152 if( *mode > 3 )
kohacraft 0:dff00c5f274e 153 *mode = 0;
kohacraft 0:dff00c5f274e 154
kohacraft 1:1943a21b781b 155 //もし点灯時間が0ならば次のmodeに遷移する
kohacraft 1:1943a21b781b 156 if( timeing[*mode] == 0 )
kohacraft 1:1943a21b781b 157 *mode = *mode +1 ;
kohacraft 1:1943a21b781b 158 if( *mode > 3 )
kohacraft 1:1943a21b781b 159 *mode = 0;
kohacraft 1:1943a21b781b 160
kohacraft 0:dff00c5f274e 161 //次の色の点灯時間をカウンターにセット
kohacraft 0:dff00c5f274e 162 *counter = timeing[*mode];
kohacraft 0:dff00c5f274e 163
kohacraft 0:dff00c5f274e 164 //点灯するLEDを変更する
kohacraft 0:dff00c5f274e 165 switch( *mode ) {
kohacraft 0:dff00c5f274e 166 case 0 : //赤を点灯
kohacraft 0:dff00c5f274e 167 led[BLUE] = 0; led[RED] = 1;
kohacraft 0:dff00c5f274e 168 break;
kohacraft 0:dff00c5f274e 169 case 1 : //青を点灯
kohacraft 0:dff00c5f274e 170 led[BLUE] = 1; led[RED] = 0;
kohacraft 0:dff00c5f274e 171 break;
kohacraft 0:dff00c5f274e 172 case 2 : //青を点滅
kohacraft 0:dff00c5f274e 173 led[BLUE] = 1; led[RED] = 0;
kohacraft 0:dff00c5f274e 174 timer.attach(&flip, 0.25); //点滅用タイマー割り込み開始
kohacraft 0:dff00c5f274e 175 break;
kohacraft 0:dff00c5f274e 176 case 3 : //赤を点灯
kohacraft 0:dff00c5f274e 177 timer.detach(); //点滅用タイマー割り込み停止
kohacraft 0:dff00c5f274e 178 led[BLUE] = 0; led[RED] = 1;
kohacraft 0:dff00c5f274e 179 break;
kohacraft 0:dff00c5f274e 180 default :
kohacraft 0:dff00c5f274e 181 led[BLUE] = 0; led[RED] = 1;
kohacraft 0:dff00c5f274e 182 break;
kohacraft 0:dff00c5f274e 183 }
kohacraft 0:dff00c5f274e 184 }
kohacraft 0:dff00c5f274e 185 *counter = *counter -1;
kohacraft 0:dff00c5f274e 186
kohacraft 0:dff00c5f274e 187 }
kohacraft 1:1943a21b781b 188
kohacraft 1:1943a21b781b 189 //カッコーの音
kohacraft 1:1943a21b781b 190 void sound()
kohacraft 1:1943a21b781b 191 {
kohacraft 1:1943a21b781b 192 //ミの音を鳴らす
kohacraft 1:1943a21b781b 193 for( int i=0 ; i<300 ; i++ )
kohacraft 1:1943a21b781b 194 {
kohacraft 1:1943a21b781b 195 sp = 1; //スピーカーをON OFF させて音を作る
kohacraft 1:1943a21b781b 196 wait(1.0/880.00/4); //1オクターブ上のミ 880*2Hz
kohacraft 1:1943a21b781b 197 sp = 0;
kohacraft 1:1943a21b781b 198 wait(1.0/880.00/4);
kohacraft 1:1943a21b781b 199
kohacraft 1:1943a21b781b 200 }
kohacraft 1:1943a21b781b 201 sp = 1; //スピーカーをオフする
kohacraft 1:1943a21b781b 202 wait(0.2);
kohacraft 1:1943a21b781b 203
kohacraft 1:1943a21b781b 204 //ドの音を鳴らす
kohacraft 1:1943a21b781b 205 for( int i=0 ; i<700 ; i++ )
kohacraft 1:1943a21b781b 206 {
kohacraft 1:1943a21b781b 207
kohacraft 1:1943a21b781b 208 sp = 1;
kohacraft 1:1943a21b781b 209 wait(1.0/698.45/4); //1オクターブ上のド 698.45*2Hz
kohacraft 1:1943a21b781b 210 sp = 0;
kohacraft 1:1943a21b781b 211 wait(1.0/698.45/4);
kohacraft 1:1943a21b781b 212
kohacraft 1:1943a21b781b 213 }
kohacraft 1:1943a21b781b 214 sp = 1;
kohacraft 1:1943a21b781b 215 wait(0.5);
kohacraft 1:1943a21b781b 216 }
kohacraft 1:1943a21b781b 217