zoukankan      html  css  js  c++  java
  • 用普通PC主板的蜂鸣器给树莓派(RPI)加个报警器

    这两天有点时间,捣鼓了下那闲置好久的树莓派,把普通PC主板的蜂鸣器作为树莓派的报警器用。

    Raspberry Pi有许多的GPIO(General Purpose Input Output:通用输入/输出),可以用来控制和读取数字电路中TTL电平的逻辑0和逻辑1。

    我们要使用RPi的GPIO首先要知其GPIO的定义,常用的有两种编号定义:WiringPi Pin和BCM GPIO。

    GPIO的驱动库我这里介绍两种给大家,一种为C语言的WiringPi,另一种为python的RPi.GPIO,本例使用的是WiringPi。

    接线比较简单,把蜂鸣器的红线接GPIO1口(pin:12,即BCM_GPIO 18),黑线接GND(pin:6)。

    至于为什么接GPIO1口,主要是因为树莓派只有这个口支持PWM输出。

    pin编号如下图所示:

    具体代码如下:

    alarm.h

    #include <wiringPi.h>
    
    #define PIN_NO 1
    
    int init();
    
    void alarm(int count, int value, int interval);
    
    void stopAlarm();

    alarm.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "alarm.h"
    
    static short isok;
    
    int init(){
        if(!isok){
            if(wiringPiSetup() == -1){
                printf("WiringPi setup failed!
    ");
                return 0;
            }else{
                isok = 1;
            }
        }
        return 1;
    }
    
    void alarm(int count, int value, int interval){
        if(!init())
            return;
    
        //printf("Speaker pin: GPIO%d
    ",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
    ",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!
    ");
            return 1;
        }else{
            int count = atoi(argv[1]);
            int value = atoi(argv[2]);
            int interval = atoi(argv[3]);
            printf("Count:%d	Value:%d	Interval:%d
    ", count, value, interval);
            printf("Alarm start!
    ");
            alarm(count, value, interval);
            printf("Alarm complete!
    ");
        }
        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
  • 相关阅读:
    Linux入门
    Linux和VMware
    vue中select的使用以及select设置默认选中
    Django ModelFrom组件
    Django登录(含随机生成图片验证码)注册实例
    Django组件---Django请求生命周期和中间件
    Python3之使用Crypto
    ORM大结局
    ORM多表查询下
    Pycharn破解补丁激活
  • 原文地址:https://www.cnblogs.com/mic86/p/4262025.html
Copyright © 2011-2022 走看看