sensor humikiri

Dependencies:   mbed

main.cpp

Committer:
kohacraft
Date:
2021-06-14
Revision:
0:3c6166546366

File content as of revision 0:3c6166546366:

#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減らす
        }
             
    }
        
}