Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:dff00c5f274e, committed 2018-04-28
- Comitter:
- kohacraft
- Date:
- Sat Apr 28 09:00:24 2018 +0000
- Child:
- 1:1943a21b781b
- Commit message:
- ver1.0
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
| mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sat Apr 28 09:00:24 2018 +0000
@@ -0,0 +1,154 @@
+/* 車両用信号機3つと歩行者用信号機1つを再現するプログラムです */
+/* 信号機1と信号機2で交差点の信号を再現し、 */
+/* 信号機3と信号機4で横断歩道の信号を再現しています */
+/* timingの{}の中を変えることで赤黄青の点灯時間を変更できます */
+/* 自由に改編して楽しんでください this program is public domain */
+#include "mbed.h"
+#define BLUE 0
+#define YELLOW 1
+#define RED 2
+
+DigitalOut singo1Led[] = {
+ DigitalOut(dp1), //信号機1 青LED
+ DigitalOut(dp2), //信号機1 黄LED
+ DigitalOut(dp4) //信号機1 赤LED
+};
+
+DigitalOut singo2Led[] = {
+ DigitalOut(dp9), //信号機2 青LED
+ DigitalOut(dp10), //信号機2 黄LED
+ DigitalOut(dp11) //信号機2 赤LED
+};
+
+DigitalOut singo3Led[] = {
+ DigitalOut(dp28), //信号機3 青LED
+ DigitalOut(dp26), //信号機3 黄LED
+ DigitalOut(dp25) //信号機3 赤LED
+};
+
+DigitalOut singo4Led[] = {
+ DigitalOut(dp18), //信号機4(歩行者用) 青LED
+ DigitalOut(dp17), //ダミー(赤と同じdpを指定する)
+ DigitalOut(dp17) //信号機4(歩行者用) 赤LED
+};
+
+/* 赤黄青の点灯時間{ 赤の点灯時間 , 青の点灯時間 , 黄色の点灯時間 , 赤の点灯時間 }*/
+/* 点灯時間は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の点灯時間の設定
+
+Ticker timer; //歩行者用信号の点滅のためのタイマー
+
+int shingo1mode , shingo2mode , shingo3mode , shingo4mode; //現在の点灯している色(赤:0・青:1・黄:2・赤:3)
+int shingo1counter , shingo2counter , shingo3counter , shingo4counter; //次の色に変わるまでの残り時間
+
+//使用する関数の宣言
+void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] );
+void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] );
+
+//割り込みによる信号機4の点滅処理
+void flip() {
+ singo4Led[BLUE] = !singo4Led[BLUE];
+}
+
+int main() {
+
+ //初期化
+ shingo1mode = 0; shingo2mode = 0; shingo3mode = 0; shingo4mode = 0;
+ shingo1counter = timing1[0];
+ shingo2counter = timing2[0];
+ shingo3counter = timing3[0];
+ shingo4counter = timing4[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;
+
+ //無限ループ
+ while(1) {
+ singo( singo1Led , &shingo1mode , &shingo1counter , timing1 ); //信号機1の処理
+ singo( singo2Led , &shingo2mode , &shingo2counter , timing2 ); //信号機2の処理
+ singo( singo3Led , &shingo3mode , &shingo3counter , timing3 ); //信号機3の処理
+ hokosya( singo4Led , &shingo4mode , &shingo4counter , timing4 ); //信号機4の処理
+ wait(1); //1秒待つ
+ }
+}
+
+//車両用信号の点灯を制御する
+void singo( DigitalOut led[] , int *mode , int *counter , int timeing[] )
+{
+
+ //カウンターが0以下になったら点灯するLEDを変更する
+ if( *counter <= 0 ){
+
+ //modeを一つ増やす 3を超えたら0に戻す
+ *mode = *mode +1 ;
+ if( *mode > 3 )
+ *mode = 0;
+
+ //次の色の点灯時間をカウンターにセット
+ *counter = timeing[*mode];
+
+ //点灯するLEDを変更する
+ switch( *mode ) {
+ case 0 : //赤を点灯
+ led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
+ break;
+ case 1 : //青を点灯
+ led[BLUE] = 1; led[YELLOW] = 0; led[RED] = 0;
+ break;
+ case 2 : //黄色を点灯
+ led[BLUE] = 0; led[YELLOW] = 1; led[RED] = 0;
+ break;
+ case 3 : //赤を点灯
+ led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
+ break;
+ default :
+ led[BLUE] = 0; led[YELLOW] = 0; led[RED] = 1;
+ break;
+ }
+ }
+ *counter = *counter -1;
+
+}
+
+//歩行者用信号の点灯を制御する
+void hokosya( DigitalOut led[] , int *mode , int *counter , int timeing[] )
+{
+ //カウンターが0以下になったら点灯するLEDを変更する
+ if( *counter <= 0 ){
+
+ //modeを一つ増やす 3を超えたら0に戻す
+ *mode = *mode +1 ;
+ if( *mode > 3 )
+ *mode = 0;
+
+ //次の色の点灯時間をカウンターにセット
+ *counter = timeing[*mode];
+
+ //点灯するLEDを変更する
+ switch( *mode ) {
+ case 0 : //赤を点灯
+ led[BLUE] = 0; led[RED] = 1;
+ break;
+ case 1 : //青を点灯
+ led[BLUE] = 1; led[RED] = 0;
+ break;
+ case 2 : //青を点滅
+ led[BLUE] = 1; led[RED] = 0;
+ timer.attach(&flip, 0.25); //点滅用タイマー割り込み開始
+ break;
+ case 3 : //赤を点灯
+ timer.detach(); //点滅用タイマー割り込み停止
+ led[BLUE] = 0; led[RED] = 1;
+ break;
+ default :
+ led[BLUE] = 0; led[RED] = 1;
+ break;
+ }
+ }
+ *counter = *counter -1;
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Apr 28 09:00:24 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/5aab5a7997ee \ No newline at end of file