Arduino SDK 常用函数
本文介绍了 Arduino 的常用函数,主要包含:
- 输入输出(I/O)
- 时间相关
- 串口通信
列出了用法并给出了示例。
以下内容中的 int
指代整型变量,但实际上整型变量也有所不同,例如 analogWrite()
函数的原型如下:
void analogWrite(uint8_t pin, int val);
不必深究,只需要把它当成整形变量即可。
必备函数
setup()
Arduino通电或复位后,即会开始执行 setup()
函数中的程序,该函数只会执行一次。
例子:
void setup() {
pinMode(3, OUTPUT);
for (int i = 4; i < 11; i++) {
pinMode(i, OUTPUT);
}
}
loop()
在setup() 函数中的程序执行完后,Arduino会接着会无限循环 loop()
函数。
例子:
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
main()
函数呢?
你可能会问,为什么这个C++项目没有 main()
函数呢?
实际上,实际上 main()
函数存在于Arduino核心库中,且仍然是程序的入口。
我们翻看一下 Arduino 核心库的 main.cpp 就可以看到:
#include <Arduino.h>
int atexit(void (*)()) { return 0; } //这表示参数为一个指向 无参数无返回值 的函数的指针
void initVariant() __attribute__((weak));
void initVariant() { }
void setupUSB() __attribute__((weak));
void setupUSB() { }
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
由上可见,对于一个 Arduino 项目,必须包含 setup()
和 loop()
,而不能包含 main()
输入输出
pinMode(pin, mode)
在使用引脚前,需要先定义引脚的模式(读或写)
参数
int pin
指定的引脚编号,如: 10
, A0
等。
int mode
共三种模式:
INPUT
输入模式
OUTPUT
输出模式
INPUT_PULLUP
输入上拉模式,也就是启动板载电阻,使该引脚可以直 接连接 5V 电压而不需要在之间另加电阻,但不能接负电位,不能接大于 5V 的电压。
示例
pinMode(3, OUTPUT); // 设置 3 号引脚为输出模式
pinMode(4, INPUT); // 设置 4 号引脚为输入模式
pinMode(5, INPUT_PULLUP); // 设置 5 号引脚为输入上拉模式
digitalWrite(pin, value)
设置指定引脚的电位,在此之前要保证该引脚已经 pinMode
过,且为输出模式。
参数
int pin
指定的引脚编号。
int value
可以为以下两者之一:
HIGH
高电平
LOW
低电平
例子
digitalWrite(3, HIGH); // 设置 3 号引脚为 高电平
digitalWrite(4, LOW); // 设置 4 号引脚为 低电平
digitalRead(pin)
读取指定引脚的电位,在此之前要保证该引脚已经 pinMode
过,且为输入模式
参数
int pin
指定的引脚编号。
返回值
int
指定的引脚的电位,为以下两者之一:
HIGH
高电平
LOW
低电平
例子
// 假设 4 号引脚连接的是 高电平
int state = digitalRead(4);
// state = HIGH; 也就是 stats = 1;
analogWrite(pin, value)
设定指定引脚的电位,在此之前要保证该引脚已经 pinMode
过,且为输出模式
此外,还要保证该引脚支持模拟输出,也就是引脚旁边有一个波浪线。
参数
int pin
指定的引脚编号。
int value
指定电位的值,范围为 0~255
,从 0V 到 5V 成比例对应。
示例
analogWrite(3, 0); // 设置 3 号引脚为 0V
analogWrite(3, 255); // 设置 3 号引脚为 5V
analogWrite(3, 233); // 设置 3 号引脚为 (5 * 233 / 255)V
analogRead()
读取指定引脚的电位,在此之前要保证该引脚已经 pinMode
过,且为输入模式
此外,还要保证该引脚支持模拟输入,在 Arduino Uno 里支持模拟输入的只有: A0
, A1
, A2
,A3
, A4
, A5
六个。
参数
int pin
指定的引脚编号。
返回值
int
指定的引脚的电位,范围: 0~1023
,从 0V 到 5V 成比例对应。
例子
// 假设 4 号引脚连接的是 3V
int state = analogRead(4);
// state = 3 * 1023 / 5;
时间
delay(ms)
程序停止一段时间
参数
unsigned long ms
延时的时间,单位为毫秒
示例
delay(500); // 延时 0.5 秒
delayMicroseconds(us)
参数
unsigned int us
延时的时间,单位为微秒
示例
delayMicrosecond(300); // 延时 0.0003 秒
millis()
返回值
unsigned long
Arduino通电后或复位后到现在的时间,单位毫秒
示例
long time = millis();
micros()
返回值
unsigned long
Arduino通电后或复位后到现在的时间,单位毫秒
示例
long time = micros();
串口通信:Serial
类
Serial.begin()
该函数有两个重载,
-
Serial.begin(speed)
-
参数:
-
speed
串口通信波特率,一般为9600,可以为:
300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200
-
Serial.begin(speed, config)
-
参数
-
speed
同上 -
config
配置信息,具体如下表:
可选配置 | 数据位 | 校验位 | 停止位 |
---|---|---|---|
SERIAL_5N1 | 5 | 无 | 1 |
SERIAL_6N1 | 6 | 无 | 1 |
SERIAL_7N1 | 7 | 无 | 1 |
SERIAL_8N1(默认配置) | 8 | 无 | 1 |
SERIAL_5N2 | 5 | 无 | 2 |
SERIAL_6N2 | 6 | 无 | 2 |
SERIAL_7N2 | 7 | 无 | 2 |
SERIAL_8N2 | 8 | 无 | 2 |
SERIAL_5E1 | 5 | 偶 | 1 |
SERIAL_6E1 | 6 | 偶 | 1 |
SERIAL_7E1 | 7 | 偶 | 1 |
SERIAL_8E1 | 8 | 偶 | 1 |
SERIAL_5E2 | 5 | 偶 | 2 |
SERIAL_6E2 | 6 | 偶 | 2 |
SERIAL_7E2 | 7 | 偶 | 2 |
SERIAL_8E2 | 8 | 偶 | 2 |
SERIAL_5O1 | 5 | 奇 | 1 |
SERIAL_6O1 | 6 | 奇 | 1 |
SERIAL_7O1 | 7 | 奇 | 1 |
SERIAL_8O1 | 8 | 奇 | 1 |
SERIAL_5O2 | 5 | 奇 | 2 |
SERIAL_6O2 | 6 | 奇 | 2 |
SERIAL_7O2 | 7 | 奇 | 2 |
SERIAL_8O2 | 8 | 奇 | 2 |
Serial.end()
结束串口通信。释放该串口所在的数字引脚,使得其可以作为普通数字引脚使用。
Serial.print()
与 Serial.println()
向串口写入数据,有许多重载
至于两者区别相信学过Java的都知道,Serial.println()
在输出数据的同时换行。
Serial.read()
接收串口数据
返回值
int
返回从串口接收的数据,也就是依次接收 ASCII 字符,每次一个比特。
Serial.available()
获取串口接收到的除去已经读取的数据的个数,也就是缓冲区的数据个数,缓冲区最多可保存64 bytes的数据。
返回值
int
缓冲区的数据的比特数,0~64