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.
Diff: main.cpp
- 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減らす
+ }
+
+ }
+
+}