這兩天有點時間,搗鼓了下那閒置很久的樹莓派,把普通PC主板的蜂鳴器做爲樹莓派的報警器用。python
Raspberry Pi有許多的GPIO(General Purpose Input Output:通用輸入/輸出),能夠用來控制和讀取數字電路中TTL電平的邏輯0和邏輯1。c++
咱們要使用RPi的GPIO首先要知其GPIO的定義,經常使用的有兩種編號定義:WiringPi Pin和BCM GPIO。spa
GPIO的驅動庫我這裏介紹兩種給你們,一種爲C語言的WiringPi,另外一種爲python的RPi.GPIO,本例使用的是WiringPi。code
接線比較簡單,把蜂鳴器的紅線接GPIO1口(pin:12,即BCM_GPIO 18),黑線接GND(pin:6)。blog
至於爲何接GPIO1口,主要是由於樹莓派只有這個口支持PWM輸出。it
pin編號以下圖所示:io
具體代碼以下:編譯
alarm.hast
#include <wiringPi.h> #define PIN_NO 1 int init(); void alarm(int count, int value, int interval); void stopAlarm();
alarm.cclass
#include <stdio.h> #include <stdlib.h> #include "alarm.h" static short isok; int init(){ if(!isok){ if(wiringPiSetup() == -1){ printf("WiringPi setup failed!\n"); return 0; }else{ isok = 1; } } return 1; } void alarm(int count, int value, int interval){ if(!init()) return; //printf("Speaker pin: GPIO%d\n",PIN_NO); pinMode(PIN_NO,PWM_OUTPUT);//設置引腳模式,模式爲INPUT、OUTPUT 或者 PWM_OUTPUT,注意:僅wiringPi引腳1(即BCM_GPIO 18)支持PWM輸出 pwmSetMode(PWM_MODE_MS); //pwmSetRange(1024); int c; for(c = 0;c < count; c++){ pwmWrite(PIN_NO,value); //printf("%d\n",count - c); delay(interval); pwmWrite(PIN_NO,-1); delay(interval); } stopAlarm(); } void stopAlarm(){ if(!init()) return; pwmWrite(PIN_NO,-1); //pwmSetMode(PWM_MODE_BAL); }
alarm_test.c
#include <stdio.h> #include <stdlib.h> #include "alarm.h" int main(int argc, char *argv[]) { if(argc < 4){ printf("arg error! At least 3 parameters!\n"); return 1; }else{ int count = atoi(argv[1]); int value = atoi(argv[2]); int interval = atoi(argv[3]); printf("Count:%d\tValue:%d\tInterval:%d\n", count, value, interval); printf("Alarm start!\n"); alarm(count, value, interval); printf("Alarm complete!\n"); } return 0; }
編譯:
gcc -c -o alarm.o alarm.c -lwiringPi
gcc -o alarm_test alarm_test.c alarm.o -lwiringPi
執行:
sudo ./alarm_test 10 1000 1000