注釈

こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

参加する理由は?

  • エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。

  • 学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。

  • 独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。

  • 特別割引:最新製品の独占割引をお楽しみください。

  • 祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。

👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!

3.1.10 警報ベル

前書き

このコースでは、手動警報装置を作成する。 トグルスイッチをサーミスタまたは感光センサーに交換して、温度警報または光警報を作成できる。

部品

../_images/list_Alarm_Bell1.png

回路図

T-Board Name

physical

wiringPi

BCM

GPIO17

Pin 11

0

17

GPIO18

Pin 12

1

18

GPIO27

Pin 13

2

27

GPIO22

Pin 15

3

22

../_images/Schematic_three_one101.png

実験手順

ステップ1: 回路を作る。

../_images/image2661.png

ステップ2: ディレクトリを変更する。

cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/

ステップ3: コンパイルする。

gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread

ステップ4: 実行。

sudo ./a.out

プログラムが起動すると、トグルスイッチが右に切り替わり、ブザーが警報音を出す。同時に、特定の周波数で赤と緑のLEDが点滅する。

コードの説明

#include <pthread.h>

このコードでは、新しいライブラリ thread.h を使用する。 これは、一般的なスレッドライブラリのセットであり、マルチスレッドを実現できる。 コンパイル時に -lpthread パラメーターを追加して、LEDとブザーを独立して動作させる。

void *ledWork(void *arg){
    while(1)
    {
        if(flag==0){
            pthread_exit(NULL);
        }
        digitalWrite(ALedPin,HIGH);
        delay(500);
        digitalWrite(ALedPin,LOW);
        digitalWrite(BLedPin,HIGH);
        delay(500);
        digitalWrite(BLedPin,LOW);
    }
}

関数 ledWork() は、これら2つのLEDの動作状態を設定するために役立つ: 緑色のLEDを0.5秒間点灯させた後、消灯する。同様に、赤いLEDを0.5秒間点灯させてから消灯する。

void *buzzWork(void *arg){
    while(1)
    {
        if(flag==0){
            pthread_exit(NULL);
        }
        if((note>=800)||(note<=130)){
            pitch = -pitch;
        }
        note=note+pitch;
        softToneWrite(BeepPin,note);
        delay(10);
    }
}

関数 buzzWork() は、ブザーの動作状態を設定するために使用される。 ここでは、周波数を130〜800に設定し、20の間隔で累積・減衰する。

void on(){
    flag = 1;
    if(softToneCreate(BeepPin) == -1){
        printf("setup softTone failed !");
        return;
    }
    pthread_t tLed;
    pthread_create(&tLed,NULL,ledWork,NULL);
    pthread_t tBuzz;
    pthread_create(&tBuzz,NULL,buzzWork,NULL);
}

関数 on() で:

  • 制御スレッドの終了を示すマーク「flag = 1」を定義する。

  • ソフトウェア制御のトーンピン BeepPin を作成する。

  • LEDとブザーが同時に動作できるように、二つの個別のスレッドを作成する。

pthread_t tLed : スレッド tLed を宣言する。

pthread_create(&tLed,NULL,ledWork,NULL) : スレッドを作成し、そのプロトタイプは次の通りである: int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void*(*start_rtn)(void*),void *restrict arg);

値を返す

成功した場合は「0」を返し、それ以外の場合は落下数「-1」を返します。

パラメータ

  • 最初のパラメーターは、スレッドIDへのポインターです。

  • 2つ目は、スレッド属性を設定するために使用されます。

  • 3番目は、スレッド実行関数の開始アドレスです。

  • 最後のものは、関数を実行するものです。

void off(){
    flag = 0;
    softToneStop(BeepPin);
    digitalWrite(ALedPin,LOW);
    digitalWrite(BLedPin,LOW);
}

スレッド ledWorkBuzzWork を終了するために、 関数 Off() は「flag = 0」を定義しそして、ブザーとLEDをオフにする。

int main(){
    setup();
    int lastState = 0;
    while(1){
        int currentState = digitalRead(switchPin);
        if ((currentState == 1)&&(lastState==0)){
            on();
        }
        else if((currentState == 0)&&(lastState==1)){
            off();
        }
        lastState=currentState;
    }
    return 0;
}

main() には、プログラムのプロセス全体が含まれている:まず、スライドスイッチの値を読み取る。 トグルスイッチが右に切り替えられた場合(読み取り値が1)、関数 on() が呼び出され、 ブザーが駆動されて音が鳴り、赤と緑のLEDが点滅する。そうしないと、ブザーとLEDが機能しない。