跳到主要内容

Arduino SDK 常用函数

· 阅读需 8 分钟
Skyone
科技爱好者

本文介绍了 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 里支持模拟输入的只有: A0A1A2A3A4A5 六个。

参数

  • 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_5N151
SERIAL_6N161
SERIAL_7N171
SERIAL_8N1(默认配置)81
SERIAL_5N252
SERIAL_6N262
SERIAL_7N272
SERIAL_8N282
SERIAL_5E151
SERIAL_6E161
SERIAL_7E171
SERIAL_8E181
SERIAL_5E252
SERIAL_6E262
SERIAL_7E272
SERIAL_8E282
SERIAL_5O151
SERIAL_6O161
SERIAL_7O171
SERIAL_8O181
SERIAL_5O252
SERIAL_6O262
SERIAL_7O272
SERIAL_8O282

Serial.end()

结束串口通信。释放该串口所在的数字引脚,使得其可以作为普通数字引脚使用。

Serial.print()Serial.println()

向串口写入数据,有许多重载

至于两者区别相信学过Java的都知道,Serial.println() 在输出数据的同时换行。

Serial.read()

接收串口数据

返回值

  • int

返回从串口接收的数据,也就是依次接收 ASCII 字符,每次一个比特。

Serial.available()

获取串口接收到的除去已经读取的数据的个数,也就是缓冲区的数据个数,缓冲区最多可保存64 bytes的数据。

返回值

  • int

缓冲区的数据的比特数,0~64