Arduino语言

Arduino语言是建立在C/C++基础上的,其实也就是基础的C语言,Arduino语言只不过把AVR单片机(微控制器)相关的一些参数设置函数化,不用我们去了解他的底层,让我们不了解AVR单片机(微控制器)的朋友也能轻松上手。

在与Arduino DIYER接触的这段时间里,发现有些朋友对Arduino语言还是比较难入手,那么这里我就简单的注释一下Arduino语言(本人也是半罐子水,有错的地方还请各位指正)。

基础C语言

关键字:

if...else

必须紧接着一个问题表示式(expression),若这个表示式为真,紧连着表示式后的代码就会被执行。若这个表示式为假,则执行紧接着else之后的代码. 只使用 if不搭配else是被允许的。

范例:

if (val == 1) {

digitalWrite(LED,HIGH);

}

for

用来明定一段区域代码重复指行的次数。

范例:

for (int i = 0; i < 10; i++) {

Serial.print("ciao");

}

switch case

if叙述是程序里的分叉路口,switch case 是更多选项的路口。Swith case 根据变量值让程序有更多的选择,比起一串冗长的if叙述,使用swith case可使程序代码看起来比较简洁。

范例 :

switch (sensorValue) {

case 23:

digitalWrite(13,HIGH);

break;

case 46:

digitalWrite(12,HIGH);

break;

default: // 以上条件都不符时,预设执行的动作

digitalWrite(12,LOW);

digitalWrite(13,LOW);

}

while

while之后的条件成立时,执行括号内的程序代码。

范例 :

// sensor值小于512,闪烁LED

sensorValue = analogRead(1);

while (sensorValue < 512) {

digitalWrite(13,HIGH);

delay(100);

digitalWrite(13,HIGH);

delay(100);

sensorValue = analogRead(1);

}

do... while

while 相似,不同的是while前的那段程序代码会先被执行一次,不管特定的条件式为真或为假。因此若有一段程序代码至少需要被执行一次,就可以使用do…while架构。

范例 :

do {

digitalWrite(13,HIGH);

delay(100);

digitalWrite(13,HIGH);

delay(100);

sensorValue = analogRead(1);

} while (sensorValue < 512);

break

让程序代码跳离循环,并继续执行这个循环之后的程序代码。此外,在break也用于分隔switch case 不同的叙述。

范例 :

//sensor值小于512,闪烁LED

do {

// 按下按钮离开循环

if (digitalRead(7) == HIGH)

break;

digitalWrite(13,HIGH);

delay(100);

digitalWrite(13,HIGH);

delay(100);

sensorValue = analogRead(1);

} while (sensorValue < 512);

continue

用于循环之内,它可以强制跳离接下来的程序,并直接执行下一个循环。

范例 :

for (light = 0; light < 255; light++)

{

// 忽略数值介于 140  200之间

if ((x > 140) && (x < 200))

continue;

analogWrite(PWMpin, light);

delay(10);

}

return

函数的结尾可以透过return回传一个数值。

例如,有一个计算现在温度的函数叫 computeTemperature(),你想要回传现在的温度给temperature变量,你可以这样写:

int temperature = computeTemperature();

int computeTemperature() {

int temperature = 0;

temperature = (analogRead(0) + 45) / 100;

return temperature;

}

goto

语法符号:

; (分号)

Arduino 语言每一行程序都是以分号为结尾。这样的语法让你可以自由地安排代码,你可以将两个指令放置在同一行,只要中间用分号隔开。 (但这样做可能降低程式的可读性。)范例:delay(100);

{} (大括号)

大括号用来将程式代码分成一个又一个的区块,如以下范例所示,在loop()函数的前、后,必须用大括号括起来。

范例:void loop(){Serial.pritln("cial");}

程式的注释就是对代码的解释说明,编写注释有助于程式设计师(或其他人)了解代码的功能Arduino处理器在对程式码进行编译时会忽略注释的部份。Arduino 语言中的编写注释有两种方式//单行注释:这整行的文字会被处理器忽略/*多行注释在这个范围内你可以写一整首诗*/

运算符:

=

+ 相加

- 相减

* 相乘

/ 相除

% 余数除法

== 等于

!=不等于

< 小于

> 大于

<= 小于等于

>= 大于等于

&& 交集

|| 联集

! 反相

++ 累加

-- 递减

+=

-=

*=

/=

数据类型: 

boolean 布林

布尔变数的值只能为真(true)或是假(false)
char 字符

单一字符例如 A,和一般的计算机做法一样Arduino 将字符储存成一个数字,即使你看到的明明就是一个文字。

用数字表示一个字符时,它的值有效范围为 -128 127

