Arduino 语法手册——函数部分

函数部分

十五、数字 I/O

15.1 pinMode()

描述

将指定的引脚配置成输出或输入。详情请见digital pins。

语法

pinMode(pin, mode)

参数

pin:要设置模式的引脚

mode:INPUT或OUTPUT

返回

例子

ledPin = 13 // LED连接到数字脚13

void setup()

{

pinMode(ledPin,OUTPUT); //设置数字脚为输出

}

void loop()

{

digitalWrite(ledPin,HIGH); //点亮LED

delay(1000); // 等待一秒

digitalWrite(ledPin, LOW); // 灭掉LED

延迟(1000); //等待第二个

}

注意

模拟输入脚也能当做数字脚使用,参见A0,A1等

15.2 digitalWrite()

描述

给一个数字引脚写入HIGH或者LOW。

如果一个引脚已经使用pinMode()配置为OUTPUT模式,其电压将被设置为相应的值,HIGH为5V(3.3V控制板上为3.3V),LOW为0V。

如果引脚配置为INPUT模式,使用digitalWrite()写入HIGH值,将使内部20K上拉电阻(详见数字引脚教程)。写入LOW将会禁用上拉。上拉电阻可以点亮一个LED让其微微亮,如果LED工作,但是亮度很低,可能是因为这个原因引起的。补救的办法是 使用pinMode()函数设置为输出引脚。

注意:数字13号引脚难以作为数字输入使用,因为大部分的控制板上使用了一颗LED与一个电阻连接到他。如果启动了内部的20K上拉电阻,他的电压将在1.7V左右,而不是正常的5V,因为板载LED串联的电阻把他使他降了下来,这意味着他返回的值总是LOW。如果必须使用数字13号引脚的输入模式,需要使用外部上拉下拉电阻。

语法

digitalWrite(pin, value)

参数

pin: 引脚编号(如1,5,10,A0,A3)

value: HIGH or LOW

返回

例子

int ledPin = 13; // LED连接到数字13号端口

void setup()

{

pinMode(ledPin, OUTPUT); // 设置数字端口为输入模式

}

void loop()

{

digitalWrite(ledPin, HIGH); // 使LED亮

delay(1000); // 延迟一秒

digitalWrite(ledPin, LOW); // 使LED灭

delay(1000); // 延迟一秒

}

13号端口设置为高电平,延迟一秒,然后设置为低电平。

注释

模拟引脚也可以当做数字引脚使用,使用方法是输入端口A0,A1,A2等。

15.3 digitalRead()

描述

读取指定引脚的值,HIGH或LOW。

语法

digitalRead(PIN)

参数

pin:你想读取的引脚号(int)

返回

HIGH 或 LOW

例子

ledPin = 13 // LED连接到13脚

int inPin = 7; // 按钮连接到数字引脚7

int val = 0; //定义变量存以储读值

void setup()

{

pinMode(ledPin, OUTPUT); // 将13脚设置为输出

pinMode(inPin, INPUT); // 将7脚设置为输入

}

void loop()

{

val = digitalRead(inPin); // 读取输入脚

digitalWrite(ledPin, val); //将LED值设置为按钮的值

}

将13脚设置为输入脚7脚的值。

注意

如果引脚悬空,digitalRead()会返回HIGH或LOW(随机变化)。

模拟输入脚能当做数字脚使用,参见A0,A1等。

十六、模拟 I/O

16.1 analogReference()

描述

配置用于模拟输入的基准电压(即输入范围的最大值)。选项:

DEFAULT:默认5V(Arduino板为5V)或3.3伏特(Arduino板为3.3V)为基准电压。

INTERNAL:在ATmega168和ATmega328上以1.1V为基准电压,以及在ATmega8上以2.56V为基准电压(Arduino Mega无此选项)

INTERNAL1V1:以1.1V为基准电压(此选项仅针对Arduino Mega)

INTERNAL2V56:以2.56V为基准电压(此选项仅针对Arduino Mega)

EXTERNAL:以AREF引脚(0至5V)的电压作为基准电压。

参数

type:使用哪种参考类型(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL)。

返回

注意事项

改变基准电压后,之前从analogRead()读取的数据可能不准确。

警告

不要在AREF引脚上使用使用任何小于0V或超过5V的外部电压。如果你使用AREF引脚上的电压作为基准电压,你在调用analogRead()前必须设置参考类型为EXTERNAL。否则,你将会削短有效的基准电压(内部产生)和AREF引脚,这可能会损坏您Arduino板上的单片机。

另外,您可以在外部基准电压和AREF引脚之间连接一个5K电阻,使你可以在外部和内部基准电压之间切换。请注意,总阻值将会发生改变,因为AREF引脚内部有一个32K电阻。这两个电阻都有分压作用。所以,例如,如果输入2.5V的电压,最终在在AREF引脚上的电压将为2.5 * 32 /(32 + 5)= 2.2V。

16.2 analogRead()

描述

从指定的模拟引脚读取数据值。 Arduino板包含一个6通道(Mini和Nano有8个通道,Mega有16个通道),10位模拟数字转换器。这意味着它将0至5伏特之间的输入电压映射到0至1023之间的整数值。这将产生读数之间的关系:5伏特/ 1024单位,或0.0049伏特(4.9 mV)每单位。输入范围和精度可以使用analogReference()改变。 它需要大约100微秒(0.0001)来读取模拟输入,所以最大的阅读速度是每秒10000次。

