Arduino 语法、函数使用、最常用函数、arduino教程、arduino笔记、参考手册_arduino常用函数手册-程序员宅基地

技术标签: arduino  单片机教程  嵌入式笔记  

数字 I/O

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,等

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等。

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

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)。
返回

注意事项
改变基准电压后,之前从anal​​ogRead()读取的数据可能不准确。
警告
不要在AREF引脚上使用使用任何小于0V或超过5V的外部电压。如果你使用AREF引脚上的电压作为基准电压,你在调用analogRead()前必须设置参考类型为EXTERNAL。否则,你将会削短有效的基准电压(内部产生)和AREF引脚,这可能会损坏您Arduino板上的单片机。
另外,您可以在外部基准电压和AREF引脚之间连接一个5K电阻,使你可以在外部和内部基准电压之间切换。请注意,总阻值将会发生改变,因为AREF引脚内部有一个32K电阻。这两个电阻都有分压作用。所以,例如,如果输入2.5V的电压,最终在在AREF引脚上的电压将为2.5 * 32 /(32 + 5)= 2.2V。

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);
//显示读取的数值 }

返回主菜单

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

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
返回

noTone()
描述
停止由tone()产生的方波。如果没有使用tone()将不会有效果。
注意:如果你想在多个引脚上产生不同的声音,你要在对下个引脚使用tone()前对刚才的引脚调用noTone().
语法
noTone(pin)
参数
pin: 所要停止产生声音的引脚
返回

shiftOut()
描述
将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。
注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。
语法
shiftOut(dataPin, clockPin, bitOrder, value)
参数
dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
value: 要移位输出的数据(byte)
返回

shiftIn()
描述
将一个数据的一个字节一位一位的移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传输线中读取一位,再将时钟线拉低。
注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。
语法
shiftIn(dataPin,clockPin,bitOrder)
参数
dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
返回
读取的值(byte)

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);; }

时间
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()的数值将不会继续变化。

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); }

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)值和引脚状态会保持,中断也会按设定的执行。

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()不再会使中断失效。

数学运算

min()
min(x, y)

描述
计算两个数字中的最小值。
参数
X:第一个数字,任何数据类型
Y:第二个数字,任何数据类型
返回
两个数字中的较小者。
举例
sensVal = min(sensVal,100); //将 sensVal 或 100 中较小者赋值给 sensVal
//确保它永远不会大于 100。
注释
直观的比较,max() 方法常被用来约束变量的下限,而 min() 常被用来约束变量的上限。
警告
由于 min() 函数的实现方式,应避免在括号内出现其他函数,这将导致不正确的结果。
min(a++, 100); //避免这种情况 - 会产生不正确的结果
a++;
min(a, 100); //使用这种形式替代 - 将其他数学运算放在函数之外

max()
max(x,y)

描述
计算两个数的最大值。
参数
X:第一个数字,任何数据类型
Y:第二个数字,任何数据类型
返回
两个参数中较大的一个。
例子
sensVal = max(senVal, 20); // 将20或更大值赋给sensVal
//(有效保障它的值至少为20)
注意
和直观相反,max()通常用来约束变量最小值,而min()通常用来约束变量的最大值。
警告
由于max()函数的实现方法,要避免在括号内嵌套其他函数,这可能会导致不正确的结果。
max(a–, 0); //避免此用法,这会导致不正确结果

a–; // 用此方法代替
max(a, 0); // 将其他计算放在函数外

abs()
描述
计算一个数的绝对值。
参数
X:一个数
返回
如果x大于或等于0,则返回它本身。如果x小于0,则返回它的相反数。
警告
由于实现ABS()函数的方法,避免在括号内使用任何函数(括号内只能是数字),否则将导致不正确的结果。
ABS(a+ +); //避免这种情况,否则它将产生不正确的结果
a + +; //使用这段代码代替上述的错误代码
ABS(a); //保证其他函数放在括号的外部

constrain()
描述
将一个数约束在一个范围内
参数
x:要被约束的数字,所有的数据类型适用。
a:该范围的最小值,所有的数据类型适用。
b:该范围的最大值,所有的数据类型适用。
返回值
x:如果 x是介于 a 和 b之间
a:如果 x小于a
b:如果 x大于b
例子
sensVal = constrain(sensVal, 10, 150);
//传感器返回值的范围限制在10到150之间

map()
描述
将一个数从一个范围映射到另外一个范围。也就是说,会将 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; }

