目的:通过读取按键开关的信号,实现其他器件的控制

难点:下拉电阻和上拉电阻

一、关于按键开关

按键开关如上图【1】所示,但我拿到实物,最令我头疼的是按钮下边4个角,我不知那两边是相通的(就是和图中1234对不上),这样没法在面包板上安装(⊙﹏⊙b汗)。这个问题好困扰,难不成只能试错来搞定?后来仔细看图,才发现自己好蠢,其实引脚是有方向的(还是完全对照上图即可),在同一个纵方向上本就是连通的,按下后相邻引脚连通。

将按键开关连接到电路中有两种模式,一种是配下拉电阻,如下图【1】,按键两引脚一段接5v,一端接数字引脚(此引脚需设置为输入模式),并连接下拉电阻至Gnd。这种接法未按时9号引脚读出为0(低电平),按下时读出为1(高电平)。

另一种则是输入上拉模式【2-3】,连接如下图,一端连数字引脚(此引脚需设置为INPUT_PULLUP模式),另一端接地,这种模式下,按键开关未按时数字引脚读出为1(高电平),按下时读出为0(低电平)。

以上关于按键开关对应数字引脚读出的状态,其实都是通过串口显示出来的,代码如下:

int Button1 = 2; //下拉电阻_按钮1_2号引脚
int Button2 = 3; //内置上拉电阻_按钮2_3号引脚
void setup()
{
Serial.begin(9600); //初始化串口波特率为9600

pinMode(Button1, INPUT);//按钮1引脚设置为输入

pinMode(Button2, INPUT_PULLUP); //按钮2引脚设置为输入上拉模式
}
void loop()
{
// 读取输入引脚的值
boolean button1State = digitalRead(Button1);
boolean button2State = digitalRead(Button2);
// 打印结果到串口
Serial.print("button1:");
Serial.println(button1State);
Serial.print("button2:");
Serial.println(button2State);
delay(1000); //延迟
}
连接电路将代码下载后,可以通过IDE里面串口监视器查看对应数字引脚的输入值,比较方便。代码中关于串口引入了两个函数:

1.Serial.begin()——串口初始化函数

2. 串口界面打印函数Serial.print() 打印 Serial.println()打印并换行

另外就是和输入模式(输入上拉模式)配对使用的digitalRead(),可以读取引脚状态,boolean则是布尔型数据,即数据为0(False)或1(True)

二、用按键开关控制LED亮灭

在按键开关旁边再多加一路LED,LED的连接还是和以前一样(注意正负极),代码如下

//按钮控制LED的亮灭,按下亮,松开则灭
const int buttonpin = 2;//button连接引脚
const int ledpin = 13;//led连接引脚

void setup() {
// put your setup code here, to run once:
pinMode(ledpin, OUTPUT);//设置led连接引脚为输出模式
pinMode(buttonpin, INPUT); //设置button连接引脚为输入模式
}

void loop() {
// 检测按钮是否被按下 repeatedly:
boolean buttonstate = digitalRead(buttonpin);
if(buttonstate == 1){
digitalWrite(ledpin, 1);}
else{digitalWrite(ledpin, 0);}
}
这次代码里面digitalWrite()函数中我写了1、0,代替HIGH、LOW,后来看了学习资料里面的答案,感觉答案写的更简洁,似乎没必要写if else.

boolean buttonState = digitalRead(pushButton);

digitalWrite(led, buttonState);
另外就是这个代码的效果是按下LED亮,松开则灭,我想改进一下,按一下亮,再按一下灭,代码如下:

//按键开关控制LED灯,按一下亮,再按一下灭
const int buttonpin = 2;//button连接引脚
const int ledpin = 13;//led连接引脚
boolean ledstate = false;//led状态

void setup() {
// put your setup code here, to run once:
pinMode(ledpin, OUTPUT);
pinMode(buttonpin, INPUT);
digitalWrite(ledpin, LOW);//一开始灯灭

}

void loop() {
// 检测按钮是否被按下 repeatedly:
boolean buttonstate = digitalRead(buttonpin);
if(buttonstate == 1){
//变灯
ledstate = !ledstate;
digitalWrite(ledpin, ledstate);
}
}
但是代码下载后,这个效果时灵时不灵,有时候按了没变化,不知问题出在哪儿?好像和我按地快慢以及间隔有关系,尝试了很多次还是不行。更细一点的想法就是按钮按下时,读取值是一个1-0-1变化,怎么把这一个变化作为控制LED的信号呢?反正现在这个代码就算是成功的时候,也是一按下就开始变了,还是和我想的按一下触发有细微差异的。

【1】DFROBOT初级教程Lesson4 https://mc.dfrobot.com.cn/thread-1316-1-1.html

【2】https://blog.csdn.net/xiaoxiaoxiaoali/article/details/104338747