语法

analogRead(PIN)

数值的读取

引脚:从输入引脚(大部分板子从0到5,Mini和Nano从0到7,Mega从0到15)读取数值

返回

从0到1023的整数值

注意事项

如果模拟输入引脚没有连入电路,由analogRead()返回的值将根据多项因素(例如其他模拟输入引脚,你的手靠近板子等)产生波动。

例子

int analogPin = 3; //电位器(中间的引脚)连接到模拟输入引脚3

//另外两个引脚分别接地和+5 V

int val = 0; //定义变量来存储读取的数值

void setup()

{

serial.begin(9600); //设置波特率(9600)

}

void loop()

{

val = analogRead(analogPin); //从输入引脚读取数值

serial.println(val); //显示读取的数值

}

16.3 analogWrite() PWM

描述

从一个引脚输出模拟值(PWM)。可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。analogWrite()输出结束后,该引脚将产生一个稳定的特殊占空比方波,直到下次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。PWM信号的频率大约是490赫兹。

在大多数arduino板(ATmega168或ATmega328),只有引脚3,5,6,9,10和11可以实现该功能。在aduino Mega上,引脚2到13可以实现该功能。老的Arduino板(ATmega8)的只有引脚9、10、11可以使用analogWrite()。在使用analogWrite()前,你不需要调用pinMode()来设置引脚为输出引脚。

analogWrite函数与模拟引脚、analogRead函数没有直接关系。

语法

analogWrite(pin,value)

参数

pin:用于输入数值的引脚。

value:占空比:0(完全关闭)到255(完全打开)之间。

返回

说明和已知问题

引脚5和6的PWM输出将高于预期的占空比(输出的数值偏高)。这是因为millis()和delay()功能,和PWM输出共享相同的内部定时器。这将导致大多时候处于低占空比状态(如:0 - 10),并可能导致在数值为0时,没有完全关闭引脚5和6。

例子

通过读取电位器的阻值控制LED的亮度

int ledPin = 9; // LED连接到数字引脚9

int analogPin = 3; //电位器连接到模拟引脚3

int val = 0; //定义变量存以储读值

void setup()

{

pinMode(ledPin,OUTPUT); //设置引脚为输出引脚

}

void loop()

{

val = analogRead(analogPin); //从输入引脚读取数值

analogWrite(ledPin,val / 4); // 以val / 4的数值点亮LED(因为analogRead读取的数值从0到1023,而analogWrite输出的数值从0到255)

}

十七、高级 I/O

17.1 tone()

描述

在一个引脚上产生一个特定频率的方波(50%占空比)。持续时间可以设定,否则波形会一直产生直到调用noTone()函数。该引脚可以连接压电蜂鸣器或其他喇叭播放声音。

在同一时刻只能产生一个声音。如果一个引脚已经在播放音乐,那调用tone()将不会有任何效果。如果音乐在同一个引脚上播放,它会自动调整频率。

使用tone()函数会与3脚和11脚的PWM产生干扰(Mega板除外)。

注意:如果你要在多个引脚上产生不同的音调,你要在对下一个引脚使用tone()函数前对此引脚调用noTone()函数。

语法

tone(pin, frequency)

tone(pin, frequency, duration)

参数

pin:要产生声音的引脚

frequency: 产生声音的频率,单位Hz,类型unsigned int

duration:声音持续的时间,单位毫秒(可选),类型unsigned long

17.2 noTone()

描述

停止由tone()产生的方波。如果没有使用tone()将不会有效果。

注意:如果你想在多个引脚上产生不同的声音,你要在对下个引脚使用tone()前对刚才的引脚调用noTone().

语法

noTone(pin)

参数

pin: 所要停止产生声音的引脚

17.3 shiftOut()

描述

将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。

注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。

注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。

语法

shiftOut(dataPin, clockPin, bitOrder, value)

参数

dataPin:输出每一位数据的引脚(int)

clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)

bitOrder:输出位的顺序,最高位优先或最低位优先

value: 要移位输出的数据(byte)

返回

注意

dataPin和clockPin要用pinMode()配置为输出。 shiftOut目前只能输出1个字节(8位),所以如果输出值大于255需要分两步。

//最高有效位优先串行输出

int 数据= 500;

//移位输出高字节

shiftOut(dataPin, clock, MSBFIRST, (data >> 8));

//移位输出低字节

shiftOut(data, clock, MSBFIRST, data);

//最低有效位优先串行输出

data = 500;

//移位输出低字节

shiftOut(dataPin, clock, LSBFIRST, data);

//移位输出高字节

shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

例子

相应电路,查看tutorial on controlling a 74HC595 shift register

// ************************************************ ************** //

// Name : shiftOut代码, Hello World //

// Author : Carlyn Maw,Tom Igoe //

// Date : 25 Oct, 2006 //

// 版本 : 1.0 //

// 注释:使用74HC595移位寄存器从0到255计数 //

//

// ************************************************ ****************

//引脚连接到74HC595的ST_CP

int latchPin = 8;

//引脚连接到74HC595的SH_CP

int clockPin = 12;

// //引脚连接到74HC595的DS

int dataPin = 11;

void setup() {

//设置引脚为输出

pinMode(latchPin, OUTPUT);

pinMode(clockPin, OUTPUT);

pinMode(dataPin, OUTPUT);

}