pow()
描述
计算一个数的幂次方。Pow()可以用来计算一个数的分数幂。这用来产生指数幂的数或曲线非常方便。
参数
base:底数(float)
exponent:幂(float)
返回
一个数的幂次方值(double)
例子
详情见 库代码中的fscale函数。

sqrt()
描述
计算一个数的平方根。
参数
x:被开方数,任何类型
返回
此数的平方根,类型double

其他不常用函数:
ceil()–
exp()–
fabs()–
floor()–
fma()–
fmax()–
fmin()–
fmod()–
ldexp()–
log()–
log10()–
round()–
signbit()–
sq()–
square()–
trunc()–

三角函数

sin()
描述
计算角度的正弦(弧度)。其结果在-1和1之间。
参数
rad: 弧度制的角度(float)
返回
角度的正弦值(double)

cos()
描述
计算一个角度的余弦值(用弧度表示)。返回值在 -1 和 1 之间。
参数
rad:用弧度表示的角度 (浮点数)
返回
角度的余弦值 (双精度浮点数)

tan()
描述
计算角度的正切(弧度)。结果在负无穷大和无穷大之间。
参数
rad:弧度制的角度(float)
返回
角度的正切值

acos()–
asin()–
atan()–
atan2()–
cosh()–
degrees()–
hypot()–
radians()–
sinh()–
tanh()–

随机数

randomSeed()

描述
使用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); }

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); }

位操作

lowByte()
描述
语法
参数
返回
lowByte()
描述
提取一个变量(例如一个字)的低位(最右边)字节。
语法
lowByte(x)
参数
x:任何类型的值
返回
字节

highByte()
描述
提取一个字节的高位(最左边的),或一个更长的字节的第二低位。
语法
highByte(x)
参数
x:任何类型的值
返回
byte

bitRead()
描述
读取一个数的位。
语法
bitRead(x, n)
参数
X:想要被读取的数 N:被读取的位,0是最低有效位(最右边)
返回
该位的值(0或1)。

bitWrite()
描述
在位上写入数字变量。
语法
bitWrite(x, n, b)
参数
X:要写入的数值变量
N:要写入的数值变量的位,从0开始是最低(最右边)的位
B:写入位的数值(0或1)
返回

bitSet()
描述
为一个数字变量设置一个位。
语句
bitSet(x, n)
语法
X:想要设置的数字变量
N:想要设置的位,0是最重要(最右边)的位
返回

bitClear()
描述
清除一个数值型数值的指定位(将此位设置成 0)
语法
bitClear(x, n)
参数
X:指定要清除位的数值 N:指定要清除位的位置,从0开始,0 表示最右端位
返回值

bit()
描述
计算指定位的值(0位是1,1位是2,2位4,以此类推)。
语法
bit(n)
参数
n:需要计算的位
返回值
位值

设置中断函数

attachInterrupt()
attachInterrupt(interrupt, function, mode)
description
当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。大多数的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; }

detachInterrupt()
detachInterrupt(interrupt)

描述
关闭给定的中断。
参数
interrupt: 中断禁用的数(0或者1).

开关中断

interrupts()
interrupts()(中断)

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

返回

例子

void setup() { } void loop() { noInterrupts(); //重要、时间敏感的代码
interrupts(); //其他代码写在这里 }

noInterrupts()
描述
禁止中断(重新使能中断interrupts())。中断允许在后台运行一些重要任务,默认使能中断。禁止中断时部分函数会无法工作,通信中接收到的信息也可能会丢失。
中断会稍影响计时代码,在某些特定的代码中也会失效。
参数
无。
返回
无。
例子

void setup() void loop() { noInterrupts(); //关键的、时间敏感的代码放在这
interrupts(); //其他代码放在这 }

通讯

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 开始使用页和硬件页。
函数
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() { //正常进行 }

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); } }

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() {}

end()

说明
停用串行通信,使RX和TX引脚用于一般输入和输出。要重新使用串行通信, 需要 Serial.begin()语句。
语法
Serial.end()
仅适用于Arduino Mega: Serial1.end() Serial2.end() Serial3.end()
参数

返回

find()
Serial.find()
说明
Serial.find() 从串行缓冲器中读取数据,直到发现给定长度的目标字符串。如果找到目标字符串,该函数返回true,如果超时则返回false。
Serial.flush() 继承了 Stream 类.
语法
Serial.find(target)
参数
target : 要搜索的字符串(字符)
返回
布尔型

