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; } |