void loop() {

//向上计数程序

(J = 0; J <256; J + +){

//传输数据的时候将latchPin拉低

digitalWrite(latchpin, LOW);

shiftOut的 (dataPin,clockPin,LSBFIRST,J);

//之后将latchPin拉高以告诉芯片

//它不需要再接受信息了

digitalWrite(latchpin, HIGH);

delay(1000);

}

}

17.4 shiftIn()

描述

将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。

注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。

语法

shiftIn(dataPin,clockPin,bitOrder)

参数

dataPin:输出每一位数据的引脚(int)

clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)

bitOrder:输出位的顺序,最高位优先或最低位优先

17.5 pulseIn()

描述

读取一个引脚的脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲函数返回。

此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒)

语法

pulseIn(pin, value)

pulseIn(pin, value, timeout)

参数

pin:你要进行脉冲计时的引脚号(int)。

value:要读取的脉冲类型,HIGH或LOW(int)。

timeout (可选):指定脉冲计数的等待时间,单位为微秒,默认值是1秒(unsigned long)

返回

脉冲长度(微秒),如果等待超时返回0(unsigned long)

例子

int pin = 7;

unsigned long duration;

void setup()

{

pinMode(pin, INPUT);

}

void loop()

{

duration = pulseIn(pin, HIGH);;

}

十八、时间

18.1 millis()

描述

返回Arduino开发板从运行当前程序开始的毫秒数。这个数字将在约50天后溢出(归零)。

参数

返回

返回从运行当前程序开始的毫秒数(无符号长整数)。

例子

unsigned long time;

void setup(){

Serial.begin(9600);

}

void loop(){

serial.print("Time:");

time = millis();

//打印从程序开始到现在的时间

serial.println(time);

//等待一秒钟,以免发送大量的数据

delay(1000);

}

提示

注意,参数 millis 是一个无符号长整数,试图和其他数据类型(如整型数)做数学运算可能会产生错误。

当中断函数发生时,millis()的数值将不会继续变化。

18.2 micros()

描述

返回 Arduino 开发板从运行当前程序开始的微秒数。这个数字将在约70分钟后溢出(归零)。在 16MHz 的 Arduino 开发板上(比如 Duemilanove 和 Nano),这个函数的分辨率为四微秒(即返回值总是四的倍数)。在 8MHz 的 Arduino 开发板上(比如 LilyPad),这个函数的分辨率为八微秒。

注意 :每毫秒是1,000微秒,每秒是1,000,000微秒。

参数

返回

返回从运行当前程序开始的微秒数(无符号长整数)。

例子

unsigned long time;

void setup(){

Serial.begin(9600);

}

void loop(){

Serial.print("Time:");

time = micros();

//打印从程序开始的时间

Serial.println(time);

//等待一秒钟,以免发送大量的数据

delay(1000);

}

18.3 delay()

描述

使程序暂定设定的时间(单位毫秒)。(一秒等于1000毫秒)

语法

delay(ms)

参数

ms:暂停的毫秒数(unsigned long)

返回

例子

ledPin = 13 / / LED连接到数字13脚

void setup()

{

pinMode(ledPin, OUTPUT); // 设置引脚为输出

}

void loop()

{

digitalWrite(ledPin, HIGH); // 点亮LED

delay(1000); // 等待1秒

digitalWrite(ledPin, LOW); // 灭掉LED

delay(1000); // 等待一秒

}

警告

虽然创建一个使用delay()的闪烁LED很简单,并且许多例子将很短的delay用于消除开关抖动,delay()确实拥有很多显著的缺点。在delay函数使用的过程中,读取传感器值、计算、引脚操作均无法执行,因此,它所带来的后果就是使其他大多数活动暂停。其他操作定时的方法请参加millis()函数和它下面的例子。大多数熟练的程序员通常避免超过10毫秒的delay(),除非arduino程序非常简单。

但某些操作在delay()执行时任然能够运行,因为delay函数不会使中断失效。通信端口RX接收到得数据会被记录,PWM(analogWrite)值和引脚状态会保持,中断也会按设定的执行。

18.4 delayMicroseconds()

描述

使程序暂停指定的一段时间(单位:微秒)。一秒等于1000000微秒。 目前,能够产生的最大的延时准确值是16383。这可能会在未来的Arduino版本中改变。对于超过几千微秒的延迟,你应该使用delay()代替。

语法

delayMicroseconds(us)

参数

us:暂停的时间,单位微秒(unsigned int)

返回

例子

int outPin = 8; // digital pin 8

void setup()

{

pinMode(outPin,OUTPUT); //设置为输出的数字管脚

}

void loop()

{

digitalWrite(outPin,HIGH); //设置引脚高电平

delayMicroseconds(50); // 暂停50微秒

digitalWrite(outPin, LOW); // 设置引脚低电平

delayMicroseconds(50); // 暂停50微秒

}

将8号引脚配置为输出脚。它会发出一系列周期100微秒的方波。

警告和已知问题

此函数在3微秒以以上工作的非常准确。我们不能保证,delayMicroseconds在更小的时间内延时准确。

Arduino0018版本后,delayMicroseconds()不再会使中断失效。

十九、数学运算

19.1 min()

min(x, y)

描述

计算两个数字中的最小值。

参数

X:第一个数字,任何数据类型

Y:第二个数字,任何数据类型

返回

两个数字中的较小者。

