【树莓派C语言开发】实验06:轻触开关模块

前言

一起开始本次的实验吧!👍

关注本专栏,和我一起学习树莓派开发板30+经典实验

C语言代码,0基础剖析!


1.实验器材

  • 树莓派
  • 40P软盘线+T型转接板+面包板
  • 轻触开关按键模块
  • 双色LED模块
  • 一堆跳线

IMG_20220410_122510

上:双色LED模块;下:轻触开关模块


2.实验原理

2.1电路图

使用轻触开关作为树莓派的输入设备,按下开关时,树莓派GPIO端口检测到低电平(0v),表示按键被按下。松开按键时,树莓派检测到高电平(3.3v)

在本次实验中,将通过打印信息提示按键是否被按下。

轻触开关模块电路图如下:

6.轻触开关按键原理图

2.2接线

树莓派T型转接板轻触开关
GPIO 0GPIO 17SIG(S)
5V5VVCC
GNDGNDGND(-)
树莓派T型转接板双色LED
GPIO 1GPIO 18R(中间)
GNDGNDGND
GPIO 2GPIO 27G(S)

实验2的博客中,已经提到过树莓派针脚编号和T型转接板上编号的对应关系

在树莓派系统控制栏中,我们可以输入以下指令查看树莓派的GPIO接口

gpio readall

可以看到,17对应0,18对应1,27对应2。和我们的接线方式和初始化针脚的编号是对应的

image-20220410130703405

本次实验的接线图如下,注意各个端口的接线关系

06_Button_bb

右上角红黑线是树莓派的散热风扇,和实验无关

IMG_20220410_131249

IMG_20220410_131331


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);向指定管脚写入高/低电平信号,使用前需要设置管脚为输出模式

这里有个新的函数,作用是读取管脚的值

在本实验中用于接收轻触开关的按钮信号

image-20220410135534852

3.2 Geany编译器运行

运行程序,代码会循环打印“没有按键按下”,LED亮绿灯

image-20220410133351145

按下按键后,打印显示“按键已按下”,LED亮红灯

image-20220410133816114

实验效果如下

Screenshot_2022_0410_133706

3.3Linux-Gcc编译器

在命令行中输入以下编译指令,生成可执行文件

gcc -Wall 06Button.c -o TEST -lwiringPi

运行可执行文件后,可以观测到相同结果

image-20220410134451466

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);//延时查看关闭情况
	
	return 0;

结语

本次实验学习了轻触开关的使用方法,在未来的实验中,可以使用它来控制一些更复杂电路的开合

QQ图片20220410135336

你学费了吗?

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值