认识开关

image-20210208172750156

按键开关,就是如上图所示的短暂原件,按下接通,松开断开。

他的内部结构如图所示,

abcd 对应分别是图1 从左上角开始 逆时针的脚. 他们的规律是 相连不同侧,同侧不相连。

我们按下 ,不同侧不相连。我们按下和没有按下,可以作为数字信号传递给arduino.

当arduino 的引脚设定为 INPUT模式下 可以识别两种状态, HIGH(高电平),LOW(低电平)。

上拉电阻

image-20210208182101141

R1 电阻就是所谓的上拉电阻.

注意上拉电阻其实在这里没有什么分压的作用,而是限流 。等下我会详细的说明。

其实这个问题还比较发杂,我感觉的解释还不够准备,可能会涉及一点三极管的知识,所以我就记录一些我浅显的理解。

简单的理解

但是我们可以就从表面现象触发从表面详细出发。

当 引脚2设置为输入(INPUT)模式时,引脚2为高阻抗状态(100兆欧)

其实此时arduino内部,引脚2也会和接地相连,但是电阻很大,我们可以把引脚2和接地 以及内部相连的那一部分看成一个电压表

  • 当开关没有闭合的时候,电压表测得就是 整个电源的电压,电路图可以理解成这样,那是 引脚2收到高电平
image-20210208191253096
  • 当开关闭合的时候, 电压表测得就是 接地到 引脚2那段导线的电压。所以引脚2收到的是低电平。

    image-20210208192041988

刚开始理解的时候,我很是不明白 R1有啥作用,现在看来 R1就是不让 引脚2引脚悬空和限流,防止 arduino挂。

  • 当开关闭合的时候,如果没有电阻R1 ,那么+v5 和GND相接 ,arduino就挂了
  • 当开关断开的时候,如果没有电阻 R1,那么 引脚2 没有接入任何电路,所以引脚2读取到状态是随机,这样的状态叫引脚悬空。

程序验证

int pushButton = 2;

void setup() {
  // 窗口通信初始化,每秒 9600位
  Serial.begin(9600);
  // 把pushButton 改成输入模式
  pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // 读出按键状态
  int buttonState = digitalRead(pushButton);
  // 输出状态到到监视器
  Serial.println(buttonState);
  delay(1);
}

这里遇到了我们从来没有用过的Serial(串行通信),

串口通信Serial

个人电脑可以通过USB端口与Arduino的引脚0(RX)和引脚1(TX) 进行通信。所以当Arduino的引脚0和引脚1用于串行通信功能时,Arduino的引脚0和引脚1是不能做其他用的。你也可以通过Arduino开发环境软件中的串口监视器来与Arduino 控制器进行串口通信,你只需要点击Arduino IDE软件中的“串口监视器”按钮(如下图所示)就可以打开串口监视器。

本次遇到的方法有2

Serial.begin()

设置电脑与Arduino进行串口通讯时的数据传输速率(每秒传输字节数)。可使用以下速率:300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200

Serial.println();

以人类可读的ASCII码形式向串口发送数据.

Serial.println(val)
Serial.println(val, format)

参数:

val: 要发送的数据(任何数据类型)
format: 指定数字的数据形式或小数的位数(用于浮点数)。

返回值:

返回发送的数据的字节数。

结果

连接图如下:

串口监视器

按下0,不按下1.

验证

输入上拉模式

arduino内部自带上拉电阻,所以我们要完成上面的操作,完全就可以把引脚设置成 输入上拉模式(INPUT_PULLUP)。

pinMode(pin,INPUT_PULLUP);

使用按钮控制LED
程序
boolean pushButton;
void setup() {
  // put your setup code here, to run once: 
  Serial.begin(9600);
  pinMode(2,INPUT_PULLUP);
//  控制13号引脚的led
  pinMode(13,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
//  读取引脚2的状态
  pushButton= digitalRead(2);
  Serial.println(pushButton);
  if(pushButton)//如果按钮按没有按下 那么熄灭LED
    digitalWrite(13,LOW);
  else
    digitalWrite(13,HIGH);
}
连接图

由于内部自带上拉电阻,所以我们完全不需要外界电阻,也就是不要了上面的这部分电路

image-20210208203520270

实际为:

image-20210208205103321

努力成长的程序员