既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
gpio readall
可以看到,17对应0,18对应1,27对应2。和我们的接线方式和初始化针脚的编号是对应的
本次实验的接线图如下,注意各个端口的接线关系
右上角红黑线是树莓派的散热风扇,和实验无关
3.程序示例
以下给出C语言的示例代码
//轻触开关按键实验
#include <wiringPi.h>
#include <stdio.h>
#include <string.h>
#define makerobo\_BtnPin 0 // 轻触按键PIN口
#define makerobo\_Rpin 1 // 红色LED灯模块PIN
#define makerobo\_Gpin 2 // 绿色LED灯模块PIN
//双色LED控制函数
void double\_colorLED(char\* color)
{
pinMode(makerobo_Rpin, OUTPUT); //设置为输出模式
pinMode(makerobo_Gpin, OUTPUT); //设置为输出模式
if (!strcmp(color,"RED")) //点亮红色LED灯
{
digitalWrite(makerobo_Rpin, HIGH);
digitalWrite(makerobo_Gpin, LOW);
}
else if (!strcmp(color,"GREEN")) //点亮绿色LED灯
{
digitalWrite(makerobo_Rpin, LOW);
digitalWrite(makerobo_Gpin, HIGH);
}
else
printf("makerobo Double color LED Error\n");
}
int main()
{
//初始化连接失败时,将消息打印到屏幕
if(wiringPiSetup() == -1){
printf("setup wiringPi failed!\n");
return 1;
}
//轻触按键Pin设置为输入模式
pinMode(makerobo_BtnPin, INPUT);
double\_colorLED("GREEN");
while(1)
{
//轻触按键去除抖动处理
if(0 == digitalRead(makerobo_BtnPin))
{ // 按键有按下
delay(10); // 延时去抖动
if(0 == digitalRead(makerobo_BtnPin))
{
double\_colorLED("RED"); // 点亮红色LED灯
printf("Button is pressed\n"); // 打印出有按键按下
}
}
else if(1 == digitalRead(makerobo_BtnPin))
{ // 没有按键按下亮绿灯
delay(10);
if(1 == digitalRead(makerobo_BtnPin))
{
double\_colorLED("GREEN"); // 点亮绿色LED灯
printf("No Button is pressed\n"); // 没有按键按下
}
}
}
return 0;
}
3.1部分函数解析
一些函数在之前的博客中已具体介绍过,这里简单列出它们的功能
函数 | 作用 |
---|---|
void pinMode(int pin, int mode) | 设置针脚模式(输入、输出、脉冲输出、GPIO时钟) |
void digitalWrite(int pin, int value); | 向指定管脚写入高/低电平信号,使用前需要设置管脚为输出模式 |
这里有个新的函数,作用是读取管脚的值
在本实验中用于接收轻触开关的按钮信号
3.2 Geany编译器运行
运行程序,代码会循环打印“没有按键按下”,LED亮绿灯
按下按键后,打印显示“按键已按下”,LED亮红灯
实验效果如下
3.3Linux-Gcc编译器
在命令行中输入以下编译指令,生成可执行文件
gcc -Wall 06Button.c -o TEST -lwiringPi
运行可执行文件后,可以观测到相同结果
3.4程序优化
我个人觉得这个程序用while(1)
死循环并不是那么的优,程序需要手动CTRL+C
终止,且终止后无法关闭LED灯。
下面对程序做出一些优化
- 依旧可以试试判断按键按下情况
- 在程序运行后,关闭小灯
只需更改循环体和延时函数即可,在循环结束后,使用digitalWrite
输入低电平关闭小灯的红/绿管脚,即完全关闭双色LED
int k=40;
while(k--)
{
//轻触按键去除抖动处理
if(0 == digitalRead(makerobo_BtnPin))
{ // 按键有按下
delay(500); // 延时去抖动
if(0 == digitalRead(makerobo_BtnPin))
{
double\_colorLED("RED"); // 点亮红色LED灯
printf("Button is pressed\n"); // 打印出有按键按下
}
}
else if(1 == digitalRead(makerobo_BtnPin))
{ // 没有按键按下亮绿灯
delay(500);
if(1 == digitalRead(makerobo_BtnPin))
{
double\_colorLED("GREEN"); // 点亮绿色LED灯
printf("No Button is pressed\n"); // 没有按键按下
}
}
}
//关闭LED
digitalWrite(makerobo_Rpin, LOW);
digitalWrite(makerobo_Gpin, LOW);
delay(500);//延时查看关闭情况
![img](https://img-blog.csdnimg.cn/img_convert/5759c39a71574c31b783dd1e672de7f2.png)
![img](https://img-blog.csdnimg.cn/img_convert/29e693efd9820897b0207a98f4937751.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
usLoCG-1715726282173)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**