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

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

一、关于按键开关

按键开关如上图【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. 基于uniapp+vite4+vue3搭建跨端项目|uni-app+uview-plus模板

    最近得空学习了下uniapp结合vue3搭建跨端项目.之前也有使用uniapp开发过几款聊天/仿抖音/后台管理等项目,但都是基于vue2开发.随着vite.js破局出圈,越来越多的项目偏向于vue3开 ...

  2. 用AI技术实现自动化的社交媒体广告投放,提高广告效果和收益

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 随着社交媒体的普及,广告投放已经成为了广告行业的重要一环.在过去的几年中,社交媒体广告投放的效果和收益都得到了显著提高,但同时也存在着一些 ...

  3. [ARM 汇编]高级部分—ARM汇编编程实战—3.3.1 嵌入式系统的基本概念

    嵌入式系统是一种特殊的计算机系统,通常用于执行特定的任务.它通常包含一个或多个微处理器.存储器和外围设备.与通用计算机系统相比,嵌入式系统具有体积小.功耗低.成本低和实时性强等特点.在这一部分,我们将 ...

  4. PHP生成随机中文姓名

    <?phpfunction &xingming(){ for ($i = 0; $i < 1; $i++) { $xing = "赵,钱,孙,李,周,吴,郑,王,冯,陈, ...

  5. python笔记:第二章基本数据类型

    基本数据类型 Python中的数据类型可以分为五大类:字符串.数字.容器.布尔.None 1.字符串 可以使用单引号或双引号创建字符串,可以用加号将两个字符串合并 name = '小明' age = ...

  6. 私网部署DNS(BIND)笔记

    准备工作 下载 yum install -y bind bind-utils包含dig.nslookup等调试命令,非必须. yum install -y bind-utils 防火墙 firewal ...

  7. Matlab2021a打包jar包问题(linux、windows)

    都有chatgpt了,实在不想写博客....不过还是记录一下问题吧. 我们在用matlab打包jar包的时候,经常会出现打包出错的问题,但无非注意以下几点就行了: 1.打包方式 这个还是很简单的,而且 ...

  8. 【游记】NOI 2023省选游记

    Day -N 下午去机房训练,回去的时候邱大大说 "我\(,lj,szy\) 可以去参加 NOI 2023省选".我瞬间就惊了.作为一个 \(CSP-S\) 只有 \(91pts\ ...

  9. js 文字像打字一样缓缓出现

    点击查看代码 <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UT ...

  10. [jmeter]简介与安装

    简介 JMeter是开源软件Apache基金会下的一个性能测试工具,用来测试部署在服务器端的应用程序的性能. 安装 安装jmeter 从 官网 下载jmeter的压缩包 安装jdk并配置 JAVA_H ...