举例

sensVal = min(sensVal,100); //将 sensVal 或 100 中较小者赋值给 sensVal

//确保它永远不会大于 100。

注释

直观的比较,max() 方法常被用来约束变量的下限,而 min() 常被用来约束变量的上限。

警告

由于 min() 函数的实现方式,应避免在括号内出现其他函数,这将导致不正确的结果。

min(a++, 100); //避免这种情况 - 会产生不正确的结果

a++;

min(a, 100); //使用这种形式替代 - 将其他数学运算放在函数之外

19.2 max()

max(x,y)

描述

计算两个数的最大值。

参数

X:第一个数字,任何数据类型

Y:第二个数字,任何数据类型

返回

两个参数中较大的一个。

例子

sensVal = max(senVal, 20); // 将20或更大值赋给sensVal

//(有效保障它的值至少为20)

注意

和直观相反,max()通常用来约束变量最小值,而min()通常用来约束变量的最大值。

警告

由于max()函数的实现方法,要避免在括号内嵌套其他函数,这可能会导致不正确的结果。

max(a--, 0); //避免此用法,这会导致不正确结果

a--; // 用此方法代替

max(a, 0); // 将其他计算放在函数外

19.3 abs()

ABS(X)

描述

计算一个数的绝对值。

参数

X:一个数

返回

如果x大于或等于0,则返回它本身。 如果x小于0,则返回它的相反数。

警告

由于实现ABS()函数的方法,避免在括号内使用任何函数(括号内只能是数字),否则将导致不正确的结果。

ABS(a+ +); //避免这种情况,否则它将产生不正确的结果

a ++; //使用这段代码代替上述的错误代码

ABS(a); //保证其他函数放在括号的外部

19.4 constrain()

描述

将一个数约束在一个范围内

参数

x:要被约束的数字,所有的数据类型适用。

a:该范围的最小值,所有的数据类型适用。

b:该范围的最大值,所有的数据类型适用。

返回值

x:如果 x是介于 a 和 b之间

a:如果 x小于a

b:如果 x大于b

例子

sensVal = constrain(sensVal, 10, 150);

//传感器返回值的范围限制在10到150之间

19.5 map()

map(value, fromLow, fromHigh, toLow, toHigh)

描述

将一个数从一个范围映射到另外一个范围。也就是说,会将 fromLow 到 fromHigh 之间的值映射到 toLow 在 toHigh 之间的值。

不限制值的范围,因为范围外的值有时是刻意的和有用的。如果需要限制的范围, constrain() 函数可以用于此函数之前或之后。

注意,两个范围中的"下限"可以比"上限"更大或者更小,因此 map() 函数可以用来翻转数值的范围,例如:

y = map(x, 1, 50, 50, 1);

这个函数同样可以处理负数,请看下面这个例子:

y = map(x, 1, 50, 50, -100);

是有效的并且可以很好的运行。

map() 函数使用整型数进行运算因此不会产生分数,这时运算应该表明它需要这样做。小数的余数部分会被舍去,不会四舍五入或者平均。

参数

value:需要映射的值

fromLow:当前范围值的下限

fromHigh:当前范围值的上限

toLow:目标范围值的下限

toHigh:目标范围值的上限

返回值

被映射的值。

例子

/*映射一个模拟值到8位(0到255)*/

void setup(){}

void loop()

{

int val = analogRead(0);

val = map(val, 0, 1023, 0, 255);

analogWrite(9, val);

}

附录

关于数学的实现,这里是完整函数

long map(long x, long in_min, long in_max, long out_min, long out_max)

{

return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;

}

19.6 pow()

pow(base, exponent)

描述

计算一个数的幂次方。Pow()可以用来计算一个数的分数幂。这用来产生指数幂的数或曲线非常方便。

参数

base:底数(float)

exponent:幂(float)

返回

一个数的幂次方值(double)

例子

详情见 库代码中的fscale函数。

19.7 sqrt()

sqrt(x)

描述

计算一个数的平方根。

参数

x:被开方数,任何类型

返回值

此数的平方根,类型double

二十、三角函数

20.1 sin()

sin(rad)

描述

计算角度的正弦(弧度)。其结果在-1和1之间。

参数

rad: 弧度制的角度(float)

返回

角度的正弦值(double)

20.2 cos()

cos(rad)

描述

计算一个角度的余弦值(用弧度表示)。返回值在 -1 和 1 之间。

参数

rad:用弧度表示的角度 (浮点数)

返回

角度的余弦值 (双精度浮点数)

20.3 tan()

tan(rad)

描述

计算角度的正切(弧度)。结果在负无穷大和无穷大之间。

参数

rad:弧度制的角度(float)

返回值

角度的正切值

二十一、随机数

21.1 randomSeed()

randomSeed(seed)

描述

使用randomSeed()初始化伪随机数生成器,使生成器在随机序列中的任意点开始。这个序列,虽然很长,并且是随机的,但始终是同一序列。

如需要在一个random()序列上生成真正意义的随机数,在执行其子序列时使用randomSeed()函数预设一个绝对的随机输入,例如在一个断开引脚上的analogRead()函数的返回值。

反之,有些时候伪随机数的精确重复也是有用的。这可以在一个随机系列开始前,通过调用一个使用固定数值的randomSeed()函数来完成。

参数

long,int - 通过数字生成种子。

返回

没有返回值

例子

