Arduino核心库常用函数

Arduino核心库常用函数

二月 27, 2021

注意!以下内容中的 int 指代整型变量,但实际上整型变量也有所不同,例如 analogWrite() 函数的原型如下:

1
void analogWrite(uint8_t pin, int val);

不必深究,只需要把它当成整形变量即可。

必备函数

setup()

Arduino通电或复位后,即会开始执行 setup() 函数中的程序,该函数只会执行一次。

例子:

1
2
3
4
5
6
7
void setup() {
pinMode(3, OUTPUT);

for (int i = 4; i < 11; i++) {
pinMode(i, OUTPUT);
}
}

loop()

在setup() 函数中的程序执行完后,Arduino会接着会无限循环 loop() 函数。

例子:

1
2
3
4
5
6
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}

main()函数呢?

你可能会问,为什么这个C++项目没有 main() 函数呢?

实际上,实际上 main() 函数存在于Arduino核心库中,且仍然是程序的入口。

我们翻看一下 Arduino 核心库的 main.cpp 就可以看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#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 的电压。

示例

1
2
3
pinMode(3, OUTPUT);       // 设置 3 号引脚为输出模式
pinMode(4, INPUT); // 设置 4 号引脚为输入模式
pinMode(5, INPUT_PULLUP); // 设置 5 号引脚为输入上拉模式

digitalWrite(pin, value)

设置指定引脚的电位,在此之前要保证该引脚已经 pinMode 过,且为输出模式。

参数

  • int pin

    指定的引脚编号。

  • int value

    可以为以下两者之一:

    • HIGH

      高电平

    • LOW

      低电平

例子

1
2
digitalWrite(3, HIGH); // 设置 3 号引脚为 高电平
digitalWrite(4, LOW); // 设置 4 号引脚为 低电平

digitalRead(pin)

读取指定引脚的电位,在此之前要保证该引脚已经 pinMode 过,且为输入模式

参数

  • int pin

    指定的引脚编号。

返回值

  • int

    指定的引脚的电位,为以下两者之一:

    • HIGH

      高电平

    • LOW

      低电平

例子

1
2
3
// 假设 4 号引脚连接的是 高电平
int state = digitalRead(4);
// state = HIGH; 也就是 stats = 1;

analogWrite(pin, value)

设定指定引脚的电位,在此之前要保证该引脚已经 pinMode 过,且为输出模式

此外,还要保证该引脚支持模拟输出,也就是引脚旁边有一个波浪线。

参数

  • int pin

    指定的引脚编号。

  • int value

    指定电位的值,范围为 0~255 ,从 0V 到 5V 成比例对应。

示例

1
2
3
analogWrite(3, 0);   // 设置 3 号引脚为 0V
analogWrite(3, 255); // 设置 3 号引脚为 5V
analogWrite(3, 233); // 设置 3 号引脚为 (5 * 233 / 255)V

analogRead()

读取指定引脚的电位,在此之前要保证该引脚已经 pinMode 过,且为输入模式

此外,还要保证该引脚支持模拟输入,在 Arduino Uno 里支持模拟输入的只有: A0A1A2A3A4A5 六个。

参数

  • int pin

    指定的引脚编号。

返回值

  • int

    指定的引脚的电位,范围: 0~1023 ,从 0V 到 5V 成比例对应。

例子

1
2
3
// 假设 4 号引脚连接的是 3V
int state = analogRead(4);
// state = 3 * 1023 / 5;

时间

delay(ms)

程序停止一段时间

参数

  • unsigned long ms

    延时的时间,单位为毫秒

示例

1
delay(500); // 延时 0.5 秒

delayMicroseconds(us)

参数

  • unsigned int us

    延时的时间,单位为微秒

示例

1
delayMicrosecond(300); // 延时 0.0003 秒

millis()

返回值

  • unsigned long

    Arduino通电后或复位后到现在的时间,单位毫秒

示例

1
long time = millis();

micros()

返回值

  • unsigned long

    Arduino通电后或复位后到现在的时间,单位毫秒

示例

1
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