1、Arduino 语法 setup() 初始化函数 loop() 循环体函数 控制语句类似于C //if if...else for switch case while do... while break continue return goto 扩展语法类似于C //;(分号) {}(花括号) //(单行注释) /* */(多行注释) #define #includ
2、e 算数运算符类似于C //=(赋值运算符) +(加) -(减) *(乘) /(除) %(模) 比较运算符类似于C //==(等于) !=(不等于) <(不大于) >(不不大于) <=(不大于等于) >=(不不大于等于) 布尔运算符类似于C //&&(与) ||(或) !(非) 指针运算符类似于C //* 取消引用运算符 & 引用运算符 位运算符类似于
3、C & (bitwise and) | (bitwise or) ^ (bitwise xor) ~ (bitwise not) << (bitshift left) >> (bitshift right) 复合运算符类似于C ++ (increment) -- (decrement) += (compound addition) -= (compound subtraction) *= (compound multiplication) /= (c
4、ompound division) &= (compound bitwise and) |= (compound bitwise or) 常量 constants 预定义常量 BOOL true false 引脚电压定义,HIGH和LOW【当读取(read)或写入(write)数字引脚时只有两个也许值: HIGH 和 LOW 】 HIGH(参照引脚)含义取决于引脚(pin)设立,引脚定义为INPUT或OUTPUT时含义有所不同。当一种引脚通过pinMode被设立为INPUT,并通过digitalR
5、ead读取(read)时。如果当前引脚电压不不大于等于3V,微控制器将会返回为HIGH。 引脚也可以通过pinMode被设立为INPUT,并通过digitalWrite设立为HIGH。输入引脚值将被一种内在20K上拉电阻 控制 在HIGH上,除非一种外部电路将其拉低到LOW。 当一种引脚通过pinMode被设立为OUTPUT,并digitalWrite设立为HIGH时,引脚电压应在5V。在这种状态下,它可以 输出电流 。例如,点亮一种通过一串电阻接地或设立为LOWOUTPUT属性引脚LED。 LOW含义同样取决于引脚设立,引脚定义为INPUT或OUTPUT时含义有所不同。当一种引
6、脚通过pinMode配备为INPUT,通过digitalRead设立为读取(read)时,如果当前引脚电压不大于等于2V,微控制器将返回为LOW。 当一种引脚通过pinMode配备为OUTPUT,并通过digitalWrite设立为LOW时,引脚为0V。在这种状态下,它可以 倒灌 电流。例如,点亮一种通过串联电阻连接到+5V,或到另一种引脚配备为OUTPUT、HIGHLED。 数字引脚(Digital pins)定义,INPUT和OUTPUT【数字引脚当作 INPUT 或 OUTPUT都可以 。用pinMode()办法使一种数字引脚从INPUT到OUTPUT变化】
7、 Arduino(Atmega)引脚通过pinMode()配备为 输入(INPUT) 即是将其配备在一种高阻抗状态。配备为INPUT引脚可以理解为引脚取样时对电路有极小需求,即等效于在引脚前串联一种100兆欧姆(Megohms)电阻。这使得它们非常利于读取传感器,而不是为LED供电。 引脚通过pinMode()配备为 输出(OUTPUT) 即是将其配备在一种低阻抗状态。 这意味着它们可觉得电路提供充分电流。Atmega引脚可以向其她设备/电路提供(提供正电流positive current)或倒灌(提供负电流negative current)达40毫安(mA)
8、电流。这使得它们利于给LED供电,而不是读取传感器。输出(OUTPUT)引脚被短路接地或5V电路上会受到损坏甚至烧毁。Atmega引脚在为继电器或电机供电时,由于电流局限性,将需要某些外接电路来实现供电。 整数常量 进制 例子 格式 备注 10(十进制) 123 无 2(二进制) B1111011 前缀'B' 只合用于8位值(0到255)字符0-1有效 8(八进制) 0173 前缀”0” 字符0-7有效 16(十六进制) 0x7B 前缀”0x” 字符0-
9、9,A-F,A-F有效 小数是十进制数。这是数学常识。如果一种数没有特定前缀,则默以为十进制。 二进制以2为基底,只有数字0和1是有效。 'u' or 'U' 指定一种常量为无符号型。(只能表达正数和0) 例如: 33u 'l' or 'L' 指定一种常量为长整型。(表达数范畴更广) 例如: 100000L 'ul' or 'UL' 这个你懂,就是上面两种类型,称作无符号长整型。 例如:32767ul 浮点常量 浮点数 被转换为 被转换为 10.0
10、 10 2.34E5 2.34 * 10^5 234000 67E-12 67.0 * 10^-12 0. 数据类型类似于C void boolean char unsigned char byte int unsigned int word long unsigned long float double string - char array String - obje
11、ct array -(数组) 数据类型转换类似于C char() byte() int() word() long() float() word() 把一种值转换为word数据类型值,或由两个字节创立一种字符。 word(x) word(h, l) 参数 X:任何类型值 H:高阶(最左边)字节 L:低序(最右边)字节 修饰符类似于C static vol
12、atile const 辅助工具 sizeof() 数字 I/O pinMode() 将指定引脚配备成输出或输入【pinMode(pin, mode) pin:要设立模式引脚 mode:INPUT或OUTPUT】 例子: ledPin = 13 // LED连接到数字脚13 void setup() { pinMode(ledPin,OUTPUT); //设立数字脚为输出 } void loop()
13、 { digitalWrite(ledPin,HIGH); //点亮LED delay(1000); // 等待一秒 digitalWrite(ledPin, LOW); // 灭掉LED delay(1000); //等待第二个 } digitalWrite() 给一种数字引脚写入HIGH或者LOW。 如果一种引脚已经使用pinMode()配备为OUTPUT模式,其电压将被设立为相应值,HIG
14、H为5V(3.3V控制板上为3.3V),LOW为0V。 如果引脚配备为INPUT模式,使用digitalWrite()写入HIGH值,将使内部20K上拉电阻(详见数字引脚教程)。写入LOW将会禁用上拉。上拉电阻可以点亮一种LED让其微微亮,如果LED工作,但是亮度很低,也许是由于这个因素引起。补救办法是 使用pinMode()函数设立为输出引脚。 注意:数字13号引脚难以作为数字输入使用,由于大某些控制板上使用了一颗LED与一种电阻连接到她。如果启动了内部20K上拉电阻,她电压将在1.7V左右,而不是正常5V,由于板载LED串联电阻把她使她降了下来,这意味着她返回值
15、总是LOW。如果必要使用数字13号引脚输入模式,需要使用外部上拉下拉电阻。 digitalRead() digitalRead(PIN)【pin:你想读取引脚号(int),返回 HIGH 或 LOW】 例子: ledPin = 13 // LED连接到13脚 int inPin = 7; // 按钮连接到数字引脚7 int val = 0; //定义变量存以储读值 void setup() { pinMode(ledPin, OUTPUT);
16、 // 将13脚设立为输出 pinMode(inPin, INPUT); // 将7脚设立为输入 } void loop() { val = digitalRead(inPin); // 读取输入脚 digitalWrite(ledPin, val); //将LED值设立为按钮值 } 模仿 I/O analogReference() analogReference(type) 配备用于模仿输入基
17、准电压(即输入范畴最大值)。选项有: 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)电
18、压作为基准电压。 type:使用哪种参照类型(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL) 变化基准电压后,之前从anal??ogRead()读取数据也许不精确。 不要在AREF引脚上使用使用任何不大于0V或超过5V外部电压。如果你使用AREF引脚上电压作为基准电压,你在调用analogRead()前必要设立参照类型为EXTERNAL。否则,你将会削短有效基准电压(内部产生)和AREF引脚,这也许会损坏您Arduino板上单片机。 此外,您可以在外部基准电压和AREF
19、引脚之间连接一种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
20、9 mV)每单位。输入范畴和精度可以使用analogReference()变化。 它需要大概100微秒(0.0001)来读取模仿输入,因此最大阅读速度是每秒10000次。 analogRead(PIN) 引脚:从输入引脚(大某些板子从0到5,Mini和Nano从0到7,Mega从0到15)读取数值,返回从0到1023整数值 例子: int analogPin = 3; //电位器(中间引脚)连接到模仿输入引脚3 //此外两个引脚分别接地和+5 V int va
21、l = 0; //定义变量来存储读取数值 void setup() { serial.begin(9600); //设立波特率(9600) } void loop() { val = analogRead(analogPin); //从输入引脚读取数值 serial.println(val); //显示读取数值 } analogWrite() - PWM analogWrite(pin,value)
22、 从一种引脚输出模仿值(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()。在
23、使用analogWrite()前,你不需要调用pinMode()来设立引脚为输出引脚。 analogWrite函数与模仿引脚、analogRead函数没有直接关系。 pin:用于输入数值引脚。 value:占空比:0(完全关闭)到255(完全打开)之间。 例子: int ledPin = 9; // LED连接到数字引脚9 int analogPin = 3; //电位器连接到模仿引脚3 int val = 0; //定义变量存以储读值 void setup()
24、 { pinMode(ledPin,OUTPUT); //设立引脚为输出引脚 } void loop() { val = analogRead(analogPin); //从输入引脚读取数值 analogWrite(ledPin,val / 4); // 以val / 4数值点亮LED(由于analogRead读取数值从0到1023,而analogWrite输出数值从0到255) } 高档 I/O tone() 在一种引脚上产
25、生一种特定频率方波(50%占空比)。持续时间可以设定,否则波形会始终产生直到调用noTone()函数。该引脚可以连接压电蜂鸣器或其她喇叭播放声音。 在同一时刻只能产生一种声音。如果一种引脚已经在播放音乐,那调用tone()将不会有任何效果。如果音乐在同一种引脚上播放,它会自动调节频率。 使用tone()函数会与3脚和11脚PWM产生干扰(Mega板除外)。 注意:如果你要在各种引脚上产生不同音调,你要在对下一种引脚使用tone()函数前对此引脚调用noTone()函数。 tone(pin, frequency) tone(
26、pin, frequency, duration) pin:要产生声音引脚 frequency: 产生声音频率,单位Hz,类型unsigned int duration:声音持续时间,单位毫秒(可选),类型unsigned long noTone() 停止由tone()产生方波。如果没有使用tone()将不会有效果。 noTone(pin) pin: 所要停止产生声音引脚 shiftOut() 将一种数据一种字节一位一位移出。从最高有效位(最左边)或
27、最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,批示刚才数据有效。 注意:如果你所连接设备时钟类型为上升沿,你要拟定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。 注意:这是一种软件实现;Arduino提供了一种硬件实现SPI库,它速度更快但只在特定脚有效。 shiftOut(dataPin, clockPin, bitOrder, value) dataPin:输出每一位数据引脚(int) clockPin:时钟脚,当dataPin有值
28、时此引脚电平变化(int) bitOrder:输出位顺序,最高位优先或最低位优先 value: 要移位输出数据(byte) dataPin和clockPin要用pinMode()配备为输出。 shiftOut当前只能输出1个字节(8位),因此如果输出值不不大于255需要分两步。 //最高有效位优先串行输出 int data= 500; //移位输出高字节 shiftOut(dataPin, clock, MSBFIRST, (data >> 8)); //移位输出低字节
29、 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
30、 //引脚连接到74HC595ST_CP int latchPin = 8; //引脚连接到74HC595SH_CP int clockPin = 12; // //引脚连接到74HC595DS int dataPin = 11; void setup() { //设立引脚为输出 pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, O
31、UTPUT); } void loop() { //向上计数程序 for(J = 0; J <256; J + +){ //传播数据时候将latchPin拉低 digitalWrite(latchpin, LOW); shiftOut(dataPin,clockPin,LSBFIRST,J); //之后将latchPin拉高以告诉芯片 //它不需要再接受信息了
32、 digitalWrite(latchpin, HIGH); delay(1000); } } shiftIn() 将一种数据一种字节一位一位移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传播线中读取一位,再将时钟线拉低。 注意:这是一种软件实现;Arduino提供了一种硬件实现SPI库,它速度更快但只在特定脚有效。 shiftIn(dataPin,clockPin,bitOrder) dat
33、aPin:输出每一位数据引脚(int) clockPin:时钟脚,当dataPin有值时此引脚电平变化(int) bitOrder:输出位顺序,最高位优先或最低位优先 pulseIn() 读取一种引脚脉冲(HIGH或LOW)。例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲长度,单位微秒。如果在指定期间内无脉冲函数返回。 此函数计时功能由经验决定,长时间脉冲计时也许会出错。计时范畴从10微秒至3分钟。(1秒=1000毫秒=1000000微
34、秒) 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;
35、 void setup() { pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH);; } 时间 millis() 返回Arduino开发板从运营当前程序开始毫秒数。这个数字将在约50天后溢出(归零) 例子: unsigned long time; void setup(){ Seria
36、l.begin(9600); } void loop(){ serial.print("Time:"); time = millis(); //打印从程序开始到当前时间 serial.println(time); //等待一秒钟,以免发送大量数据 delay(1000); } 参数 millis 是一种无符号长整数,试图和其她数据类型(如整型数)做数学运算也许会产生错误 micros()
37、 返回 Arduino 开发板从运营当前程序开始微秒数。这个数字将在约70分钟后溢出(归零)。在 16MHz Arduino 开发板上(例如 Duemilanove 和 Nano),这个函数辨别率为四微秒(即返回值总是四倍数)。在 8MHz Arduino 开发板上(例如 LilyPad),这个函数辨别率为八微秒。 注意 :每毫秒是1,000微秒,每秒是1,000,000微秒。 例子: unsigned long time; void setup(){ Serial.begin(9600);
38、 } void loop(){ Serial.print(“Time:”); time = micros(); //打印从程序开始时间 Serial.println(time); //等待一秒钟,以免发送大量数据 delay(1000); } delay() 使程序暂停设定期间(单位毫秒)。(一秒等于1000毫秒) 参数:ms:暂停毫秒数(unsigned long)
39、 例子: ledPin = 13 / / LED连接到数字13脚 void setup() { pinMode(ledPin, OUTPUT); // 设立引脚为输出 } void loop() { digitalWrite(ledPin, HIGH); // 点亮LED delay(1000); // 等待1秒 digitalWrite(ledPin, LOW); //
40、 灭掉LED delay(1000); // 等待一秒 } 虽然创立一种使用delay()闪烁LED很简朴,并且许多例子将很短delay用于消除开关抖动,delay()的确拥有诸多明显缺陷。在delay函数使用过程中,读取传感器值、计算、引脚操作均无法执行,因而,它所带来后果就是使其她大多数活动暂停。其她操作定期办法请参加millis()函数和它下面例子。大多数纯熟程序员普通避免超过10毫秒delay(),除非arduino程序非常简朴。 但某些操作在delay()执行时任然可以运营,由于dela
41、y函数不会使中断失效。通信端口RX接受到得数据会被记录,PWM(analogWrite)值和引脚状态会保持,中断也会按设定执行。 delayMicroseconds() 使程序暂停指定一段时间(单位微秒)。一毫秒等于一千微秒,一秒等于1000000微秒。 当前,可以产生最大延时精确值是16383。这也许会在将来Arduino版本中变化。对于超过几千微秒延迟,你应当使用delay()代替。 例子: int outPin = 8; // digital pin 8 void setup()
42、 { pinMode(outPin,OUTPUT); //设立为输出数字管脚 } void loop() { digitalWrite(outPin,HIGH); //设立引脚高电平 delayMicroseconds(50); // 暂停50微秒 digitalWrite(outPin, LOW); // 设立引脚低电平 delayMicroseconds(50); // 暂停50微秒
43、 } 数学运算 min() max() abs() constrain(x,a,b)【将一种数约束在一种范畴内】 map(value, fromLow, fromHigh, toLow, toHigh) value:需要映射值 fromLow:当前范畴值下限 fromHigh:当前范畴值上限 toLow:目的范畴值下限 toHigh:目的范畴值上限 例子: void setup(){} voi
44、d 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 -
45、 in_min) + out_min; } pow(base, exponent) sqrt(x) 三角函数 sin() cos() tan() 随机数 randomSeed()【随机数种子】 random()【random(max),random(min, max)】 位操作 lowByte() 取一种变量(例如一种字)低位(最右边)字节。 highByte() 提取一种字节高位(最左边),或一种更长字节第二低位。
46、 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() 清除一种数值型数值指定位(将此位设立成
47、 0) bitClear(x, n) X:指定要清除位数值 N:指定要清除位位置,从0开始,0 表达最右端位 bit() 计算指定位值(0位是1,1位是2,2位4,以此类推) bit(n) 需要计算位 设立中断函数 attachInterrupt() attachInterrupt(interrupt, function, mode) 当发生外部中断时,调用一种指定函数。当中断发生时,该函数会取代正在执行程序。大多数Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。 arduino M
48、ege有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18) interrupt:中断引脚数 function:中断发生时调用函数,此函数必要不带参数和不返回任何值。该函数有时被称为中断服务程序。 mode:定义何时发生中断如下四个contstants预定有效值: LOW 当引脚为低电平时,触发中断 CHANGE 当引脚电平发生变化时,触发中断 RISING 当引脚由低电平变为高电平时,触发中断 FALLING 当引脚由高电平变为低电平时,触发中断.
49、 当中断函数发生时,delya()和millis()数值将不会继续变化。当中断发生时,串口收到数据也许会丢失。你应当声明一种变量来在未发生中断时储存变量。 在单片机自动化程序中当突发事件发生时,中断是非常有用,它可以协助解决时序问题。一种使用中断任务也许会读一种旋转编码器,监视顾客输入。 如果你想以保证程序始终抓住一种旋转编码器脉冲,从来不缺少一种脉冲,它将使写一种程序做任何事情都要非常棘手,由于该筹划将需要不断轮询传感器线编码器,为了赶上脉冲发生时。其她传感器也是如此,如试图读取一种声音传感器正试图赶上一按,或红外线槽传感器(照片灭弧室),试图抓住一种
50、硬币下降。在所有这些状况下,使用一种中断可以释放微控制器来完毕其她某些工作。 例子: int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state);






