real sound humikiri
Dependencies: mbed ck_humikiri
Diff: main.cpp
- Revision:
- 2:939a2b03c534
- Parent:
- 1:06a94cf9d98a
--- a/main.cpp Mon Jun 14 09:47:36 2021 +0000 +++ b/main.cpp Mon Jun 14 23:26:31 2021 +0000 @@ -1,73 +1,86 @@ #include "mbed.h" /* 踏切を再現するプログラム */ +/* 配線の仕方 */ +/* https://kohacraft.com/archives/1035056914.html */ + DigitalOut sp(dp1); //スピーカーをつなぐピンを出力に設定 DigitalIn sw(dp2); //スイッチをつなぐピンを入力に設定 DigitalOut led1(dp14); //LED1をつなぐピンを出力に設定 DigitalOut led2(dp18); //LED2をつなぐピンを出力に設定 - 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; + while(1) { //両方のLEDを消す led1 = 0; led2 = 0; - - //スイッチが押されているか調べて - //押されていたらLEDを光らせ音を鳴らす - if( sw == 1 ) + + //スイッチが押されている間は踏切が鳴る + while( sw == 1 ) { - + //片方のLEDだけを点灯 led1 = 1; led2 = 0; - - //ミの音をちょっと出す - for( int i=0 ; i<20 ; i++ ) - { - sp = 1; - wait(1.0/1318.51/2); //1318.51Hzがミの音 + + 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(1.0/1318.51/2); - } - - - //ドの音を長く出す - for( int i=0 ; i<200*2 ; i++ ) - { - sp = 0; - wait(1.0/1046.50/2); //1046.50Hzがドの音 - sp = 1; - wait(1.0/1046.50/2); + wait(MIoffTimeNow); + sp = 1; //高い方の音ちょっと出す + wait(DOonTimeNow); + sp = 0; + wait(DOoffTimeNow); + } wait (0.1); //もう片方のLEDだけを点灯 led1 = 0; led2 = 1; - - //ミの音をちょっと出す - for( int i=0 ; i<20*2 ; i++ ) - { - sp = 1; - wait(1.0/1318.51/2); + + 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(1.0/1318.51/2); - } - - - //ドの音を長く出す - for( int i=0 ; i<200*2 ; i++ ) - { + wait(MIoffTimeNow); + sp = 1; //高い方の音ちょっと出す + wait(DOonTimeNow); sp = 0; - wait(1.0/1046.50/2); - sp = 1; - wait(1.0/1046.50/2); + wait(DOoffTimeNow); + } wait (0.1); - + } }