### 5.3 アラームシステム #### 5.3.1 PIRモーションセンサー **5.3.1PIR-Motion-Sensor** コードを Arduino IDE で開きます。 ```c #define PyroelectricPIN 23 void setup() { Serial.begin(9600); pinMode(PyroelectricPIN,INPUT); } void loop() { //Read the value of PIR motion sensor int ReadValue = digitalRead(PyroelectricPIN); if(ReadValue){ Serial.println("Someone"); } else{ Serial.println("No one"); } delay(100); } ``` **ESP32 Dev Module** ボードと **COM** ポートを選択し、コードをアップロードします。 ![5458448](../media/5458448.png) **テスト結果:** 誰かがエリア内にいる場合、モニターに「Someone」と表示され、センサーの赤いLEDが消灯します。しかし、誰もいない場合、「No one」と表示され、センサーのLEDは常に点灯します。 ![image-20250417113532007](../media/image-20250417113532007.png) 電圧: 3~5V 電流: 3.6mA 電力: 18mW 視野角: Y = 90°、X = 110° (理論値) 検出距離: ≤5m ![cou32](../media/cou32.png) #### 5.3.2 パッシブブザー ![image](../media/cou34.png) **パッシブブザー**は、特定の周波数の矩形波信号を与えない限り、それ自体で振動して音を出すことはできません。さらに、矩形波の周波数が異なると発する音も異なるため、パッシブブザーは音色をシミュレートできます。 アナログ矩形波は、ピンの電力レベルを変更することで生成できます。例えば、ハイレベルが500ms続いた後、ローレベルに500ms移行し、再びハイレベルに戻る、といった具合です。 200〜5000Hzの矩形波を介してブザーを駆動し、周波数(f)を計算できます: **f=1/T**、Tは周期(ハイレベルとローレベルの合計時間)です。 ![cou38](../media/cou38.png) **パラメータ:** 電圧: 3~5V 電流: ≤5mA 電力: ≤25mW **5.3.2Passive-Buzzer** コードを Arduino IDE で開きます。 ```c #define BuzzerPin 16 //Define the buzzer pin void setup() { //Set the pin to output mode pinMode(BuzzerPin,OUTPUT); } void loop() { digitalWrite(BuzzerPin,HIGH); delayMicroseconds(500);//Delay 500us digitalWrite(BuzzerPin,LOW); delayMicroseconds(500);//Delay 500us } ``` **ESP32 Dev Module** ボードと **COM** ポートを選択し、コードをアップロードします。 ![5458448](../media/5458448.png) **テスト結果:** パッシブブザーが音を出し続けます。 #### 5.3.3 ブザー音 **5.3.3Buzzer-Tone** コードを Arduino IDE で開きます。 ```c const int buzzerPin = 16; //Set buzzer pin to 16 void setup() { ledcAttachChannel(buzzerPin,1000,8,4); } void loop() { ledcWriteTone(buzzerPin,532); //duo --C2 delay(100); ledcWriteTone(buzzerPin,587); //re --D3 delay(100); ledcWriteTone(buzzerPin,659); //mi --E3 delay(100); //Alarm for(int i = 200; i<=1000; i+=10){ ledcWriteTone(buzzerPin,i); delay(10); } //Alarm for(int i = 1000; i>=200; i-=10){ ledcWriteTone(buzzerPin,i); delay(10); } ledcWriteTone(buzzerPin,0); } ``` **ESP32 Dev Module** ボードと **COM** ポートを選択し、コードをアップロードします。 ![5458448](../media/5458448.png) **テスト結果:** ブザーが `ledcWriteTone()` 関数を介してアラームを鳴らします。 `ledcWriteTone()` は、特定の周波数のPWM信号を生成してブザーを振動させ、その持続時間と音色は関連するパラメータによって制御されます。 `ledcWriteTone()` 関数は `ledcAttachChannel()` 関数と組み合わせて使用する必要があります。 **ledcAttachChannel** この関数は、LEDCチャンネルのデューティを設定するために使用されます。 ``` bool ledcWriteChannel(uint8_t channel, uint32_t duty); ``` - `channel` LEDCチャンネルを選択します。 - `duty` 選択したLEDCチャンネルに設定するデューティを選択します。 デューティの設定が成功した場合、この関数は `true` を返します。`false` が返された場合、エラーが発生し、デューティは設定されませんでした。 **ledcWriteTone** この関数は、選択した周波数でLEDCピンを50% PWMトーンに設定するために使用されます。 ``` uint32_t ledcWriteTone(uint8_t pin, uint32_t freq); ``` - `pin` LEDCピンを選択します。 - `freq` PWM信号の周波数を選択します。周波数が `0` の場合、デューティは0に設定されます。 この関数は、LEDCピンに設定された `frequency` を返します。`0` が返された場合、エラーが発生し、LEDCピンは設定されませんでした。 #### 5.4 ブザー音楽 **5.3.4Buzzer-Music** コードを Arduino IDE で開きます。 ```c #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978 #define BUZZERPIN 16 // notes in the melody: int melody[] = { NOTE_E4, NOTE_E4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_G4, NOTE_G3, NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3, NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3, NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_C5, NOTE_C5, NOTE_C5, NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_DS4, NOTE_D4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_A3, NOTE_G3, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_A3, NOTE_G3 }; // note durations: 4 = quarter note, 8 = eighth note, etc.: int noteDurations[] = { 8,4,4,8,4,2,2, 3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,3, 3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,2, 8,8,8,4,4,8,8,4,8,8,3,8,8,8,4,4,4,8,2, 8,8,8,4,4,8,8,4,8,8,3,3,3,1, 8,4,4,8,4,8,4,8,2,8,4,4,8,4,1, 8,4,4,8,4,8,4,8,2 }; void setup() { ledcAttachChannel(BUZZERPIN,1000,8,4); // iterate over the notes of the melody: for (int thisNote = 0; thisNote < 98; thisNote++) { // to calculate the note duration, take one second // divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. int noteDuration = 1000/noteDurations[thisNote]; ledcWriteTone(BUZZERPIN, melody[thisNote]); delayMicroseconds(noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop ledcWriteTone(BUZZERPIN,0); } } void loop() { // no need to repeat the melody. } ``` **ESP32 Dev Module**ボードと**COM**ポートを選択し、コードをアップロードします。 ![5458448](../media/5458448.png) **テスト結果:** ブザーが音楽を再生します。 #### 5.3.5 アラームシステム Arduino IDEで**5.3.5Alarm-System**コードを開きます。 ```c #define BuzzerPin 16 //Set buzzer pin to 16 #define PyroelectricPIN 23 //Set PIR mition sensor to 23 #define Led 27 //Set led pin to 27 void setup() { Serial.begin(9600); //Set the pins modes pinMode(PyroelectricPIN,INPUT); pinMode(Led,OUTPUT); ledcAttachChannel(BuzzerPin,1000,8,4); } void loop() { //PIRモーションセンサーの値を読み取る int ReadValue = digitalRead(PyroelectricPIN); if(ReadValue){ Serial.println("Someone"); digitalWrite(Led,HIGH); //アラーム for(int i = 200; i<=1000; i+=10){ ledcWriteTone(BuzzerPin,i); delay(10); } digitalWrite(Led,LOW); //アラーム for(int i = 1000; i>=200; i-=10){ ledcWriteTone(BuzzerPin,i); delay(10); } } //アラームを停止 ledcWriteTone(BuzzerPin,0); Serial.println("No one"); } ``` **ESP32 Dev Module**ボードと**COM**ポートを選択し、コードをアップロードします。 ![5458448](../media/5458448.png) **テスト結果:** センサーが動きを検出すると、ブザーが鳴り、LEDが点滅して侵入を知らせます。 ![couj33](../media/couj33.png)