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

Dependencies:   mbed

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