注意:有两种主流的计算机编码系统ASCII UNICODEASCII 表示了127个字符,用来在序列终端机和分时计算器之间传输文字。

UNICODE可表示的字符量比较多,在现代计算机操作系统内它可以用来表示多国语言。

在位数需求较少的信息传输时,例如意大利文或英文这类由拉丁文,阿拉伯数字和一般常见符号构成的语言,ASCII仍是目前主要用来交换信息的编码法。
byte 字节类型

储存的数值范围为0255。如同字符一样字节型态的变量只需要用一个字节(8)的内存空间储存。 
int整数

整数数据型态用到2字节的内存空间,可表示的整数范围为 –32,768  32,767; 整数变量是Arduino内最常用到的数据型态。unsigned int      无符号整数(绝对值)

无号整数同样利用2字节的内存空间,无号意谓着它不能储存负的数值,因此无号整数可表示的整数范围为0  65,535
long长整数

长整数利用到的内存大小是整数的两倍,因此它可表示的整数范围从 –2,147,483,648  2,147,483,647unsigned long        无符号长整数

无号长整数可表示的整数范围为0  4,294,967,295
float浮点数

浮点数就是用来表达有小数点的数值,每个浮点数会用掉四字节的RAM,注意芯片内存空间的限制,谨慎的使用浮点数double 双字节浮点

也叫双精度浮点数,可表达最大值为 1.7976931348623157 x 10308
string字符串

字符串用来表达文字信息,它是由多个ASCII字符组成(你可以透过序串端口发送一个文字讯息或者将之显示在液晶显示器上)。字符串中的每一个字符都用一个组元组空间储存,并且在字符串的最尾端加上一个空字符以提示Ardunio处理器字符串的结束。下面两种宣告方式是相同的。

例如:

char string1[] = "Arduino";//7字符+1空字符

char string2[8] = "Arduino"; // 与上行相同array数组

一串变量可以透过索引去直接取得。假如你想要储存不同程度的LED亮度时,你可以宣告六个变量light01light02light03light04light05light06,但其实你有更好的选择,例如宣告一个整数数组变量如下:

int  light[6] = {0 , 20 , 50 , 75 , 100}

"array" 这个字为没有直接用在变量宣告,而是[]{}宣告数组。控制指令

数据类型转换:

char()

byte()

int()

long()

float()

常量:在Arduino语言中事先定义了一些具特殊用途的保留字。

HIGH | LOW

 表示数字IO口的电平,HIGH 表示高电平(1),LOW 表示低电平(0)。 HIGH 和LOW 也用来表示你开启或是关闭了一个Arduino的脚位(pin)

INPUT | OUTPUT

表示数字IO口的方向,INPUT 表示输入(高阻态),OUTPUT 表示输出(AVR能提供5V电压 40mA电流)

true | false

true 表示真(1),false表示假(0)。

变数:

变量用来指定Arduino 内存中的一个位置,变量可以用来储存数据,程序人员可以透过脚本代码去不限次数的操作变数的值。

因为Arduino 是一个非常简易的微处理器,但你要宣告一个变量时必须先定义他的数据型态,好让微处理器知道准备多大的空间以储存这个变量值

以上为基础c语言的关键字和符号,有c语言基础的都应该了解其含义,这里也不作过多的解释。

Arduino 语言

结构

1、声明变量及接口名称(int val;int ledPin=13;)。

2、void setup()

在程序开始时使用,在这个函数范围内放置初始化Arduino 板子的程式,主要程式开始撰写前, 使Arduino 板子装置妥当的指令可以初始化变量、管脚接口模式、启用库等(例如:pinMode(ledPin,OUTPUT);)。3、void loop()

在setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。连续执行函数内的语句,这部份的程式会一直重复的被执行,直到Arduino 板子被关闭。

功能

数字 I/O

pinMode(pin, mode)

数字IO口输入输出模式定义函数,将接口定义为输入或输出接口,用在setup()函数里,pin表示为0~13接口名称, mode表示为INPUT或OUTPUT。即“ pinMode(接口名称,OUTPUT或INPUT)”。

范例 :

pinMode(7,INPUT); // 将脚位 7 设定为输入模式

digitalWrite(pin, value)

数字IO口输出电平定义函数,将数字接口值至高或低、开或关,pin表示为0~13,value表示为HIGH或LOW,即digitalWrite(接口名称, HIGH或LOW)。但脚位必须先透过pinMode明示为输入或输出模式digitalWrite才能生效。比如定义HIGH可以驱动LED。

范例 :

digitalWrite(8,HIGH); //将脚位 8设定输出高电位

int digitalRead(pin)

数字IO口读输入电平函数,读出数字接口的值,pin表示为0~13,value表示为HIGH或LOW,即digitalRead(接口名称)。比如可以读数字传感器。当感测到脚位处于高电位时时回传HIGH,否则回传LOW。

