前言
书上的代码示例可太牛了,不仅没用字符串比较函数strcmp
,还是指针直接和字符串对比😥
学习还得帮书本纠错,问店家客服也是一问三不知。
不多说了,一起开始本次的实验吧!👍
关注本专栏,和我一起学习树莓派开发板30+经典实验!
C语言代码,0基础剖析!
1.实验器材
- 树莓派
- 40P软盘线+T型转接板+面包板
- 轻触开关按键模块
- 双色LED模块
- 一堆跳线
上:双色LED模块;下:轻触开关模块
2.实验原理
2.1电路图
使用轻触开关作为树莓派的输入设备,按下开关时,树莓派GPIO端口检测到低电平(0v),表示按键被按下。松开按键时,树莓派检测到高电平(3.3v)
在本次实验中,将通过打印信息提示按键是否被按下。
轻触开关模块电路图如下:
2.2接线
树莓派 | T型转接板 | 轻触开关 |
---|
GPIO 0 | GPIO 17 | SIG(S) |
5V | 5V | VCC |
GND | GND | GND(-) |
树莓派 | T型转接板 | 双色LED |
---|
GPIO 1 | GPIO 18 | R(中间) |
GND | GND | GND |
GPIO 2 | GPIO 27 | G(S) |
在实验2的博客中,已经提到过树莓派针脚编号和T型转接板上编号的对应关系
在树莓派系统控制栏中,我们可以输入以下指令查看树莓派的GPIO
接口
可以看到,17对应0,18对应1,27对应2。和我们的接线方式和初始化针脚的编号是对应的
本次实验的接线图如下,注意各个端口的接线关系
右上角红黑线是树莓派的散热风扇,和实验无关
3.程序示例
以下给出C语言的示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include <wiringPi.h> #include <stdio.h> #include <string.h>
#define makerobo_BtnPin 0 #define makerobo_Rpin 1 #define makerobo_Gpin 2
void double_colorLED(char* color) { pinMode(makerobo_Rpin, OUTPUT); pinMode(makerobo_Gpin, OUTPUT); if (!strcmp(color,"RED")) { digitalWrite(makerobo_Rpin, HIGH); digitalWrite(makerobo_Gpin, LOW); } else if (!strcmp(color,"GREEN")) { 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; } pinMode(makerobo_BtnPin, INPUT); double_colorLED("GREEN"); while(1) { if(0 == digitalRead(makerobo_BtnPin)) { delay(10); if(0 == digitalRead(makerobo_BtnPin)) { double_colorLED("RED"); printf("Button is pressed\n"); } } else if(1 == digitalRead(makerobo_BtnPin)) { delay(10); if(1 == digitalRead(makerobo_BtnPin)) { double_colorLED("GREEN"); 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编译器
在命令行中输入以下编译指令,生成可执行文件
1
| gcc -Wall 06Button.c -o TEST -lwiringPi
|
运行可执行文件后,可以观测到相同结果
3.4程序优化
我个人觉得这个程序用while(1)
死循环并不是那么的优,程序需要手动CTRL+C
终止,且终止后无法关闭LED灯。
下面对程序做出一些优化
- 依旧可以试试判断按键按下情况
- 在程序运行后,关闭小灯
只需更改循环体和延时函数即可,在循环结束后,使用digitalWrite
输入低电平关闭小灯的红/绿管脚,即完全关闭双色LED
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| int k=40; while(k--) { if(0 == digitalRead(makerobo_BtnPin)) { delay(500); if(0 == digitalRead(makerobo_BtnPin)) { double_colorLED("RED"); printf("Button is pressed\n"); } } else if(1 == digitalRead(makerobo_BtnPin)) { delay(500); if(1 == digitalRead(makerobo_BtnPin)) { double_colorLED("GREEN"); printf("No Button is pressed\n"); } } }
digitalWrite(makerobo_Rpin, LOW); digitalWrite(makerobo_Gpin, LOW); delay(500);
return 0;
|
结语
本次实验学习了轻触开关的使用方法,在未来的实验中,可以使用它来控制一些更复杂电路的开合
你学费了吗?