树莓派开发笔记03-树莓派的GPIO口输入检测

github主页:https://github.com/snqx-lqh

gitee主页:https://gitee.com/snqx-lqh

本项目github地址:https://github.com/snqx-lqh/RaspberryPiLearningNotes

本项目gitee地址:https://gitee.com/snqx-lqh/RaspberryPiLearningNotes

欢迎交流

说明

首先,树莓派的GPIO口,不同的库给他的编号不同,有基本的功能名编的引脚,然后BCM库有一种编码,然后是wiringPi有一种编码。我们下面的代码将通过检测GPIO.0的输入高低电平变化来控制GPIO.1的输出高低电平的变换。

该笔记实现的功能,检测GPIO.0的输入,控制GPIO.1的输出

代码

wiringPi

1、int digitalRead (int pin)

pin:读取的引脚

返回:引脚上的电平,可以是LOW HIGH 之一

c文件名我命名为main.c,实现的功能就是按键端口检测为0,就设置LED端口电平为0,反之为1。

c 复制代码
#include <wiringPi.h>
#include <stdio.h>

#define LED 1
#define KEY 0

int main(void)
{
    int key_value = 0;

    if(wiringPiSetup() < 0) //当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。
        return 1;
    
    pinMode(KEY,INPUT);  //设置引脚为输入模式
    pinMode(LED,OUTPUT); //设置引脚为输出模式
    
    while (1)
    {
        key_value = digitalRead(KEY); //读取引脚电平
        if(key_value == 0)
        {
            digitalWrite(LED,0);      //设置引脚电平为0
        }else
        { 
            digitalWrite(LED,1);      //设置引脚电平为1
        }  
    }
}

然后编译这段代码

bash 复制代码
cc -Wall -o main main.c -lwiringPi

-Wall 表示编译时显示所有警告,-lwiringPi 表示编译时动态加载 wiringPi 库

编译完成后调用生成的main文件

bash 复制代码
sudo ./main

然后可以用示波器啥的,或者自己连接的KEY和LED灯在这两个引脚上,就可以查看到变化。

想要停止这个程序,Ctrl+c即可。

bcm2835库

1、void bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud);

pin:配置的引脚

mode:指定引脚的上下拉模式,BCM2835_GPIO_PUD_OFF、BCM2835_GPIO_PUD_DOWN、BCM2835_GPIO_PUD_UP

2、uint8_t bcm2835_gpio_lev(uint8_t pin);

pin:配置的引脚

读取对应的引脚的值

bcm的引脚编号和wiringPi不同,注意,下面是一个实际例子

c 复制代码
#include <bcm2835.h>

#define LED 18
#define KEY 17

int main(int argc,char **argv)
{
    uint8_t keyValue = 0;
    if(!bcm2835_init()) //初始化BCM相关的
        return 1;

    //  设置KEY输入模式
    bcm2835_gpio_fsel(KEY, BCM2835_GPIO_FSEL_INPT);
    //  设置KEY上拉模式
    bcm2835_gpio_set_pud(KEY, BCM2835_GPIO_PUD_UP);
    //  设置LED输出模式
    bcm2835_gpio_fsel(LED,BCM2835_GPIO_FSEL_OUTP); 
    
    while(1)
    {
        keyValue = bcm2835_gpio_lev(KEY);
        if(keyValue == 0)
        {
            bcm2835_gpio_write(LED,LOW);      //设置引脚电平为0
        }else
        { 
            bcm2835_gpio_write(LED,HIGH);      //设置引脚电平为1
        }  
    }
    
    bcm2835_close();
    return 0;
}

然后编译这段代码

bash 复制代码
gcc -Wall main.c -o main -lbcm2835

-Wall 表示编译时显示所有警告,-lbcm2835 表示编译时动态加载bcm2835 库

编译完成后调用生成的main文件

bash 复制代码
sudo ./main

然后可以用示波器啥的,或者自己连接的KEY和LED灯在这两个引脚上,就可以查看到变化。

想要停止这个程序,Ctrl+c即可。

RPi.GPIO

直接给代码了

python 复制代码
#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time

LED = 18
KEY = 17

GPIO.setmode(GPIO.BCM)    #采用BCM编号方式
GPIO.setup(LED,GPIO.OUT)  #设置输出模式
GPIO.setup(KEY, GPIO.IN, pull_up_down=GPIO.PUD_UP)  #设置输入模式,输入上拉,下拉是GPIO.PUD_DOWN

keyValue = 0

try:
    while True:
        keyValue = GPIO.input(KEY)
        if keyValue:
            GPIO.output(LED,GPIO.HIGH)
        else:
            GPIO.output(LED,GPIO.LOW)
except:
    print("except")

GPIO.cleanup()

运行执行python main.py即可

相关推荐
大筒木老辈子5 小时前
Linux笔记---协议定制与序列化/反序列化
网络·笔记
草莓熊Lotso5 小时前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
我爱挣钱我也要早睡!8 小时前
Java 复习笔记
java·开发语言·笔记
汇能感知12 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun13 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao13 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾13 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT14 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
ST.J14 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记
Suckerbin14 小时前
LAMPSecurity: CTF5靶场渗透
笔记·安全·web安全·网络安全