long randNumber;

void setup(){

Serial.begin(9600);

randomSeed(analogRead(0));

}

void loop(){

randNumber = random(300);

Serial.println(randNumber);

delay(50);

}

21.2 random()

random()

描述

使用random()函数将生成伪随机数。

语法

random(max)

random(min, max)

参数

min - 随机数的最小值,随机数将包含此值。 (此参数可选)

max - 随机数的最大值,随机数不包含此值。

返回

min和max-1之间的随机数( 数据类型为long )

注意

如需要在一个random()序列上生成真正意义的随机数,在执行其子序列时使用randomSeed()函数预设一个绝对的随机输入,例如在一个断开引脚上的analogRead()函数的返回值。

反之,有些时候伪随机数的精确重复也是有用的。这可以在一个随机系列开始前,通过调用一个使用固定数值的randomSeed()函数来完成。

例子

long randNumber;

void setup(){

Serial.begin(9600);

//如果模拟输入引脚0为断开,随机的模拟噪声

//将会调用randomSeed()函数在每次代码运行时生成

//不同的种子数值。

//randomSeed()将随机打乱random函数。

randomSeed(analogRead(0));

}

void loop() {

//打印一个0到299之间的随机数

randNumber = random(300);

Serial.println(randNumber);

//打印一个10到19之间的随机数

randNumber = random(10, 20);

Serial.println(randNumber);

delay(50);

}

二十二、位操作

22.1 lowByte()

描述

提取一个变量(例如一个字)的低位(最右边)字节。

语法

lowByte(x)

参数

x:任何类型的值

返回

字节

22.2 highByte()

描述

提取一个字节的高位(最左边的),或一个更长的字节的第二低位。

语法

highByte(x)

参数

x:任何类型的值

返回

byte

22.3 bitRead()

描述

读取一个数的位。

语法

bitRead(x, n)

参数

X:想要被读取的数 N:被读取的位,0是最低有效位(最右边)

返回

该位的值(0或1)。

22.4 bitWrite()

描述

在位上写入数字变量。

语法

bitWrite(x, n, b)

参数

X:要写入的数值变量

N:要写入的数值变量的位,从0开始是最低(最右边)的位

B:写入位的数值(0或1)

返回

22.5 bitSet()

描述

为一个数字变量设置一个位。

语句

bitSet(x, n)

语法

X:想要设置的数字变量

N:想要设置的位,0是最重要(最右边)的位

返回

22.6 bitClear()

描述

清除一个数值型数值的指定位(将此位设置成 0)

语法

bitClear(x, n)

参数

X:指定要清除位的数值 N:指定要清除位的位置,从0开始,0 表示最右端位

返回值

22.7 bit()

描述

计算指定位的值(0位是1,1位是2,2位4,以此类推)。

语法

bit(n)

参数

n:需要计算的位

返回值

位值

二十三、设置中断函数

23.1 attachInterrupt()

attachInterrupt(interrupt, function, mode)

描述

当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。

arduino Mege有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18)。

语法

interrupt:中断引脚数

function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。

mode:定义何时发生中断以下四个contstants预定有效值:

LOW 当引脚为低电平时,触发中断

CHANGE 当引脚电平发生改变时,触发中断

RISING 当引脚由低电平变为高电平时,触发中断

FALLING 当引脚由高电平变为低电平时,触发中断.

返回

注意事项

当中断函数发生时,delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。

使用中断

在单片机自动化程序中当突发事件发生时,中断是非常有用的,它可以帮助解决时序问题。一个使用中断的任务可能会读一个旋转编码器,监视用户的输入。

如果你想以确保程序始终抓住一个旋转编码器的脉冲,从来不缺少一个脉冲,它将使写一个程序做任何事情都要非常棘手,因为该计划将需要不断轮询的传感器线编码器,为了赶上脉冲发生时。其他传感器也是如此,如试图读取一个声音传感器正试图赶上一按,或红外线槽传感器(照片灭弧室),试图抓住一个硬币下降。在所有这些情况下,使用一个中断可以释放的微控制器来完成其他一些工作。

程序示例

int pin = 13;

volatile int state = LOW;

void setup()

{

pinMode(pin, OUTPUT);

attachInterrupt(0, blink, CHANGE);

}

void loop()

{

digitalWrite(pin, state);

}

void blink()

{

state = !state;

}

23.2 detachInterrupt()

detachInterrupt(interrupt)

描述

关闭给定的中断。

参数

interrupt: 中断禁用的数(0或者1).

二十四、开关中断

24.1 interrupts()(中断)

描述

重新启用中断(使用noInterrupts()命令后将被禁用)。中断允许一些重要任务在后台运行,默认状态是启用的。禁用中断后一些函数可能无法工作,并传入信息可能会被忽略。中断会稍微打乱代码的时间,但是在关键部分可以禁用中断。

参数

返回

例子

void setup() {

}

void loop()

{

noInterrupts();

//重要、时间敏感的代码

interrupts();

//其他代码写在这里

}

24.2 noInterrupts()(禁止中断)

描述

禁止中断(重新使能中断interrupts())。中断允许在后台运行一些重要任务,默认使能中断。禁止中断时部分函数会无法工作,通信中接收到的信息也可能会丢失。

中断会稍影响计时代码,在某些特定的代码中也会失效。

参数

返回

例子

void setup()

void loop()

