kohacraft Lab / Mbed 2 deprecated kc_humikiriSensor

Dependencies:   mbed

Revision:
0:3c6166546366
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jun 14 23:52:38 2021 +0000
@@ -0,0 +1,103 @@
+#include "mbed.h"
+
+/* 踏切を再現するプログラム */
+/* 作り方 */
+/* https://kohacraft.com/archives/1035056914.html */
+/* https://kohacraft.com/archives/202106150823.html */
+
+DigitalOut sp(dp1);     //スピーカーをつなぐピンを出力に設定
+DigitalIn sw(dp2);      //スイッチをつなぐピンを入力に設定
+DigitalOut led1(dp14);  //LED1をつなぐピンを出力に設定
+DigitalOut led2(dp18);  //LED2をつなぐピンを出力に設定
+
+const int humikiriMax = 3;           //スイッチが反応してから踏切が終わるまでの長さ
+
+int main() {
+    //低い方の音
+    double  MIonTime = (1.0/678)/4; //ミ
+    double  MIoffTime = (1.0/678)/4;
+    double  MISyuuki = MIonTime + MIoffTime;
+        
+    //高い方の音
+    double  DOonTime = (1.0/761)/4; //ファ#
+    double  DOoffTime = (1.0/761)/4;
+    double  DOSyuuki = DOonTime + DOoffTime;
+    
+    int count = 0;  //踏切がなり終わるまでのカウント 0になったら鳴り終わる
+
+    while(1) {
+        
+        //両方のLEDを消す
+        led1 = 0;
+        led2 = 0;
+
+        //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
+        if( sw == 0 )
+            count = humikiriMax;
+
+        //踏切がなり終わるまでのカウントが0以上ならば踏切が鳴る
+        while(count > 0)
+        {
+                    
+            //片方のLEDだけを点灯
+            led1 = 1;
+            led2 = 0;
+
+            for( int i=0 ; i<1000 ; i+=5 )
+            {   
+                //音をだんだん小さくするための計算
+                double duty = (i / 1000.0)/2;
+                double MIonTimeNow = MIonTime - (MISyuuki * duty);
+                double MIoffTimeNow = MIoffTime + (MISyuuki * duty);
+                double DOonTimeNow = DOonTime - (DOSyuuki * duty);
+                double DOoffTimeNow = DOoffTime + (DOSyuuki * duty);
+                
+                sp = 1; //低い方の音をちょっと出す
+                wait(MIonTimeNow); 
+                sp = 0;
+                wait(MIoffTimeNow); 
+                sp = 1; //高い方の音ちょっと出す
+                wait(DOonTimeNow); 
+                sp = 0;
+                wait(DOoffTimeNow);
+
+                //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
+                if( sw == 0 )
+                    count = humikiriMax;
+            }
+            wait (0.1);
+            
+            //もう片方のLEDだけを点灯
+            led1 = 0;
+            led2 = 1;
+
+            for( int i=0 ; i<1000 ; i+=5 )
+            {   
+                //音をだんだん小さくするための計算
+                double duty = (i / 1000.0)/2;                
+                double MIonTimeNow = MIonTime - (MISyuuki * duty);
+                double MIoffTimeNow = MIoffTime + (MISyuuki * duty);
+                double DOonTimeNow = DOonTime - (DOSyuuki * duty);
+                double DOoffTimeNow = DOoffTime + (DOSyuuki * duty);
+                
+                sp = 1; //低い方の音をちょっと出す
+                wait(MIonTimeNow); 
+                sp = 0;
+                wait(MIoffTimeNow); 
+                sp = 1; //高い方の音ちょっと出す
+                wait(DOonTimeNow); 
+                sp = 0;
+                wait(DOoffTimeNow);
+
+                //センサが反応したらカウンターに踏切が終わるまでの長さを入れる
+                if( sw == 0 )
+                    count = humikiriMax;
+            }
+            wait (0.1);
+            
+            count--;    //カウンタを1減らす
+        }
+             
+    }
+        
+}