Arduino程序结构
包括两个主要函数:
- void setup(){}
程序运行时会调用一次setup函数,主要用于初始化变量和设置引脚工作模式等。 - void loop(){}
相当于死循环while(1){}。
当然,可以自定义函数,并在以上两个函数中被调用。注意,setup函数和loop函数是必不可少的。
数据类型
byte:一个字节,存储一个8位无符号数。
word:在Uno和其他基于ATMEGA板上,存储一个16位无符号数;而在Due和Zero上,存储一个32位无符号数。
array:并非数据类型,只是表示支持数组。
字符串对象(String):可以像普通变量一样被创建并分配一个值或字符串。赋值运算符不能用于字符数组,但能用于String对象。主要缺点是,会占用大量的内存。
时间函数
- delay()函数,以毫秒为单位,阻塞延时。
- delayMicroseconds()函数,以微秒为单位,阻塞延时。
- millis()函数,以毫秒为单位,返回从Arduino板上电开始计时的时间。
- micros()函数,以微秒为单位,返回从Arduino板上电开始计时的时间。
I/O函数
Arduino引脚默认为输入模式,呈现高阻抗状态。可通过pinMode()函数设置引脚为INPUT_PULLUP,使能上拉电阻,则空闲状态下,引脚电平为高电平。上拉电阻能提供足够的电流驱动LED灯变亮。
当设置引脚为输出模式时,将呈现低阻抗状态。
pinMode()函数
函数原型:pinMode(pin, mode)。可将指定引脚设置为输入或输出模式。使用INPUT_PULLUP模式启动内部上拉电阻,而INPUT模式禁止内部上拉。
digitalWrite()函数
函数原型:digitalWrite(pin, value)。可向指定的数字引脚写入HIGH或LOW值。若将某个引脚设置为INPUT模式时,调用digitalWrite()函数可启动(HIGH)或禁止(LOW)该引脚的内部上拉电阻。
digitalRead()函数
函数原型:digitalRead(pin)。可读取指定数字引脚的电平。
analogWrite()函数
函数原型:analogWrite(pin, value)。用于向指定引脚输出一定占空比的PWM波。value:0~255(导通-关断)。在大多数Arduino板上,此功能近支持数字引脚3,5,6,9,10和11,即带有 “~” 的数字引脚。
analogRead()函数
函数原型:analogRead(pin)。可读取指定模拟引脚的电压大小,返回相应的AD值(0~1023),对应于0~5V。
analogReference()函数
函数原型:analogReference(type)。
type可取:
- DEFAULT
默认5或3.3V的模拟参考值 - INTERNAL(不适用于Arduino Mega)
内置参考,在ATmega168或ATmega328上等于1.1V,而在ATmega8上等于2.56V - INTERNAL1V1(适用于Arduino Mega)
内置参考1.1V - INTERNAL2V56(适用于Arduino Mega)
内置参考2.56V - EXTERNAL
参考值为外部施加到AREF引脚的电压大小(限0到5V内的电压)
字符函数
随机数
randomSeed()函数
函数原型:randomSeed(seed)。伪随机数生成器,本质上生成的数是随机分布的,但其顺序是可预测的,即会循环出现。用例:randomSeed(analogRead(5)); //拾取模拟引脚5(未使用)的随机噪音,返回其AD值。
random()函数
函数原型:
- long random(max)。返回一个范围为0到max之间的随机数。
- long random(min, max)。返回一个范围为min到max之间的随机数。
中断
- 硬件中断:大多数Arduino设计有两个硬件中断,其相应引脚为数字引脚2和3。
- 软件中断:Arduino支持的是attachInterrupt()函数,其函数原型为:attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
或attachInterrupt(pin, ISR, mode),仅支持Arduino Due, Zero板。
其中,ISR即指定中断处理函数。
mode的取值:
1)LOW:低电平触发
2)CHANGE:跳变沿触发
3)FALLING:下降沿触发
Arduino通信
UART
- 串口初始化设置:Serial.begin(baund)。设置波特率。
- 串口发送数据:Serial.print(data)或Serial.println(data) 、Serial.write(data)。
- 串口接收数据:Serial.read()。
I2C
使用SDA(数据)和SCL(时钟)引脚。需要使用到Wire库,即程序中需要包含Wire.h头文件。
发送(主机)
- 初始化,设置为主机:Wire.begin()。
- 启动,指定I2C从设备地址:Wire.beginTransmission(addr)。
- 数据缓存:Wire.write(value)。采用队列缓存数据。
- 传输数据,然后关闭:Wire.endTransmission()。
- 数据请求:Wire.requestFrom(addr, bytes)。向指定地址的从机请求一定字节数的数据。
- 数据请求的应答:Wire.onRequest(func)。接收到数据请求时,调用指定的函数进行处理。
接收(从机)
- 初始化,设置为从机,并指定地址:Wire.begin(addr)。
- 指定接收数据处理函数:Wire.onReceive(func)。
- 监测是否有数据:Wire.available()。
- 接收I2C总线上的数据:Wire.read()。
SPI
串行外设接口(SPI)总线可用于串行通信,全双工。使用SCK(时钟)、MOSI(主出从入)和MISO(主入从出)。需要用到SPI库,即程序中要包含SPI.h头文件。
- 初始化:SPI.begin()。