【3】https://www.kancloud.cn/yundantiankong/arduino_examples/431630
————————————————
版权声明:本文为CSDN博主「Rick_ding」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013978070/article/details/119346429

Arduino基础入门之三按键开关的更多相关文章

  1. Arduino基础入门—3.连接 IIC 1602 LCD显示文字

    1. IIC转接板介绍 Arduino Uno R3开发板的外部IO口是非常有限的.在驱动LCD1602时,尽管我们的数据线使用了4线,相对于8线方式减少一半,但是在需要外接多种传感器的应用中,4线驱 ...

  2. Arduino基础入门篇-进入Arduino的世界

    写在前面,首先是发现有网友对Arduino做了介绍,而且介绍比较清晰到位,就引用过来了. 文章出处:https://blog.csdn.net/TonyIOT/article/details/8091 ...

  3. Arduino基础入门—1.Hello World

    1.首先是下载.安装IDE. https://www.arduino.cc/en/Main/Software 2.连接开发板到电脑. 将UNO R3开发板通过数据线连接到电脑.打开设备管理器查看驱动是 ...

  4. python基础入门之三 —— 字符串

    1.格式 一对引号和三对引号可以表示字符串 (三引号保留换行) 2.下标 从0开始循序向下分配 str1='abcdefg' print(str1) print(str1[0]) print(str1 ...

  5. arduino小车入门教学——第三天(arduino基础)

    大家好,我是小编, 记上一节内容点击打开链接 我们今天讲arduino基础. 首先在arduino官网上下载程序. Windows解压版 苹果系统的版本号 好,下载过编程软件.我们就来讲编程. 这是类 ...

  6. 011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三—— 变量值——即Java中的“字面值”

    011 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 05 变量的三个元素的详细介绍之三-- 变量值--即Java中的"字面值" 变量值可以是 ...

  7. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  8. Linux 基础入门(新版)”实验报告一~十二

    实验报告 日期: 2015年9月15日 一.实验的目的与要求 熟练地使用 Linux,本实验介绍 Linux 基本操作,shell 环境下的常用命令. 二.主要内容 1.Linux 基础入门& ...

  9. Linux基础入门学习笔记20135227黄晓妍

    学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用L ...

  10. html5 基础入门

    html5 基础入门 前言介绍 HTML5草案的前身名为 Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的 HTML工作团队. 如果从狭 ...

随机推荐

  1. C# - ConcurrentDictionary 并发场景使用注意事项

    1 自身作为 Enumerable 的遍历 自身作为可遍历对象,键值对为元素进行遍历,是线程安全的,但不提供快照,遍历过程中集合产生变更会直接反馈至此次遍历过程中.但并不一定能够保障获取数据的过程中, ...

  2. 提升性能的利器:深入解析SectionReader

    一. 简介 本文将介绍 Go 语言中的 SectionReader,包括 SectionReader的基本使用方法.实现原理.使用注意事项.从而能够在合适的场景下,更好得使用SectionReader ...

  3. 从数据库中读取数据并写入到Excle电子表格之1

    //获取数据 using (SqlDataReader reader = Alian_SQL_Helper.SQL_Helper .ExecuteReader( "select CC_Aut ...

  4. CF1794C Scoring Subsequences题解

    文中 \(a\) 为题目中给的 \(a\). 如果我们要求 \(a_1, a_2, a_3, \dots, a_m\) 的结果, 那么我们可以把 \(a\) 数组从后往前依次除以 \(i\),\(i\ ...

  5. 筛选出N以内的素数

    解题思路:1.素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.(也就是只有 1 和它本身能整除)2.利用两个for循环来判断素数. 注意事项:1.注意for添加花括号.2.注意输 ...

  6. PlayWright(十七)- 参数化

    今天来讲下参数化,具体是什么意思呢,举个例子   比如我们要测试登录功能,第一步会填写账号,第二步会填写密码,这是一条完整的操作,但是其中会有很多条用例比如账号错误.密码错误.账号为空.密码为空的各种 ...

  7. MyBatis(log4j)

    log4j介绍 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护 ...

  8. 【译】Visual Studio 2022 中的 Web API 开发

    在 Visual Studio 2022 中,Web 开发人员的主要场景之一是使用 ASP.NET Core 创建 Web API.在 Visual Studio 2022 17.6 的最新预览版中, ...

  9. Sa-Token 多账号认证:同时为系统的 Admin 账号和 User 账号提供鉴权操作

    Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证.权限认证.单点登录.OAuth2.微服务网关鉴权 等一系列权限相关问题. Gitee 开源地址:https://gitee.c ...

  10. Print, printf, println的区别

    print 非格式,打印变量的值,不换行 printf 支持格式化输出,不换行 println 非格式,打印变量的值 ,换行