arduino 函数 api
程序结构
在Arduino中, 标准的程序入口main函数在内部被定义, 用户只需要关心以下两个函数:
void setup()
void loop()
setup() 函数用于初始化, loop() 函数用于执行. 初始化函数一般放在程序开头, 用于设置一些引脚的输出/输入模式, 初始化串口通讯等类似工作. loop() 函数中 的代码将被循环执行, 例如: 读入引脚状态, 设置引脚输出状态等.
控制语句
if,if...else,for,switch,while,do...while,break,continue,return,goto
相关语法
; (分号),(大括号),// (单行注释),/* */ (多行注释),#define,#include,
算术运算符
= (赋值),+ (加),- (减),* (乘),/ (除),% (取模)
比较运算符
== (等于),!= (不等于),< (小于),> (大于),<= (小于等于),>= (大于等于)
布尔运算符
&& (逻辑与)、|| (逻辑或)、! (逻辑非)
指针运算符
* 指针运算符 & 地址运算符
位运算
& (位与)、| (位或)、^ (位异或)、~ (位非)、<< (左移)、>> (右移)、端口操作
复合运算符
++ (自加)、-- (自减)、+= (复合加)、-= (复合减)、*= (复合乘)、/= (复合除)、&= (复合与)、|= (复合或)
常量
HIGH | LOW
INPUT | OUTPUT
true | false
整数常量
浮点数常量
数据类型
void(无类型)
word(字组) 0~65535 //16位
boolean(布尔型) 0~1 //1位
char(字符型) -128~+127 //8位
unsigned char(无符号字符型) 0~255 //8位
short -32768~+32767 //16位
byte(字节型) //8bit
int(整型) -2147483648~+2147483647 //32位
unsigned int(无符号整型) 0~65535 //16位
long(长整型) -2147483648~+2147483647 //32位
unsigned long(无符号长整型) 0~4297967295 //32位
float(单精度) -3.4028235E+38~+3.4028235E+38
double(双精度)
string(字符串)
array(数组)
数据类型转换
char(),byte(),int(),word(),long(),float()
变量作用域&修饰符
变量作用域
static (静态变量),volatile (易变变量),const (不可改变变量)
辅助工具
sizeof() (sizeof运算符)、ASCII码表
//基本函数
/**************数字I/O*************/
pinMode(pin,mode); //设置引脚输出状态
pinMode函数用于配置引脚为输入或输出模式,该函数是一个无返回值函数,函数有两个参数 pin 和 mode,pin参数表示所要配置的引脚,mode 参数表示设置的模式——INPUT(输入模式),OUTPUT(输出模式)和INPUT_PULLUP(输入模式,且引脚点位拉高);
digitalWrite(pin,value); //设置引脚的输出数据
digitalWrite函数的作用是设置引脚输出引脚引脚的电平为高电平或地电平。该函数是一个无返回值函数,函数有两个参数pin和value,pin参数表示所要配置的引脚,value参数表示输出电压——HIGH(高点平)和LOW(第电平)。
int digitalRead(pin); //引脚数据读取
digitalRead函数用在函数为输入情况,可以获取引脚电压的情况——HIGH(高电平)或LOW(低电平),参数 pin参数表示要获取电压值的引脚,该函数返回值为 int 类型,表示引脚的电压情况。
/*************模拟I/O*************/
analogRead(pin); //读取引脚的电压值
analogRead函数用于读取引脚的模拟量电压值,每一次读取需要消耗的时间为 100us。参数 pin参数表示要获取模拟量电压值的引脚,该函数返回值为 int 类型,表示模拟量电压值,范围在 0~1023。
analogWrite(pin,value); //设置引脚输出模拟量(PWM)
通过指定引脚输出模拟量(PWM),可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。
analogWrite()输出结束后,该引脚将产生一个稳定的特殊PWM波形,直到下次调用 analogWrite()(或在同一引脚使用digitalRead()或 digitalWrite())。
PWM信号的频率大约是490Hz。
在大多 Arduino板(ATmega168或ATmega328)上,只有引脚3,5,6,9,10和11可以实现该功能。AduinoMega上,引脚2~13可以实现该功能。Arduino旧版本的板子 (ATmega8)只有9,10,11可以使用 analogWrite()。
在使用 analogWrite()前,不需要使用 pinMode()来设定引脚。analogWrite函数与模拟引脚、analogRead函数没有直接关系。
analogReference(type); //设置模拟参考电压
analogReference函数的作用是配置引脚的参考电压。在嵌入式应用中引脚获取模拟电压值之后,将根据参考电压将模拟值转换到0~1023。该函数为无返回值函数,参考为 mode 类型,有 3 种类型(DEFAULT/INTERNAL/EXTERNAL),具体含义如下所表示。
NEFAULT:预设置,参考电压5V
INTERNAL:低电压模式,使用偏内基准电压源。
INTERNAL1V1:1V的内基准电压源(只能在 ArduinoMega使用)
INTERNAL2V56:56V的内基准电压源(只能在 ArduinoMega使用)
EXTERNAL:扩展模式,通过AREF引脚获取参考电压
实际电压 = (analogRead(pin)*基准电压)/1024;
/*************高级I/O************/
shiftOut(dataPin, clockPin, bitOrder, val); //将一个数据以此移出
这个函数的作用是将一个数据的一个字符组中的字符组中的字符以次移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据引脚写入每一个字符,之后时钟引脚被拉高或拉低,指示刚才的数据有效。
注意:如果链接的设备时钟类型为上升沿,就要确定在调用 shiftOut()前时钟引脚为低电平,如调用 digitalWrite(clockPin,LOW)。
这是一个软件实现的功能。
Arduino提供了一个硬件实现的ISP函数库,它速度更快,但只在特定引脚才会有效。
dataPin:数据输出引脚,数据的每一个字符将逐次输出。引脚模式需要设置成输出。
clockPin:时钟输出引脚,为数据输出提供时钟,引脚模式需要设置成输出。
bitOrder:数据位移顺序选择字符,该参数为byte类型,有两种类型可选择,分别是高位先入 MSBFIRST 和低位先入 LSBFIRST
val:所有输出的数据
shiftOut函数能够将数据通过串行的方式在引脚上输出,相当于一般意义上的同步串行通信,这是控制器与控制器,控制器与传感器之间常用的一种通信方式。
pulseIn(pin, state, timeout); //读取引脚上的脉冲时长
pin:读取脉冲的引脚编号
state:读取引脚的脉冲的电平状态
timeout:最大的读取时长(已um为单位)
/************时间函数************/
millis();
millis函数可通过返回值、返回获取机器运行的时间长度,单位为ms。系统最长的记录时间为9小时22分,如果超出时间从0开始。函数返回值为unsigned long 型,无参数。
delay(ms);
delay函数为一个延时函数,曾在Blink程序中用到,参数表示设置的延长时间,单位ms。
delayMicroseconds(us);
delayMicroseconds函数为一个延时函数,参数表示设置的延长时间,单位us。
/**************数学库************/
min(x, y); //返回两个参数中较小的值。
max(x, y); //返回两个参数中较大的值。
abs(x); //返回参数的绝对值。
constrain(amt, low, high); //区间
如果 amt<low,则返回low的值。
如果 amt>high,则返回high的值。
如果 low<amt<high,则返回amt的值。
map(x, in_min, in_max, out_min, out_max); //区间映射
map函数的作用是将[in_min,in_max]范围内的X等比映射到[out_min,out_max]范围内。意思是说,这个函数可以由原来的比例范围,换算成另一个比例范围。
x:判断的数字。
in_min:原来的数字范围最小的数值。
in_max:原来的数字范围最大的数值。
out_min:计算后范围最小的数值。
out_max:计算后范围最大的数值。
pow(base, exponent); //求 base的 exponent次方
sqrt(x); //求平方根
/************三角函数***********/
sin(rad); //正弦
cos(rad); //余弦
tan(rad); //正切
/**************随机数************/
randomSeed(seed); //生成伪随机数。(调用random函数)
long myRandomNumber = random(max);
random(howbig); //生成伪随机数。
random函数返回一个0~howbig-1之间的随机数。可以做模拟噪声信号。
random(howsmall, howbig);
/*********字符串(string)**********/
charAT(); //获取字符串的第 n 个字符
String1.charAT(n); //string是字符串的头指针
compareTo(); //比较两个字符串
compareTo函数是比较两个字符串,相同返回两个字符串当前比较字符串的差值。前-后
语法:string1.compareTo(string2);
string1:第一个字符串
string2:第二个字符串
concat(); //字符串拼接
string1.concat(string2); //把 string2拼接到 string1后面
endsWith(); //字符串尾部判断对比
string1.endsWith(string2); //判断 string1尾部是否是字符串 string2,当然你也可以用它来判断'\n'
equals(); //判断字符串是否相等。
string1.equals(string2);
string1:被判断的字符串
string2:判断的字符串
返回值是布尔类型,true 和 false
equalslgnoreCase(string2); //判读字符串口是否相等。
string1.equalslgnoreCase(string2);
string1:被判断的字符串
string2:判断的字符串
返回值是布尔类型,true 和 false
getBytes(); //字符串的复制和和函数 toCharArray()功能非常相识。
string1.getBytes(buf,len);
string1:原本的字符串
buf:要搬移的目的变量
len:字符串长度
indexOf(); //在字符串中选择特定的字符,并返回位置的功能函数。(正向)
如果你想在一个很长的字符串中查找这个特别的关键字,可以使用这个函数。
string1.indexOf(val);
string1.indexOf(val,from);
string1:原本的字符串
val:想要找的关键字,可以是char或 string 字符串。
from:选择性参数,你可以特别指定从那个位置开始寻找这个关键字。
返回值:成功返回位置,失败返回-1
lastlndexOf(); //在字符串中选择特定的字符串,并返回位置的功能函数。(反向)
string1.lastlndexOf(val);
string1.lastlndexOf(val,from);
string1:原本的字符串
val:想要找到的关键字,可以是char或者 string字符串。
from:选择性参数,你可以特别指定从那个位置回头寻找这个关键字。
返回值:成功返回位置,失败返回-1
length(); //测量字符长度
string1.length();
string1:要被测量的字符串。
返回值:字符串的长度。
replace(); //字符串替换
string1.replace(string2,string3);
string1:原本的字符串。
string2:在字符串中欲被替换的字符串。
string3:要替换之后的新字符串。
返回值:无
setCharAt(); //字符替换
string1.setCharAt(i,charl);
string1:原本的字符串。
i:字符串中欲被换掉的字符的位置。
charl:要替换的字符,注意只有一个字符,而不是字符串。
返回值:无
startsWith(); //判断字符串是否已某个特殊的字符串开始的
string1.starts With(string2);
string1:原本的字符串。
string2:判断是不是已这个字符串开始。
返回值:布尔代数,true 和 false
substring(); //用来截取字符串中间的某一位置。另外是决定那里结束。
string1.substring(from); //返回 from 之后的
string1.substring(from,to); //返回 from 和 to 之间的
string1:原本的字符串
from:要截取的字符串从第几个字开始。
to:要截取后面的第几个字。
返回值:返回的字符串。
toCharArray(); // 把string拷贝char中
toCharArray函数是字符串处理中常用的一个函数,你可以把他当成 string 转 char[] 的转换函数,或者复制文字的函数,他的功能和 getBytes()非常相似,toCharArray()函数转换后是呈现文字,而getBytes()函数转换后是呈现数字。
string1.toCharArray(buf,len);
string:原本的字符串。
buf:指定的char[]的位置,注意char[]的空间,一个要等于或大于复制的大小,不然存储器和程序都会产生不可预期的问题。
len:要复制的字符串长度。
返回值:要复制的字符串长度。
toInt(); // string 转 int
string1.toInt();
string1:字符串,如"123"
返回值:整数,如 123
toLowerCase(); //把英文全部转换为小写
string1.toLowerCase();
string1:字符串(全英文)
返回值:字符串(小写)
toUpperCase(); //把英文全部转换为大写
string1.toUpperCase();
string1:字符串(全英文)
返回值:字符串(大写)
trim(); //自动清除字符串中最前面和最后面的空白数据。
string1.trim();
string1:原本的字符串。
返回值:无。
/**************位操作************/
lowByte();
highByte();
bitRead();
bitWrite();
bitSet();
bitClear();
bit();
/*********设置中断函数***********/
attachInterrupt(interrupt, function, mode); //中断设置函数
attachInterrupt函数用于设置外部中断,函数有3个参数:interrupt、function、mode分别代表中断源,中断处理函数,触发模式。参数选项可选值0或1,在 Arduino中,一般对应2号和3号引脚;参数中断处理函数用来指定中段的处理函数,参数值为函数指针,
触发模式有4种:
LOW(低点平触发)、
CHANGE(变化时触发)、
RISING(低点平转为高点平)、
FALLING(高点平转为低点平触发)。
注意:
在中断函数中 delay函数不能使用。
在使用 millis函数始终返回进入中断前的值。
读取串行数据的话,可能会丢失。
中断函数中使用的变量需要定义为 volatile 类型。
detachInterrupt(interrupt); //取消中断
interrupt为所要取消的中断源。
/***********开关中断************/
interrupts(); //从新启用noInterrupts关闭的中断
noInterrupts(); //关闭已经开启的中断
/***********串口通讯************/
Serial.begin(speed); //设置串口的通信速率
speed:int 整数,用来设定传输速率,通常是这几个数:300,600,1200,2400,4800,9600,14400,19200,28800,18400,57600或115200
返回值:无
Serial.available(); //获取前串口缓冲池的数据量。串口的缓存区默认只有64字节,但大小是可以改变的,详情见:http://www.cnblogs.com/jikexianfeng/p/6250564.html
Serial.read(); //用来读取数据,每次只能读取一个字符。
Serial.available函数和 Serial.read函数通常是在一起使用,Serial.available函数是用来判断是否有数据送进来,我们接着用 Serial.read函数用来读取数据。
Serial.flush(); //清空缓冲区数据,Serial.flush()函数的功能在arduino1.0之前和之后版本是不一样的。之前版本是用来清除已经进入缓冲区的输入的串口数据,1.0版之后,用来等待要发送的串口数据发送完毕。详情:http://www.cnblogs.com/jikexianfeng/p/6250638.html
Serial.print(data); //串口输出
Serial.println(data); //串口输出(比print的尾部多一个换行符。)
/************扩展库************/
如果要使用一些已有的库, 可以选择菜单"Sketch->Import Library", 然后选择 相应的库. Sketch工具会自己在代码的开头包含库的头文件(#include).
在引入库之后, 程序的体积也将会增大(因为包含了库的代码). 对于不是必要的库, 直接删除对应的#include语句就可以了.
官方扩展库
以下是Arduino官方提供的扩展库, 被默认包含在开发工具中.
EEPROM - 读写EEPROM存储区.
Ethernet - 以太网支持.
Firmata - 基于串口的通讯协议.
LiquidCrystal - LCD液晶显示.
Servo - 伺服电机.
SoftwareSerial - 软件实现的串口, 可以选择任意引脚.
Stepper - 步进电机.
Wire - I2C协议支持.
Matrix - LED显示阵列控制.
Sprite - LED显示阵列中子块控制.
第三方扩展库
这里只包含了Roboduino扩展板的相关库, 其他的库信息请访问: Arduino在线文档 online~.
Roboduino扩展板:
RoboduinoMotor - Roboduino电机扩展板驱动.
如果需要设计自己的库, 请参考"arduino\hardware\libraries"目录中相关库的代码.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
参考书籍:http://blog.csdn.net/powenko/article/details/48570043#plain
参考文档:https://www.douban.com/note/493189178/
参考网站:http://wiring.org.co/reference/
参考网页:http://www.cnblogs.com/jikexianfeng/p/6031291.html
参考网页:http://www.cnblogs.com/rayray/p/3198091.html
参考网页:http://www.cnblogs.com/jikexianfeng/p/6250638.html