资源描述
#Arduino 语法
setup() 初始化函数
loop() 循环体函数
控制语句类似于C
//if if...else for switch case while do... while break continue return goto
扩展语法类似于C
//;(分号) {}(花括号) //(单行注释) /* */(多行注释) #define #include
算数运算符类似于C
//=(赋值运算符) +(加) -(减) *(乘) /(除) %(模)
比较运算符类似于C
//==(等于) !=(不等于) <(不大于) >(不不大于) <=(不大于等于) >=(不不大于等于)
布尔运算符类似于C
//&&(与) ||(或) !(非)
指针运算符类似于C
//* 取消引用运算符 & 引用运算符
位运算符类似于C
& (bitwise and) | (bitwise or) ^ (bitwise xor) ~ (bitwise not) << (bitshift left) >> (bitshift right)
复合运算符类似于C
++ (increment) -- (decrement) += (compound addition) -= (compound subtraction) *= (compound multiplication) /= (compound division) &= (compound bitwise and) |= (compound bitwise or)
常量
constants 预定义常量
BOOL true false
引脚电压定义,HIGH和LOW【当读取(read)或写入(write)数字引脚时只有两个也许值: HIGH 和 LOW 】
HIGH(参照引脚)含义取决于引脚(pin)设立,引脚定义为INPUT或OUTPUT时含义有所不同。当一种引脚通过pinMode被设立为INPUT,并通过digitalRead读取(read)时。如果当前引脚电压不不大于等于3V,微控制器将会返回为HIGH。 引脚也可以通过pinMode被设立为INPUT,并通过digitalWrite设立为HIGH。输入引脚值将被一种内在20K上拉电阻 控制 在HIGH上,除非一种外部电路将其拉低到LOW。 当一种引脚通过pinMode被设立为OUTPUT,并digitalWrite设立为HIGH时,引脚电压应在5V。在这种状态下,它可以 输出电流 。例如,点亮一种通过一串电阻接地或设立为LOWOUTPUT属性引脚LED。
LOW含义同样取决于引脚设立,引脚定义为INPUT或OUTPUT时含义有所不同。当一种引脚通过pinMode配备为INPUT,通过digitalRead设立为读取(read)时,如果当前引脚电压不大于等于2V,微控制器将返回为LOW。 当一种引脚通过pinMode配备为OUTPUT,并通过digitalWrite设立为LOW时,引脚为0V。在这种状态下,它可以 倒灌 电流。例如,点亮一种通过串联电阻连接到+5V,或到另一种引脚配备为OUTPUT、HIGHLED。
数字引脚(Digital pins)定义,INPUT和OUTPUT【数字引脚当作 INPUT 或 OUTPUT都可以 。用pinMode()办法使一种数字引脚从INPUT到OUTPUT变化】
Arduino(Atmega)引脚通过pinMode()配备为 输入(INPUT) 即是将其配备在一种高阻抗状态。配备为INPUT引脚可以理解为引脚取样时对电路有极小需求,即等效于在引脚前串联一种100兆欧姆(Megohms)电阻。这使得它们非常利于读取传感器,而不是为LED供电。
引脚通过pinMode()配备为 输出(OUTPUT) 即是将其配备在一种低阻抗状态。
这意味着它们可觉得电路提供充分电流。Atmega引脚可以向其她设备/电路提供(提供正电流positive current)或倒灌(提供负电流negative current)达40毫安(mA)电流。这使得它们利于给LED供电,而不是读取传感器。输出(OUTPUT)引脚被短路接地或5V电路上会受到损坏甚至烧毁。Atmega引脚在为继电器或电机供电时,由于电流局限性,将需要某些外接电路来实现供电。
整数常量
进制 例子 格式 备注
10(十进制) 123 无
2(二进制) B1111011 前缀'B' 只合用于8位值(0到255)字符0-1有效
8(八进制) 0173 前缀”0” 字符0-7有效
16(十六进制) 0x7B 前缀”0x” 字符0-9,A-F,A-F有效
小数是十进制数。这是数学常识。如果一种数没有特定前缀,则默以为十进制。
二进制以2为基底,只有数字0和1是有效。
'u' or 'U' 指定一种常量为无符号型。(只能表达正数和0) 例如: 33u
'l' or 'L' 指定一种常量为长整型。(表达数范畴更广) 例如: 100000L
'ul' or 'UL' 这个你懂,就是上面两种类型,称作无符号长整型。 例如:32767ul
浮点常量
浮点数 被转换为 被转换为
10.0 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 - object array -(数组)
数据类型转换类似于C
char() byte() int() word() long() float()
word()
把一种值转换为word数据类型值,或由两个字节创立一种字符。
word(x)
word(h, l)
参数
X:任何类型值
H:高阶(最左边)字节
L:低序(最右边)字节
修饰符类似于C
static volatile const
辅助工具
sizeof()
数字 I/O
pinMode()
将指定引脚配备成输出或输入【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
delay(1000); //等待第二个
}
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号引脚输入模式,需要使用外部上拉下拉电阻。
digitalRead()
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值设立为按钮值
}
模仿 I/O
analogReference()
analogReference(type)
配备用于模仿输入基准电压(即输入范畴最大值)。选项有:
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整数值
例子:
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
analogWrite(pin,value)
从一种引脚输出模仿值(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函数没有直接关系。
pin:用于输入数值引脚。
value:占空比:0(完全关闭)到255(完全打开)之间。
例子:
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()将不会有效果。
noTone(pin)
pin: 所要停止产生声音引脚
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 data= 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
//引脚连接到74HC595ST_CP
int latchPin = 8;
//引脚连接到74HC595SH_CP
int clockPin = 12;
// //引脚连接到74HC595DS
int dataPin = 11;
void setup() {
//设立引脚为输出
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//向上计数程序
for(J = 0; J <256; J + +){
//传播数据时候将latchPin拉低
digitalWrite(latchpin, LOW);
shiftOut(dataPin,clockPin,LSBFIRST,J);
//之后将latchPin拉高以告诉芯片
//它不需要再接受信息了
digitalWrite(latchpin, HIGH);
delay(1000);
}
}
shiftIn()
将一种数据一种字节一位一位移入。从最高有效位(最左边)或最低有效位(最右边)开始。对于每个位,先拉高时钟电平,再从数据传播线中读取一位,再将时钟线拉低。
注意:这是一种软件实现;Arduino提供了一种硬件实现SPI库,它速度更快但只在特定脚有效。
shiftIn(dataPin,clockPin,bitOrder)
dataPin:输出每一位数据引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位顺序,最高位优先或最低位优先
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 是一种无符号长整数,试图和其她数据类型(如整型数)做数学运算也许会产生错误
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毫秒)
参数: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()代替。
例子:
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微秒
}
数学运算
min() max() abs()
constrain(x,a,b)【将一种数约束在一种范畴内】
map(value, fromLow, fromHigh, toLow, toHigh)
value:需要映射值
fromLow:当前范畴值下限
fromHigh:当前范畴值上限
toLow:目的范畴值下限
toHigh:目的范畴值上限
例子:
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(base, exponent) sqrt(x)
三角函数
sin() cos() tan()
随机数
randomSeed()【随机数种子】 random()【random(max),random(min, max)】
位操作
lowByte() 取一种变量(例如一种字)低位(最右边)字节。
highByte() 提取一种字节高位(最左边),或一种更长字节第二低位。
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) 需要计算位
设立中断函数
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 当引脚由高电平变为低电平时,触发中断.
当中断函数发生时,delya()和millis()数值将不会继续变化。当中断发生时,串口收到数据也许会丢失。你应当声明一种变量来在未发生中断时储存变量。
在单片机自动化程序中当突发事件发生时,中断是非常有用,它可以协助解决时序问题。一种使用中断任务也许会读一种旋转编码器,监视顾客输入。
如果你想以保证程序始终抓住一种旋转编码器脉冲,从来不缺少一种脉冲,它将使写一种程序做任何事情都要非常棘手,由于该筹划将需要不断轮询传感器线编码器,为了赶上脉冲发生时。其她传感器也是如此,如试图读取一种声音传感器正试图赶上一按,或红外线槽传感器(照片灭弧室),试图抓住一种硬币下降。在所有这些状况下,使用一种中断可以释放微控制器来完毕其她某些工作。
例子:
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
展开阅读全文