Arduino:1-初学

[toc]

认识开发版

pinout
  • 右侧一列引脚是数字输入/输出端口,输入输出状态只有两种,0 or 1,其中 0(RX) 1(TX)端口用于和电脑进行数据传输,尽量不要使用
  • 左下角橙色端口是模拟输入 端口
  • 左上角一系列端口是电源端口, 两个GND是接地,接地端口上面两个分别提供5v3.3v的电压

入口函数

Arduino的”Main”函数其实就是setup()loop()setup函数会在开发版通电或按下复位按钮后执行一次,每次执行完成setup函数后会循环调用loop函数

1
2
3
4
5
6
7
8
9
10
11
// 给开发版通电或按下复位按钮后执行一次
void setup() {
// put your setup code here, to run once:

}

// setup完成后循环执行loop函数
void loop() {
// put your main code here, to run repeatedly:

}

点亮LED电路

第一个Arduino HelloWorld程序,操作主板上的LED_BUILTINLED灯进行闪烁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 给开发版通电或按下复位按钮后执行一次
void setup() {
// put your setup code here, to run once:
// 初始化LED_BUILTIN的数字引脚为输出模式
pinMode(LED_BUILTIN, OUTPUT);
}

// setup完成后循环执行loop函数
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
}
  • pinMode():设置引脚模式,LED_BUILTIN代表了引脚13,可以为Arduino主板自带的小LED供电,OUTPUT模式就是输出电源。

  • digitalWrite:控制LED_BUILTIN(引脚13)输出高/抵电平,以控制小灯明灭 。

    • 高电平为5伏特(不同开发版可能不同,此针对Arduino UNO)
    • 低电平为0伏特/GND
  • delay():函数,类比sleep,单位毫秒

一些基础

CleanShot 2023-09-18 at 23.46.03@2x

点亮一个LED电路,需要一个LED灯,一个电阻,一个电源,一个控制灯泡点亮的开关

LED

CleanShot 2023-09-18 at 23.59.02@2x
  • LEDLight Emitting Diode 发光二极管
  • LED需要区分正负极,只允许电流从正级流向负极,正向时LED电阻约等于0,反向时LED由巨大电阻。
  • 实体LED灯引脚,长引脚是正极,短引脚是负极。
  • LED灯珠工作电流通常约为**20毫安**
  • LED在工作时通常会产生**2伏特**左右的电压降,即LED正负极之间的电压差2伏特左右

电阻

CleanShot 2023-09-19 at 00.05.23@2x
  • 由于LED的正向电流阻值很低,如果不放置一个电阻,会短路烧毁LED和电源

面包版

CleanShot 2023-09-19 at 00.29.42@2x
  • 中间部分同一个连续行其内部连通
  • 两边部分同一列其内部连通,一般红色列接电源正极蓝色列接电源负极

外接LED

计算所需电阻大小

CleanShot 2023-09-19 at 00.16.10@2x
  • 已知LED需要有2V的电压降,接地端电压0V,故右边应该有2V的电压
  • 已知开发板引脚高电平为5V,故电阻两端的电压差应为3V
  • 已知LED的工作电流为20mA
  • 故可计算:
    • 电阻的流经电流为20mA
    • 电阻的电压为3V
    • 电阻的阻值R = U/I3V/20mA = 150Ω

点亮啦!!

找了个220Ω的电阻串联,成功点亮小灯

CleanShot 2023-09-19 at 00.41.58@2x

代码和之前点亮内部LED几乎一样,只是引脚换成了我这次插入的5号引脚

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <Arduino.h>
// 给开发版通电或按下复位按钮后执行一次
void setup() {
// put your setup code here, to run once:
// 初始化LED_BUILTIN的数字引脚为输出模式
pinMode(5, OUTPUT);
}

// setup完成后循环执行loop函数
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(5, HIGH);
}

读取输入

使用Serial库传输读取调试信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int pushButt = 2;

// 给开发版通电或按下复位按钮后执行一次
void setup() {
// put your setup code here, to run once:
// 串口通讯初始化,每秒9600位
Serial.begin(9600);
// 设置按键引脚为上拉输入模式
pinMode(pushButt, INPUT_PULLUP);
}

// setup完成后循环执行loop函数
void loop() {
// put your main code here, to run repeatedly:
// 读取引脚输入
int buttonState = digitalRead(pushButt);
// 显示按键状态
Serial.println(buttonState);
delay(10);
}

输入模式

CleanShot 2023-09-25 at 23.30.06@2x

​ 引脚切换为输入模式后,相当于给了引脚一个大阻值,此时可以通过外部电路控制引脚数值,如上图,开关打开时,引脚2接收5v电压,表现为高电平,开关闭合时候,引脚2接地,表现为低电平

​ 注意R1(10kΩ)相当于一个上拉电阻,保证开关打开时引脚2表现为低电平,开关闭合时表现为高电平,如果没有这个上拉电阻,开关闭合后5v直接接地会短路。

输入上拉模式

 还有一种模式是输入上拉模式,开启此模式后将启用Arduino自带的上拉电阻。此时只需要一端接`GND`,一端接输入引脚,则开关断开时输入引脚为`高电平`,开关闭合后输入引脚为`低电平`。
CleanShot 2023-09-25 at 23.37.31@2x

示例代码:按下按钮后内置LED点亮

1
2
3
4
5
6
7
8
9
10
11
void setup() {
// write your initialization code here
pinMode(2, INPUT_PULLUP);
pinMode(13, OUTPUT);
}

void loop() {
// write your code here
int buttonState = digitalRead(2);
digitalWrite(13, !buttonState);
}