栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

树莓派开发(二)--- GPIO

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

树莓派开发(二)--- GPIO

文章目录
  • 1、理论介绍
  • 2、案例介绍
    • 2.1、GPIO控制继电器
    • 2.2、GPIO控制超声波
    • 2.3、GPIO控制继电器 + 超声波

1、理论介绍

GPIO是MCU常用的外设接口,主要有两种模式,一种是输入模式,用于检测外部信号的高低电平,例如传感器。另一种是输出模式,用于输出高低电平以用于控制外围电路,例如蜂鸣器,继电器。

2、案例介绍 2.1、GPIO控制继电器
#include 
#include

#define RELAY_GPIO_NUM1 29
#define RELAY_GPIO_NUM2 28
#define RELAY_GPIO_NUM3 27
#define RELAY_GPIO_NUM4 26

void GpioInit(void)
{
        pinMode(RELAY_GPIO_NUM1, OUTPUT);
        pinMode(RELAY_GPIO_NUM2, OUTPUT);
        pinMode(RELAY_GPIO_NUM3, OUTPUT);
        pinMode(RELAY_GPIO_NUM4, OUTPUT);
}

int main()
{
        int cmd, relay_num = 0;
        if(wiringPiSetup() == -1)
        {
                printf("gpio init failn");
                return -1;
        }

        GpioInit();

        while(1)
        {
                printf("please input gpio_num and cmd:");
                scanf("%d%d", &relay_num, &cmd);
                digitalWrite(30 - relay_num, !cmd);
        }


        return 0;
}

2.2、GPIO控制超声波
#include 
#include 
#include 

#define ECHO_GPIO_NUM    4
#define TRIGGER_GPIO_NUM 5

void UltraInit(void)
{
        pinMode(TRIGGER_GPIO_NUM, OUTPUT);
        pinMode(ECHO_GPIO_NUM,    INPUT);
}

float UltraMeasure(void)
{
        struct timeval tv_begin, tv_end;
        float dis = 0;
        long start = 0, end = 0;

        digitalWrite(TRIGGER_GPIO_NUM, LOW);
        delayMicroseconds(3);

        digitalWrite(TRIGGER_GPIO_NUM,HIGH);
        delayMicroseconds(10);
        digitalWrite(TRIGGER_GPIO_NUM, LOW);

        while(digitalRead(ECHO_GPIO_NUM) == 0);
        gettimeofday(&tv_begin, NULL);

        while(digitalRead(ECHO_GPIO_NUM) == 1);
        gettimeofday(&tv_end, NULL);

        start = tv_begin.tv_sec * 1000000 + tv_begin.tv_usec;
        end   = tv_end.tv_sec   * 1000000 + tv_end.tv_usec;

        dis = (float)(end - start) / 1000000 * 34000 / 2;

        return dis;
}

int main()
{
        float dis = 0;
        if(wiringPiSetup() == -1)
        {
                printf("gpio init failn");
                return -1;
        }

        UltraInit();

        while(1)
        {
                dis = UltraMeasure();
                printf("dis = %0.2fn", dis);
                delay(1000);
        }

        return 0;
}

2.3、GPIO控制继电器 + 超声波
#include 
#include 
#include 

#define ECHO_GPIO_NUM    4
#define TRIGGER_GPIO_NUM 5

#define RELAY_GPIO_NUM1  29
#define RELAY_GPIO_NUM2  28
#define RELAY_GPIO_NUM3  27
#define RELAY_GPIO_NUM4  26

#define RELAY_ON_CMD     LOW
#define RELAY_OFF_CMD    HIGH

void UltraInit(void)
{
        pinMode(TRIGGER_GPIO_NUM, OUTPUT);
        pinMode(ECHO_GPIO_NUM,    INPUT);
}


void RelayInit(void)
{
        pinMode(RELAY_GPIO_NUM1, OUTPUT);
        pinMode(RELAY_GPIO_NUM2, OUTPUT);
        pinMode(RELAY_GPIO_NUM3, OUTPUT);
        pinMode(RELAY_GPIO_NUM4, OUTPUT);
}

void RelayControl(float first_dis, float cur_dis)
{
        int cmd = 0;
        int relay_num = 0;

        if (cur_dis < 5)
        {
                return ;
        }

        if (cur_dis > first_dis)
        {
                cmd = RELAY_ON_CMD;
        }
        else
        {
                cmd = RELAY_OFF_CMD;
        }

        relay_num = cur_dis / 5;
        digitalWrite(30 - relay_num, cmd);
}


float UltraMeasure(void)
{
        struct timeval tv_begin, tv_end;
        float dis = 0;
        long start = 0, end = 0;

        digitalWrite(TRIGGER_GPIO_NUM, LOW);
        delayMicroseconds(3);

        digitalWrite(TRIGGER_GPIO_NUM,HIGH);
        delayMicroseconds(10);
        digitalWrite(TRIGGER_GPIO_NUM, LOW);

        while(digitalRead(ECHO_GPIO_NUM) == 0);
        gettimeofday(&tv_begin, NULL);

        while(digitalRead(ECHO_GPIO_NUM) == 1);
        gettimeofday(&tv_end, NULL);

        start = tv_begin.tv_sec * 1000000 + tv_begin.tv_usec;
        end   = tv_end.tv_sec   * 1000000 + tv_end.tv_usec;

        dis = (float)(end - start) / 1000000 * 34000 / 2;

        return dis;
}

int main()
{
        float first_dis, cur_dis = 0;
        if(wiringPiSetup() == -1)
        {
             	printf("gpio init failn");
                return -1;
        }

        UltraInit();
        RelayInit();

        while(1)
        {
                cur_dis = UltraMeasure();
                RelayControl(first_dis, cur_dis);

                if (cur_dis != first_dis)
                {
                        first_dis = cur_dis;
                }
                printf("cur_dis = %0.2fn", cur_dis);
                delay(1000);
        }

        return 0;
}

显示效果:

树莓派继电器 + 超声波-演示视频

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878962.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号