很多刚接触Arduino的同学可能不太清楚Arduino的编程方法和代码运行的流程,所以这一讲我简单介绍一下。Arduino为了降低编程的难度把很多常用的函数都做了封装,很多常用的一些传感器和外设也有相关的类库,而且除了官方的库,也有很多第三方的库可用,开发者只需要根据自己的实际需要添加库调用API即可,这对于项目初期验证方案来说很方便。
一、Arduino项目最基本的函数
不管是什么程序,都会有一个程序的入口,比如传统C/C++程序,它的入口就是main函数,但是在Arduino项目中我们并没有看到这个函数,那Arduino的程序是从哪里开始运行的呢?
实际上Arduino的程序入口也是main函数,只不过它是封装在Arduino核心库中的,我们看不到而已,为了简化开发的流程,Arduino只给出了setup() 函数和loop()函数,而这两个函数实际上是在main函数里面被调用执行的。下面我们来具体讲解一下这两个函数的作用。
1、setup() 函数
Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。
通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。
2、loop()函数
在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。
通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。
二、Arduino常用的功能函数
1、GPIO
1)在使用输入或输出功能前,需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式。
pinMode(pin, mode)
参数 | 说明 |
---|---|
pin | 指定配置的引脚编号 |
mode | 指定的配置模式。通常可用模式有三种, INPUT:输入模式,OUTPUT:输出模式,INPUT_PULLUP :输入上拉模式 |
2)让某个引脚输出高电平或者是低电平。
digitalWrite(pin, value)
参数 | 说明 |
---|---|
pin | 指定配置的引脚编号 |
value | 指定输出的电平。HIGH:输出高电平,LOW:输出低电平 |
3)读取某个引脚的电平状态,返回值为获取到的信号状态,1为高电平,0为低电平。
digitalRead(pin)
参数 | 说明 |
---|---|
pin | 指定配置的引脚编号 |
2、外部中断
1)对中断引脚进行初始化配置,以开启Arduino的外部中断功能。
attachInterrupt(pin, ISR, mode)
参数 | 说明 |
---|---|
pin | 指定配置的引脚编号 |
ISR | 中断服务函数名,该函数由用户自己定义 |
mode | 中断模式,HIGH:上升沿触发、LOW:下降沿触发 |
示例:
attachInterrupt(2, Hello, LOW); 该语句会开启Arduino Uno的 2号引脚(中断编号0)的外部中断功能,并指定下降沿时触发该中断。Hello() 函数是自己定义的一个函数,函数里面执行什么也是根据自己的需要来写。
当2号引脚上电平由高变低后,该中断会被触发,Arduino即会运行Hello() 函数中的语句。
2)中断分离函数,可以对已经配置了中断的引脚关闭中断功能。
detachInterrupt(pin)
参数 | 说明 |
---|---|
pin | 指定配置的引脚编号 |
3、时钟相关
1)获取Arduino通电后(或复位后)到现在的时间。返回值为系统运行时间,单位毫秒ms。
millis()
2)获取Arduino通电后(或复位后)到现在的时间。返回值为系统运行时间,单位微秒us。
micros()
3)毫秒级延时。
delay(ms)
参数 | 说明 |
---|---|
ms | 延时时间,类型unsigned long |
4)微秒级延时。
delayMicroseconds(us)
参数 | 说明 |
---|---|
us | 延时时间,类型unsigned int |
4、串口
1)使用串口与计算机通信,需要先使用Serial.begin() 初始化Arduino的串口通信功能。
Serial.begin(speed, config)
参数 | 说明 |
---|---|
speed | 串口通信波特率,常用波特率:300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200 |
config | 数据位、校验位、停止位配置(也可以不配置) |
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.begin(9600, SERIAL_8E2) 是将串口波特率设为9600,数据位8,偶校验,停止位2。
提示:Serial.begin函数也可以只配置波特率,如:Serial.begin(9600)
2)串口打印输出。
Serial.print(val)
参数 | 说明 |
---|---|
val | 要输出的数据,各种类型的数据均可 |
3)在输出完指定数据后,再输出一组回车换行符。
Serial.println(val)
参数 | 说明 |
---|---|
val | 要输出的数据,各种类型的数据均可 |
4)接收串口数据。调用该语句,每次都会返回一个字节的数据,这个返回值便是当前串口读取到的数据。
Serial.read()
提示:以上几个是串口最常用最基础的函数,还有很多函数和用法这里没有介绍,感兴趣的同学可以自己去查阅。
5、PWM
1)PWM输出功能。
在Arduino Uno中,提供PWM功能的引脚为3、5、6、9、10、11。
analogWrite(pin,value)
参数 | 说明 |
---|---|
pin | 要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚 |
value | PWM的脉冲宽度,范围为0~255 |
提示:在analogWrite() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。
6、ADC
1)ADC输入功能。
模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。
Arduino Uno模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示。
analogRead(pin)
参数 | 说明 |
---|---|
pin | 要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚 |
提示:在analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作。
示例:analogRead(A0),即是读取A0引脚上的模拟值。
三、结束语
好了,关于Arduino编程基础的介绍就讲到这里,常用的函数我这里只是列举了一部分,需要用到其他函数的话你们自行查阅。如果还有什么问题,欢迎在评论区留言。如果这篇文章能够帮到你,就给我点个赞吧,如果想了解更多Arduino的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。