findUntil()
Serial.findUntil()

说明
Serial.findUntil()从串行缓冲区读取数据,直到找到一个给定的长度或字符串终止位。
如果目标字符串被发现,该函数返回true,如果超时则返回false。
Serial.findUntil()继承了Stream类。
语法
Serial.findUntil(target, terminal)
参数
target : 要搜索的字符串(char) terminal : 在搜索中的字符串终止位 (char)
返回
布尔型

flush()
说明
等待超出的串行数据完成传输。(在1.0及以上的版本中,flush()语句的功能不再是丢弃所有进入缓存器的串行数据。)
flush()继承了Stream类.
语法
Serial.flush()
仅 Arduino Mega 可以使用的语法:
Serial1.flush()
Serial2.flush()
Serial3.flush()
参数

返回

parseFloat()
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

parseInt()
parseInt()
说明
查找传入的串行数据流中的下一个有效的整数。 parseInt()继承了Stream类。
语法
Serial.parseInt()
下面三个命令仅适用于Arduino Mega:
Serial1.parseInt()
Serial2.parseInt()
Serial3.parseInt()
Parameters

返回
int : 下一个有效的整数

peek()
说明
返回传入的串行数据的下一个字节(字符),而不是进入内部串行缓冲器调取。也就是说,连续调用 peek()将返回相同的字符,与调用read()方法相同。peek()继承自 Stream类。
语法
Serial.peek()
仅适用于Arduino Mega :
Serial1.peek()
Serial2.peek()
Serial3.peek()
参数

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

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()将返回之前接收到的任何字符。

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() { //读取引脚0的模拟输入:
analogValue = analogRead(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编码的二进制
// 延时10毫秒: delay(10); }

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);   } }

readBytes()
Serial.readBytes()
说明
Serial.readBytes()从串口读字符到一个缓冲区。如果预设的长度读取完毕或者时间到了 (参见 Serial.setTimeout()),函数将终止.
Serial.readBytes()返回放置在缓冲区的字符数。返回0意味着没有发现有效的数据。
Serial.readBytes()继承自 Stream 类.
语法
Serial.readBytes(buffer, length)
元素
buffer:用来存储字节(char[]或byte[])的缓冲区
length:读取的字节数(int)
返回
byte

readBytesUntil()
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

setTimeout()
Serial.setTimeout()

说明
Serial.setTimeout()设置使用Serial.readBytesUntil() 或Serial.readBytes()时等待串口数据的最大毫秒值. 默认为1000毫秒。
Serial.setTimeout()继承自Stream 类。
语法
Serial.setTimeout(time)
参数
time :以毫秒为单位的超时时间(long)。
返回结果

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”,返回该字符串的长度. }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mbs520/article/details/105319885

智能推荐

EditorApplication.update += EditorUpdate;-程序员宅基地