{

noInterrupts();

//关键的、时间敏感的代码放在这

interrupts();

//其他代码放在这

}

二十五、通讯

25.1 Serial

用于Arduino控制板和一台计算机或其他设备之间的通信。所有的Arduino控制板有至少一个串口(又称作为UART或USART)。它通过0(RX)和1(TX)数字引脚经过串口转换芯片连接计算机USB端口与计算机进行通信。因此,如果你使用这些功能的同时你不能使用引脚0和1作为输入或输出。

您可以使用Arduino IDE内置的串口监视器与Arduino板通信。点击工具栏上的串口监视器按钮,调用begin()函数(选择相同的波特率)。

Arduino Mega 有三个额外的串口:Serial 1使用19(RX)和18(TX),Serial 2使用17(RX)和16(TX),Serial3使用15(RX)和14(TX)。 若要使用这三个引脚与您的个人电脑通信,你需要一个额外的USB转串口适配器,因为这三个引脚没有连接到Mega上的USB转串口适配器。若要用它们来与外部的TTL串口设备进行通信,将TX引脚连接到您的设备的RX引脚,将RX引脚连接到您的设备的TX引脚,将GND连接到您的设备的GND。(不要直接将这些引脚直接连接到RS232串口;他们的工作电压在+/- 12V,可能会损坏您的Arduino控制板。)

Arduino Leonardo板使用Serial 1通过0(RX)和1(TX)与viaRS-232通信,。Serial预留给使用Mouse and Keyboard libarariies的USB CDC通信 。更多信息,请参考Leonardo 开始使用页和硬件页。

函数

25.1.1 if (Serial)

25.1.2 available()

25.1.3 begin()

25.1.4 end()

25.1.5 find()

25.1.6 findUntil()

25.1.7 flush()

25.1.8 parseFloat()

25.1.9 parseInt()

25.1.10 peek()

25.1.11 print()

25.1.12 println()

25.1.13 read()

25.1.14 readBytes()

25.1.15 readBytesUntil()

25.1.16 setTimeout()

25.1.17 write()

25.1.18 SerialEvent()

25.1.1 if (Serial)

说明

表示指定的串口是否准备好。

在Leonardo上,if(Serial)表示不论有无USB CDC,串行连接都是开放的。对于所有其他的情况,包括Leonardo上的if(Serial1),将一直返回true。 这来自于 Arduino 1.0.1 版本的介绍.

语法

对于所有的arduino板:

if (Serial)

Arduino Leonardo 特有:

if (Serial1)

Arduino Mega 特有:

if (Serial1)

if (Serial2)

if (Serial3)

参数

返回

布尔值:如果指定的串行端口是可用的,则返回true。如果查询Leonardo的USB CDC串行连接之前,它是准备好的,将只返回false。

例子

void setup() {

//初始化串口和等待端口打开:

Serial.begin(9600);

while (!Serial) {

//等待串口连接。只有 Leonardo 需要。

}

}

void loop() {

//正常进行

}

25.1.2 Serial.available()

说明

获取从串口读取有效的字节数(字符)。这是已经传输到,并存储在串行接收缓冲区(能够存储64个字节)的数据。 available()继承了 Stream类。

语法

Serial.available()

仅适用于Arduino Mega :

Serial1.available()

Serial2.available()

Serial3.available()

参数

返回

可读取的字节数

例子

incomingByte = 0; //传入的串行数据

void setup() {

Serial.begin(9600); // 打开串行端口,设置传输波特率为9600 bps

}

void loop() {

//只有当你接收到数据时才会发送数据,:

if (Serial.available() > 0) {

//读取传入的字节:

incomingByte = Serial.read();

//显示你得到的数据:

Serial.print("I received: ");

Serial.println(incomingByte, DEC);

}

}

Arduino Mega 的例子:

void setup() {

Serial.begin(9600);

Serial1.begin(9600);

}

void loop() {

//读取端口0,发送到端口1:

if (Serial.available()) {

int inByte = Serial.read();

Serial1.print(inByte, BYTE);

}

//读端口1,发送到端口0:

if (Serial1.available()) {

int inByte = Serial1.read();

Serial.print(inByte, BYTE);

}

}

25.1.3 Serial.begin()

说明

将串行数据传输速率设置为位/秒(波特)。与计算机进行通信时,可以使用这些波特率:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。当然,您也可以指定其他波特率 - 例如,引脚0和1和一个元件进行通信,它需要一个特定的波特率。

语法

Serial.begin(speed) 仅适用于Arduino Mega : Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)

参数

speed: 位/秒 (波特) - long

返回

例子

void setup() {

Serial.begin(9600); // 打开串口,设置数据传输速率为9600bps

}