范例 :

val = digitalRead(7); // 读出脚位 7 的值并指定给 val

模拟 I/O

int analogRead(pin)

模拟IO口读函数,从指定的模拟接口读取值Arduino对该模拟值进行10-bit的数字转换,这个方法将输入的0-5电压值转换为 0到1023间的整数值。pin表示为0~5(Arduino Diecimila为0~5,Arduino nano为0~7)。即“analogRead(接口名称)”,比如可以读模拟传感器(10位AD,0~5V表示为0~1023)。

范例 :

val = analogRead(0); //读出类比脚位 0 的值并指定给 val变数

analogWrite(pin, value)

 数字IO口PWM输出函数,给一个接口写入模拟值(PWM波)。改变PWM脚位的输出电压值。对于 ATmega168芯片的Arduino(包括Mini或BT),该函数可以工作于 3, 5, 6, 9, 10和 11号接口,即“analogWrite(接口名称, 数值)”,pin表示3, 5, 6, 9, 10, 11,value表示为0~255。比如可用于电机PWM调速或音乐播放。

例如:输出电压2.5伏特(V),该值大约是128。

范例 :

analogWrite(9,128); // 输出电压约2.5伏特(V

扩展 I/O

shiftOut(dataPin, clockPin, bitOrder, value)

SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,把资料传给用来延伸数位输出的暂存器,此函式通常使用在延伸数位的输出。函式使用一个脚位表示资料、一个脚位表示时脉。dataPin为数据口,clockPin为时钟口,bitOrder用来表示位元间移动的方式,为数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value会以byte形式输出,表示所要传送的数据(0~255),另外还需要一个IO口做74HC595的使能控制。

范例 :

shiftOut(dataPin, clockPin, LSBFIRST, 255);

unsigned long pulseIn(pin, value)

 脉冲长度记录函数,设定读取脚位状态的持续时间,返回时间参数(us),例如使用红外线、加速度感测器测得某一项数值时,在时间单位内不会改变状态。pin表示为0~13,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。

范例 :

time = pulsein(7,HIGH); // 设定脚位7的状态在时间单位内保持为HIGH

时间函数

unsigned long millis()

返回时间函数(单位ms),回传晶片开始执行到目前的毫秒,该函数是指,当程序运行就开始计时并返回记录的参数,该参数溢出大概需要50天时间。

范例:

duration = millis()-lastTime; // 表示自"lastTime"至当下的时间

delay(ms) 延时函数(单位ms),延时一段时间,暂停晶片执行多少毫秒,

delay(1000)为一秒。

范例:

delay(500); //暂停半秒(500毫秒)

delayMicroseconds(us) 延时函数(单位us)暂停晶片执行多少微秒

delayMicroseconds(1000); //暂停1豪秒

数学函数

min(x, y)

求最小值 ,回传两数之间较小者

范例:

val = min(10,20); // 回传10

max(x, y)

求最大值 ,回传两数之间较大者

范例:

val = max(10,20); // 回传20

abs(x)

    计算绝对值 ,回传该数的绝对值,可以将负数转正数。

范例:

val = abs(-5); // 回传5

constrain(x, a, b) 约束函数,下限a,上限b,判断x变数位于a与b之间的状态。x若小于a回传a;介于a与b之间回传x本身;大于b回传b

范例:

val = constrain(analogRead(0), 0, 255); // 忽略大于255的数

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

 约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间。将value变数依照fromLow与fromHigh范围,对等转换至toLow与toHigh范围。时常使用于读取类比讯号,转换至程式所需要的范围值。

例如:

val = map(analogRead(0),0,1023,100, 200); // 将analog0 所读取到的讯号对等转换至100200之间的数值。

pow(base, exponent)

开方函数,base的exponent次方。回传一个数(base)的指数(exponent)值。

范例:

double x = pow(y, 32); // 设定x为y的32次方

sq(x) 平方

sqrt(x)开根号

回传double型态的取平方根值。

范例:

double a = sqrt(1138); // 回传1138平方根的近似值 33.73425674438

三角函数

sin (rad)

回传角度(radians)的三角函数sine值。

范例:

double sine = sin(2); // 近似值 0.90929737091

cos(rad)   

回传角度(radians)的三角函数cosine值。

范例:

double cosine = cos(2); //近似值-0.41614685058

tan(rad)   

回传角度(radians)的三角函数tangent值。

范例:

double tangent = tan(2); //近似值-2.18503975868

© 著作权归作者所有,未经允许《AVR单片机微控制器参数设置都函数化的Arduino语言教学》不得转载

相关文章

最新文章

热门文章

热门TAG