文章浏览阅读6.2k次。在用Unity的时候遇到了这个表达,然后比较好奇。说一下自己对它的理解,大致的代码是这样写的:void Awake() { Timestamp = Utility.GetTimestamp(); /*获取系统当前时间*/ EditorApplication.update += EditorUpdate; }public void EditorUpdate() {..._editorapplication.update

jupyter的使用_jupyter notebook返回值-程序员宅基地

文章浏览阅读6.8k次。jupyter 的使用一、启动程序执行命令:jupyter notebook注意以下几点:打开地址为当前bash的目录,默认的根目录浏览器地址为 http://localhost:8888/通过control -C终止jupyter程序几个基本操作:DD:删除当前cellM:转为markdown文档markdown文档下运行变为预览模式二、IPython的帮助文档1. 使用help()通过help命令来获得帮助文档help(len)Help on built-in f_jupyter notebook返回值

fastadmin中的组件绑定Form.api.bindevent($("form[role=form]"))来历-程序员宅基地

文章浏览阅读6k次,点赞2次,收藏5次。一、为什么要用require?1、问题:网页引用多个js,例如:<script src="1.js"></script> <script src="2.js"></script> <script src="3.js"></script>各个js之间还有依赖关系,前后顺序必须一定,代码很难维护。2、require就..._form.api.bindevent

浙江理工大学2019年新生赛_ulire 最近在研究哈夫曼树,一种功能是将一串字符压缩为更短的 01 串的数据结构,现-程序员宅基地

文章浏览阅读1.6k次。问题 A: 你的名字题目描述Walfy同时喜欢上了n个妹子,第i个妹子的智力值为ai魅力值为bi。为了防止妹子们发现walfy是个渣男,现在walfy要给妹子排个序,这样他能按照这个排序分配和妹子聊天的时间。排序规则如下:智力高的妹子需要花费更多的时间来聊天,如果智力一样,那么魅力高的花费的时间将会多一点;如果她们的魅力也一样,姓名字典序更小的花费的时间也将多一点。对于字典序大小的定义,..._ulire 最近在研究哈夫曼树,一种功能是将一串字符压缩为更短的 01 串的数据结构,现

动手学深度学习之一一配置环境_no module named 'd21-程序员宅基地

文章浏览阅读2.3k次。一一配置环境一、安装Miniconda二、下载d21-zh安装包三、用conda创建虚拟环境四、jupyter notebook运行No moudule name'mxnet'一、安装Miniconda二、下载d21-zh安装包三、用conda创建虚拟环境#配置清华PyPI镜像(如无法运行,将pip版本升级到>=10.0.0)pip config set global.index-..._no module named 'd21

Paper Reading:Single-Shot Refinement Neural Network for Object Detection_CVPR2018-程序员宅基地

文章浏览阅读170次。Paper Reading:Single-Shot Refinement Neural Network for Object Detection_CVPR2018RefineDet论文阅读_single-shot refinement neural network for object detection

随便推点

PDF改背景和字体颜色_goodnotes中如何快速把底页颜色和字体颜色改变-程序员宅基地

文章浏览阅读2.4w次。想打印一个PDF, 却是很深的背景白的字, SIGH. 用Adobe Acrobat Professioinal 7.0打开, 发现只能一页一页的删除背景, 改字颜色, 如下: PDF中各部分是按元素保存的, 可以查看一个个元素, 包括背景, 图片, 文字, 可以对每个元素进行修改. 点击视图-->导览标签-->内容, 打开内容视图, 在这里可以看到所有的元素. 它们是以页面为分组, _goodnotes中如何快速把底页颜色和字体颜色改变

读透《阿里巴巴数据中台实践》,其到底有什么高明之处?_阿里数据中台 如何落实-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏66次。最近阿里巴巴分享了《阿里巴巴数据中台实践》这个PPT(自行搜索原始文章),对于数据中台的始作俑者,还是要怀着巨大的敬意去学习的,因此仔细的研读了,希望能发现一些不一样的东西。读这些专业的PPT,实际是非常耗时的,你需要把这些PPT外表的光鲜扒光,死抠上面的每一个字去理解底下隐藏的含义,然后跟你的已有知识体系去对比,看看是否有助于完善自己的认知,对于自己不理解的,还需要经常去检索相关的文档。..._阿里数据中台 如何落实

使用poi读取excel异常IOException: OPC Compliance error [M4.3]: Producers shall not create a document ele..._exception in thread "main" cn.hutool.poi.exception-程序员宅基地

文章浏览阅读4k次。前言:  前一段时间,帮女朋友整理她们公司的破Excel文档,本着减少工作量的原则(居家好男人),帮忙写了个java main去读取整理Excel,到后来发现在读取到xlsx的excel报错,报错信息居然没看懂。。。报错信息Exception in thread "main" cn.hutool.poi.exceptions.POIException: IOException: OPC Co..._exception in thread "main" cn.hutool.poi.exceptions.poiexception: ioexceptio

Beyond Compare文件比对_beyond compare 4.2 密钥-程序员宅基地

文章浏览阅读3.2k次。Beyond Compare_beyond compare 4.2 密钥

第一章:初探Spring Cloud Config配置集中管理_springcloud 集中配置管理-程序员宅基地

文章浏览阅读1.5k次。前路艰难,但谨记,你并不孤独。Spring Cloud如火如荼,抽空研究研究Spring大家族中的新份子。具体的介绍不会粗线在本系列博文中,如需要理论等知识直接百度or谷歌。Spring Cloud中保护N多已构建好的微服务,可以做到即插即用,其中大致包含几种服务:Config、Eureka、Ribbon、Hystrix、Feign、Bus等,具体介绍及开源地址请见:Spring Cloud中文官_springcloud 集中配置管理

leetcode647. 回文子串_leetcode 647-程序员宅基地

文章浏览阅读116次。题目大意给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".解题思路动态规划,判断s[i]~s[j]是否是回文串,如果是回文串,res++。class Solution {_leetcode 647

推荐文章

热门文章

相关标签