void loop() {

Arduino Mega 的例子:

// Arduino Mega 可以使用四个串口

// (Serial, Serial1, Serial2, Serial3),

// 从而设置四个不同的波特率:

void setup(){

Serial.begin(9600);

Serial1.begin(38400);

Serial2.begin(19200);

Serial3.begin(4800);

Serial.println("Hello Computer");

Serial1.println("Hello Serial 1");

Serial2.println("Hello Serial 2");

Serial3.println("Hello Serial 3");

}

void loop() {}

25.1.4 Serial.end()

说明

停用串行通信,使RX和TX引脚用于一般输入和输出。要重新使用串行通信, 需要 Serial.begin()语句。

语法

Serial.end()

仅适用于Arduino Mega: Serial1.end() Serial2.end() Serial3.end()

参数

返回

25.1.5 Serial.find()

说明

Serial.find() 从串行缓冲器中读取数据,直到发现给定长度的目标字符串。如果找到目标字符串,该函数返回true,如果超时则返回false。

Serial.flush() 继承了 Stream 类.

语法

Serial.find(target)

参数

target : 要搜索的字符串(字符)

返回

布尔型

25.1.6 Serial.findUntil()

说明

Serial.findUntil()从串行缓冲区读取数据,直到找到一个给定的长度或字符串终止位。

如果目标字符串被发现,该函数返回true,如果超时则返回false。

Serial.findUntil()继承了Stream类。

语法

Serial.findUntil(target, terminal)

参数

target : 要搜索的字符串(char) terminal : 在搜索中的字符串终止位 (char)

返回

布尔型

25.1.7 Serial.flush()

说明

等待超出的串行数据完成传输。(在1.0及以上的版本中,flush()语句的功能不再是丢弃所有进入缓存器的串行数据。)

flush()继承了Stream类.

语法

Serial.flush()

仅 Arduino Mega 可以使用的语法:

Serial1.flush()

Serial2.flush()

Serial3.flush()

参数

返回

25.1.8 Serial.parseFloat()

描述

Serial.parseFloat()命令从串口缓冲区返回第一个有效的浮点数. Characters that are not digits (or the minus sign) are skipped. parseFloat() is terminated by the first character that is not a floating point number.

Serial.parseFloat()继承了Stream类。

语法

Serial.parseFloat()

参数

返回

float

25.1.9 Serial.parseInt()

说明

查找传入的串行数据流中的下一个有效的整数。 parseInt()继承了Stream类。

语法

Serial.parseInt()

下面三个命令仅适用于Arduino Mega:

Serial1.parseInt()

Serial2.parseInt()

Serial3.parseInt()

参数

返回

int : 下一个有效的整数

25.1.10 Serial.peek()

说明

返回传入的串行数据的下一个字节(字符),而不是进入内部串行缓冲器调取。也就是说,连续调用 peek()将返回相同的字符,与调用read()方法相同。peek()继承自 Stream类。

语法

Serial.peek()

仅适用于Arduino Mega :

Serial1.peek()

Serial2.peek()

Serial3.peek()

参数

返回

传入的串行数据的第一个字节(或-1,如果没有可用的数据的话)- int

25.1.11 Serial.print()

说明

以人们可读的ASCII文本形式打印数据到串口输出。此命令可以采取多种形式。每个数字的打印输出使用的是ASCII字符。浮点型同样打印输出的是ASCII字符,保留到小数点后两位。Bytes型则打印输出单个字符。字符和字符串原样打印输出。Serial.print()打印输出数据不换行,Serial.println()打印输出数据自动换行处理。例如

Serial.print(78)输出为"78"

Serial.print(1.23456)输出为"1.23"

Serial.print("N")输出为"N"

Serial.print("Hello world.")输出为"Hello world."

也可以自己定义输出为几进制(格式);可以是BIN(二进制,或以2为基数),OCT(八进制,或以8为基数),DEC(十进制,或以10为基数),HEX(十六进制,或以16为基数)。对于浮点型数字,可以指定输出的小数数位。例如

Serial.print(78,BIN)输出为"1001110"

Serial.print(78,OCT)输出为"116"

Serial.print(78,DEC)输出为"78"

Serial.print(78,HEX)输出为"4E"

Serial.println(1.23456,0)输出为"1"

Serial.println(1.23456,2)输出为"1.23"

Serial.println(1.23456,4)输出为"1.2346"

你可以通过基于闪存的字符串来进行打印输出,将数据放入F()中,再放入Serial.print()。例如 Serial.print(F("Hello world")) 若要发送一个字节,则使用 Serial.write()。

语法

Serial.print(val)

Serial.print(val,格式)

参数

val:打印输出的值 - 任何数据类型

格式:指定进制(整数数据类型)或小数位数(浮点类型)

返回

字节 print()将返回写入的字节数,但是否使用(或读出)这个数字是可设定的

例子

/ *

使用for循环打印一个数字的各种格式。

* /

int x = 0; // 定义一个变量并赋值

void setup() {

Serial.begin(9600); // 打开串口传输,并设置波特率为9600

}

void loop() {

/ /打印标签

Serial.print("NO FORMAT"); // 打印一个标签

Serial.print("\t"); // 打印一个转义字符

Serial.print("DEC");

Serial.print("\t");

Serial.print("HEX");

Serial.print("\t");

Serial.print("OCT");

Serial.print("\t");

Serial.print("BIN");

Serial.print("\t");

for(x=0; x< 64; x++){ // 打印ASCII码表的一部分, 修改它的格式得到需要的内容

/ /打印多种格式:

Serial.print(x); // 以十进制格式将x打印输出 - 与 "DEC"相同

Serial.print("\t"); // 横向跳格

Serial.print(x, DEC); // 以十进制格式将x打印输出

Serial.print("\t"); // 横向跳格

Serial.print(x, HEX); // 以十六进制格式打印输出

Serial.print("\t"); // 横向跳格

Serial.print(x, OCT); // 以八进制格式打印输出

Serial.print("\t"); // 横向跳格

Serial.println(x, BIN); // 以二进制格式打印输出

//然后用 "println"打印一个回车

delay(200); // 延时200ms

}

Serial.println(""); // 打印一个空字符,并自动换行

}

编程技巧 作为1.0版本,串行传输是异步的; Serial.print()将返回之前接收到的任何字符。

25.1.12 Serial.println()

说明

打印数据到串行端口,输出人们可识别的ASCII码文本并回车 (ASCII 13, 或 '\r') 及换行(ASCII 10, 或 '\n')。此命令采用的形式与Serial.print ()相同 。

语法

Serial.println(val)

Serial.println(val, format)

参数

val: 打印的内容 - 任何数据类型都可以

format: 指定基数(整数数据类型)或小数位数(浮点类型)

返回

字节(byte)

println()将返回写入的字节数,但可以选择是否使用它。

例子

/*

模拟输入信号

读取模拟口0的模拟输入,打印输出读取的值。

由 Tom Igoe创建于2006年3月24日

*/

int analogValue = 0; // 定义一个变量来保存模拟值

void setup() {

//设置串口波特率为9600 bps:

Serial.begin(9600);

}

void loop() {

analogValue = analogRead(0); //读取引脚0的模拟输入:

//打印g各种格式:

Serial.println(analogValue); //打印ASCII编码的十进制

Serial.println(analogValue, DEC); //打印ASCII编码的十进制

Serial.println(analogValue, HEX); //打印ASCII编码的十六进制

Serial.println(analogValue, OCT); //打印ASCII编码的八进制

Serial.println(analogValue, BIN); //打印一个ASCII编码的二进制

delay(10); // 延时10毫秒:

}

25.1.13 Serial.read()

说明

读取传入的串口的数据。read() 继承自 Stream 类。

语法

serial.read()

Arduino Mega独有:

serial1.read()

serial2.read()

serial3.read()

参数

返回

传入的串口数据的第一个字节(或-1,如果没有可用的数据)- int

例子

int incomingByte = 0; // 传入的串行数据

void setup() {

Serial.begin(9600); // 打开串口,设置数据传输速率9600

}

void loop() {

// 当你接收数据时发送数据

if (Serial.available() > 0) {

// 读取传入的数据:

incomingByte = Serial.read();

//打印你得到的:

Serial.print("I received: ");

Serial.println(incomingByte, DEC);

}

}

25.1.14 Serial.readBytes()

说明

Serial.readBytes()从串口读字符到一个缓冲区。如果预设的长度读取完毕或者时间到了 (参见 Serial.setTimeout()),函数将终止.

Serial.readBytes()返回放置在缓冲区的字符数。返回0意味着没有发现有效的数据。

Serial.readBytes()继承自 Stream 类.

语法

Serial.readBytes(buffer, length)

参数

buffer:用来存储字节(char[]或byte[])的缓冲区

length:读取的字节数(int)

返回

byte

25.1.15 Serial.readBytesUntil()

说明

Serial.readBytesUntil()将字符从串行缓冲区读取到一个数组。如果检测到终止字符,或预设的读取长度读取完毕,或者时间到了 (参见 Serial.setTimeout())函数将终止。

Serial.readBytesUntil()返回读入数组的字符数。返回0意味着没有发现有效的数据。

Serial.readBytesUntil()继承自 Stream类。

语法

Serial.readBytesUntil(character, buffer, length)

参数

character :要搜索的字符(char)

buffer :缓冲区来存储字节(char[]或byte[])

length:读的字节数(int)

返回

byte

25.1.16 Serial.setTimeout()

说明

Serial.setTimeout()设置使用Serial.readBytesUntil() 或Serial.readBytes()时等待串口数据的最大毫秒值. 默认为1000毫秒。

Serial.setTimeout()继承自Stream 类。

语法

Serial.setTimeout(time)

参数

time :以毫秒为单位的超时时间(long)。

返回

25.1.17 Serial.write()

说明

写入二级制数据到串口。发送的数据以一个字节或者一系列的字节为单位。如果写入的数字为字符,需使用print()命令进行代替。

语法

Serial.write(val)

Serial.write(str)

Serial.write(buf, len)

Arduino Mega还支持:Serial1,Serial2,Serial3 (替代Serial)

参数

val: 以单个字节形式发的值

str: 以一串字节的形式发送的字符串

buf: 以一串字节的形式发送的数组

len: 数组的长度

返回

byte

write() 将返回写入的字节数,但是否使用这个数字是可选的

例子

void setup(){

Serial.begin(9600);

}

void loop(){

Serial.write(45); // 发送一个值为45的字节

int bytesSent = Serial.write("hello"); //发送字符串"hello",返回该字符串的长度.

}

25.1.18 Serial.SerialEvent()

暂无说明。

25.2 Stream

暂无说明。

二十六、USB(仅适用于 Leonardo 和 Due)

26.1 Mouse(键盘)

Mouse.begin()

Mouse.click()

Mouse.end()

Mouse.move()

Mouse.press()

Mouse.release()

Mouse.isPressed()

26.2 Keyboard(鼠标)

Keyboard.begin()

Keyboard.end()

Keyboard.press()

Keyboard.print()

Keyboard.println()

Keyboard.release()

Keyboard.releaseAll()

Keyboard.write()

本文内容来自:

http://wiki.geek-workshop.com/doku.php?id=arduino:arduino_language_reference

weinxin
灵智科教
这是我的微信扫一扫
avatar