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

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

一、关于按键开关

按键开关如上图【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. 阿里云ASK试用心得(避坑贴)

    前言 常年BP阿里云的各种服务,今天却被阿里云给上了一课,这一套组合拳把我安排的明明白白,血亏50大洋,算是提前为各位大佬排坑了,预祝大家中秋快乐 目的 最近阿里云首页放出了免费试用的活动,本着不用白 ...

  2. 02-面试必会-SSM框架篇

    01-什么是 Spring IOC 和 DI ? IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理.所谓的"控制反转&quo ...

  3. Tauri-Admin通用后台管理系统|tauri+vue3+pinia桌面端后台EXE

    基于tauri+vite4+pinia2跨端后台管理系统应用实例TauriAdmin. tauri-admin 基于最新跨端技术 Tauri Rust webview2 整合 Vite4 构建桌面端通 ...

  4. 图像处理_ISP_坏点矫正

    1 坏点介绍 图像坏点(Bad pixel) : 图像传感器上光线采集点(像素点)所形成的阵列存在工艺上的缺陷,或光信号进行转化为电信号的过程中出现错误,从而会造成图像上像素信息错误,导致图像中的像素 ...

  5. List子集合__小记

    List集合的子实现类的特点: ArrayList: 底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢 从线程安全问题来看:线程不安全的,不同步,执行效率高 Vector: 底层数据结构是 ...

  6. Thread 和 ThreadPool 简单梳理(C#)【并发编程系列】

    〇.前言 对于 Thread 和 ThreadPool 已经是元老级别的类了.Thread 是 C# 语言对线程对象的封装,它从 .NET 1.0 版本就有了,然后 ThreadPool 是 .Net ...

  7. 使用Hexo搭建个人博客网站

    参考CSDN上的博客.特此感谢wsmrzx.

  8. PTA 21级数据结构与算法实验6—图论

    目录 7-1 邻接矩阵表示法创建无向图 7-2 邻接表创建无向图 7-3 图深度优先遍历 7-4 单源最短路径 7-5 列出连通集 7-6 哈利·波特的考试 7-7 家庭房产 7-8 森森美图 7-9 ...

  9. Mybatis(映射器 mappers)

    MapperRegistry:注册绑定我们的Mapper文件 方式一: <!--每一个Mapper.XML都需要在Mybatis核心配置文件中注册--> <mappers> & ...

  10. linux 内核的ksm机制

    KSM(Kernel Samepage Merging),是Linux内核中的一种内存优化机制,它能够通过将多个应用程序中的相同内存页合并,实现虚拟内存的节约.KSM通过比较不同进程间的虚拟内存页,如 ...