Skonstruujemy prosty alarm – w momencie, gdy ktoś znajdzie się w polu widzenia „czujki ruchu” włączy się buzzer.

Czujnik będzie alarmował w sposób jaki znamy z wyświetlania czerwonej diody na czujkach alarmowych. Ruch = dioda, czyli u nas ruch = beep, mija kilka sekund znika dioda, czyli beep milknie.

Hardware

Czujnik ruchu PIR HC-SR501 + dowolny buzzer dający sygnał ciągły przy napięciu 3,3V.

Podłączamy buzzer – przewód + do pinu GPIO.26 (BCM12), a minus do GND (dowolne)
Podłączamy czujnik ruchu PIR
– VCC – 5V
– OUT GPIO.1 (BCM 18 – sygnałowy przewód)
– GND – GND

C++ przerwania

Wersja mądrzejsza z przerwaniami:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <wiringPi.h>

//WPi nr 1 / GPIO 18
#define SENSOR 1

//jeśli nie 12 to 26
#define BUZZER_PIN 26


unsigned int state = 0;
unsigned int data  = 0;
struct sigaction sig_struct;

void  finish(int sig)
  {
  printf("Program przerwany: %d\n", sig);
  exit(0);
  }


void interrupt_move_sensor()
{
   data = digitalRead(SENSOR);
   if(data == 1 && state == 0)
      {
      printf("Ruch - %d\n",(int)time(NULL));
      digitalWrite(BUZZER_PIN, 1);
      state = 1;
      }
    else if (data == 0 && state == 1)
      {
      printf("Czuwanie...\n");
      digitalWrite(BUZZER_PIN, 0);
      state = 0;
      }
}


int main(int argc, char **argv)
  {
  if (wiringPiSetup() == -1 ||
      wiringPiISR(SENSOR, INT_EDGE_BOTH, &interrupt_move_sensor) <0) //podlacz przerwanie!!
    {
    printf("Uruchom jako root!\n");
    return EXIT_FAILURE;
    }

  //OBSLUGA Ctrl+C
  sig_struct.sa_handler = finish;
  sigemptyset(&sig_struct.sa_mask);
  sig_struct.sa_flags = 0;
  sigaction(SIGINT,&sig_struct,NULL);
 //podlaczenie trybu pinow
  pinMode(SENSOR, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  while((data = digitalRead(SENSOR)) != 0)
    {
    usleep(100000);
    }

  printf("Czuwanie...\n");
  while (1)
    {
 //Pętla nic nie robi, obsługuje przerwanie, obciążenie procesora bardzo małe
    usleep(1000000);
    }
  return EXIT_SUCCESS;
  }

C++, wersja bez przerwania (obciąża procesor)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <wiringPi.h>

//WPi nr 1 / GPIO.18
#define SENSOR 1

//pin  12 / GPIO.26
#define BUZZER_PIN 26


unsigned int state = 0;
unsigned int data  = 0;
struct sigaction sig_struct;

void  finish(int sig)
  {
  printf("Przerwano program: %d, kończenie...\n", sig);
  exit(0);
  }

int main(int argc, char **argv)
 {
  if (wiringPiSetup() == -1)
    {
    printf("Uruchom jako root\n");
    return EXIT_FAILURE;
    }

  /*Handler Ctrl+C */
  sig_struct.sa_handler = finish;
  sigemptyset(&sig_struct.sa_mask);
  sig_struct.sa_flags = 0;
  sigaction(SIGINT,&sig_struct,NULL);

//tryby pracy - buzer out, czujka in
  pinMode(SENSOR, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);

  while((data = digitalRead(SENSOR)) != 0)
    {
    // 0,1 Sekundy
    usleep(100000);
    }
  printf("Czuwanie...\n");
  while (1)
    {
    data = digitalRead(SENSOR);
    if(data == 1 && state == 0)
      {
      printf("Ruch - %d\n",(int)time(NULL));
      digitalWrite(BUZZER_PIN, 1);
      state = 1;
      }
    else if (data == 0 && state == 1)
      {
      printf("Czuwanie...\n");
      digitalWrite(BUZZER_PIN, 0);
      state = 0;
      }
    //  0,1 Sekundy
    usleep(100000);
    }
  return EXIT_SUCCESS;
  }