Arduino語言
Arduino使用C/C++編寫程序,雖然C++兼容C語言,但這是兩種語言,C語言是一種面向過程的編程語言,C++是一種面向?qū)ο蟮木幊陶Z言。早期的Arduino核心庫使用C語言編寫,后來引進(jìn)了面向?qū)ο蟮乃枷耄壳?a href="http://www.1cnz.cn/article/zt/" target="_blank">最新的Arduino核心庫采用C與C++混合編寫而成。
通常我們說的Arduino語言,是指Arduino核心庫文件提供的各種應(yīng)用程序編程接口(Application Programming Interface,簡稱API)的集合。這些API是對更底層的單片機(jī)支持庫進(jìn)行二次封裝所形成的。例如,使用AVR單片機(jī)的Arduino的核心庫是對AVR-Libc(基于GCC的AVR支持庫)的二次封裝。
傳統(tǒng)開發(fā)方式中,你需要厘清每個寄存器的意義及之間的關(guān)系,然后通過配置多個寄存器來達(dá)到目的。
關(guān)鍵字:
if.。.else
必須緊接著一個問題表示式(expression),若這個表示式為真,緊連著表示式后的代碼就會被執(zhí)行。若這個表示式為假,則執(zhí)行緊接著else之后的代碼。 只使用 if不搭配else是被允許的。
范例:
if (val == 1) {
}
for
用來明定一段區(qū)域代碼重復(fù)指行的次數(shù)。
范例:
for (int i = 0; i 《 10; i++) {
Serial.print(“ciao”);
}
switch case
if敘述是程序里的分叉路口,switch case 是更多選項的路口。Swith case 根據(jù)變量值讓程序有更多的選擇,比起一串冗長的if敘述,使用swith case可使程序代碼看起來比較簡潔。
范例 :
switch (sensorValue) {
case 23:
digitalWrite(13,HIGH);
break;
case 46:
digitalWrite(12,HIGH);
break;
default: // 以上條件都不符合時,預(yù)設(shè)執(zhí)行的動作
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}
while
當(dāng)while之后的條件成立時,執(zhí)行括號內(nèi)的程序代碼。
范例 :
// 當(dāng)sensor值小于512,閃爍LED燈
while (sensorValue 《 512) {
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
sensorValue = analogRead(1);
}
do...while
和while 相似,不同的是while前的那段程序代碼會先被執(zhí)行一次,不管特定的條件式為真或為假。因此若有一段程序代碼至少需要被執(zhí)行一次,就可以使用do…while架構(gòu)。
范例 :
do {
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
sensorValue = analogRead(1);
} while (sensorValue 《 512);
break
讓程序代碼跳離循環(huán),并繼續(xù)執(zhí)行這個循環(huán)之后的程序代碼。此外,在break也用于分隔switch case 不同的敘述。
范例 :
//當(dāng)sensor值小于512,閃爍LED燈
do {
// 按下按鈕離開循環(huán)
if (digitalRead(7) == HIGH)
break;
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,HIGH);
delay(100);
sensorValue = analogRead(1);
} while (sensorValue 《 512);
continue
用于循環(huán)之內(nèi),它可以強(qiáng)制跳離接下來的程序,并直接執(zhí)行下一個循環(huán)。
范例 :
for (light = 0; light 《 255; light++)
{
// 忽略數(shù)值介于 140 到 200之間
if ((x 》 140) && (x 《 200))
continue;
analogWrite(PWMpin, light);
delay(10);
}
return
函數(shù)的結(jié)尾可以透過return回傳一個數(shù)值。
例如,有一個計算現(xiàn)在溫度的函數(shù)叫 computeTemperature(),你想要回傳現(xiàn)在的溫度給temperature變量,你可以這樣寫:
int temperature = computeTemperature();
int computeTemperature() {
int temperature = 0;
temperature = (analogRead(0) + 45) / 100;
return temperature;
}
goto
語法符號:
//單行注釋: /*多行注釋:在這個范圍內(nèi)你可以寫一整首詩*/
運(yùn)算符:
% 余數(shù)除法== 等于 !=不等于《= 小于等于》= 大于等于&& 交集|| 聯(lián)集
! 反相
數(shù)據(jù)類型:
boolean 布林
布爾變數(shù)的值只能為真(true)或是假(false)
char 字符
單一字符例如 A,和一般的計算機(jī)做法一樣Arduino 將字符儲存成一個數(shù)字,即使你看到的明明就是一個文字。
用數(shù)字表示一個字符時,它的值有效范圍為 -128 到127。
注意:有兩種主流的計算機(jī)編碼系統(tǒng)ASCII 和UNICODE。ASCII 表示了127個字符, 用來在序列終端機(jī)和分時計算器之間傳輸文字。
UNICODE可表示的字符量比較多,在現(xiàn)代計算機(jī)操作系統(tǒng)內(nèi)它可以用來表示多國語言。
在位數(shù)需求較少的信息傳輸時,例如意大利文或英文這類由拉丁文,阿拉伯?dāng)?shù)字和一般常見符號構(gòu)成的語言,ASCII仍是目前主要用來交換信息的編碼法。
byte 字節(jié)類型
儲存的數(shù)值范圍為0到255。如同字符一樣字節(jié)型態(tài)的變量只需要用一個字節(jié)(8位)的內(nèi)存空間儲存。
int 整數(shù)
整數(shù)數(shù)據(jù)型態(tài)用到2字節(jié)的內(nèi)存空間,可表示的整數(shù)范圍為 –32,768 到 32,767; 整數(shù)變量是Arduino內(nèi)最常用到的數(shù)據(jù)型態(tài)。
unsigned int 無符號整數(shù)(絕對值)
無號整數(shù)同樣利用2字節(jié)的內(nèi)存空間,無號意謂著它不能儲存負(fù)的數(shù)值,因此無號整數(shù)可表示的整數(shù)范圍為0 到 65,535。
long 長整數(shù)
長整數(shù)利用到的內(nèi)存大小是整數(shù)的兩倍,因此它可表示的整數(shù)范圍從 –2,147,483,648 到 2,147,483,647。
unsigned long 無符號長整數(shù)
無號長整數(shù)可表示的整數(shù)范圍為0 到 4,294,967,295。
float 浮點(diǎn)數(shù)
浮點(diǎn)數(shù)就是用來表達(dá)有小數(shù)點(diǎn)的數(shù)值,每個浮點(diǎn)數(shù)會用掉四字節(jié)的RAM,注意芯片內(nèi)存空間的限制,謹(jǐn)慎的使用浮點(diǎn)數(shù)
double 雙字節(jié)浮點(diǎn)
也叫雙精度浮點(diǎn)數(shù),可表達(dá)最大值為 1.7976931348623157 x 10308。
string 字符串
字符串用來表達(dá)文字信息,它是由多個ASCII字符組成(你可以透過序串端口發(fā)送一個文字訊息或者將之顯示在液晶顯示器上)。字符串中的每一個字符都用一個組元組空間儲存,并且在字符串的最尾端加上一個空字符以提示Ardunio處理器字符串的結(jié)束。下面兩種宣告方式是相同的。
例如:
char string1[] = “Arduino”;//7字符+1空字符
char string2[8] = “Arduino”; // 與上行相同
array 數(shù)組
一串變量可以透過索引去直接取得。假如你想要儲存不同程度的LED亮度時,你可以宣告六個變量light01,light02,light03,light04,light05,light06,但其實你有更好的選擇,例如宣告一個整數(shù)數(shù)組變量如下:
int light[6] = {0 , 20 , 50 , 75 , 100}
“array” 這個字為沒有直接用在變量宣告,而是[]和{}宣告數(shù)組。
控制指令
數(shù)據(jù)類型轉(zhuǎn)換:
char() byte() int() long() float()
常量:在Arduino語言中事先定義了一些具特殊用途的保留字。
HIGH | LOW
表示數(shù)字IO口的電平,HIGH 表示高電平(1),LOW 表示低電平(0)。 HIGH 和LOW 也用來表示你開啟或是關(guān)閉了一個Arduino的腳位(pin)
INPUT | OUTPUT
表示數(shù)字IO口的方向,INPUT 表示輸入(高阻態(tài)),OUTPUT 表示輸出(AVR能提供5V電壓 40mA電流)。
true | false
true 表示真(1),false表示假(0)。
變數(shù):
變量用來指定Arduino 內(nèi)存中的一個位置,變量可以用來儲存數(shù)據(jù),程序人員可以透過腳本代碼去不限次數(shù)的操作變數(shù)的值。
因為Arduino 是一個非常簡易的微處理器,但你要宣告一個變量時必須先定義他的數(shù)據(jù)型態(tài),好讓微處理器知道準(zhǔn)備多大的空間以儲存這個變量值。
以上為基礎(chǔ)c語言的關(guān)鍵字和符號,有c語言基礎(chǔ)的都應(yīng)該了解其含義,這里也不作過多的解釋。
Arduino 語言
結(jié)構(gòu)
1、聲明變量及接口名稱(int val;int ledPin=13;)。
2、void setup()
在程序開始時使用,在這個函數(shù)范圍內(nèi)放置初始化Arduino 板子的程式,主要程式開始撰寫前, 使Arduino 板子裝置妥當(dāng)?shù)闹噶羁梢猿跏蓟兞俊⒐苣_接口模式、啟用庫等(例如:pinMode(ledPin,OUTPUT);)。
3、void loop()
在setup()函數(shù)之后,即初始化之后,loop() 讓你的程序循環(huán)地被執(zhí)行。使用它來運(yùn)轉(zhuǎn)Arduino。連續(xù)執(zhí)行函數(shù)內(nèi)的語句,這部份的程式會一直重復(fù)的被執(zhí)行,直到Arduino 板子被關(guān)閉。
功能
數(shù)字 I/O
pinMode(pin, mode)
數(shù)字IO口輸入輸出模式定義函數(shù),將接口定義為輸入或輸出接口,用在setup()函數(shù)里,pin表示為0~13接口名稱, mode表示為INPUT或OUTPUT。即“ pinMode(接口名稱,OUTPUT或INPUT)”。
范例 :
pinMode(7,INPUT); // 將腳位 7 設(shè)定為輸入模式
pinMode(1,INPUT);//將腳位1設(shè)定為輸入模式
pinMode(2,INPUT);//將腳位2設(shè)定為輸入模式
pinMode(3,INPUT);//將腳位3設(shè)定為輸入模式
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
digitalWrite(pin, value)
數(shù)字IO口輸出電平定義函數(shù),將數(shù)字接口值至高或低、開或關(guān),pin表示為0~13,value表示為HIGH或LOW,即digitalWrite(接口名稱, HIGH或LOW)。但腳位必須先透過pinMode明示為輸入或輸出模式digitalWrite才能生效。比如定義HIGH可以驅(qū)動LED。
范例 :
digitalWrite(8,HIGH); //將腳位 8設(shè)定輸出高電位
int digitalRead(pin)
數(shù)字IO口讀輸入電平函數(shù),讀出數(shù)字接口的值,pin表示為0~13,value表示為HIGH或LOW,即digitalRead(接口名稱)。比如可以讀數(shù)字傳感器。當(dāng)感測到腳位處于高電位時時回傳HIGH,否則回傳LOW。
范例 :
val = digitalRead(7); // 讀出腳位 7 的值并指定給 val
模擬 I/O
int analogRead(pin)
模擬IO口讀函數(shù),從指定的模擬接口讀取值,Arduino對該模擬值進(jìn)行10-bit的數(shù)字轉(zhuǎn)換,這個方法將輸入的0-5電壓值轉(zhuǎn)換為 0到1023間的整數(shù)值。pin表示為0~5(Arduino Diecimila為0~5,Arduino nano為0~7)。即“analogRead(接口名稱)”,比如可以讀模擬傳感器(10位AD,0~5V表示為0~1023)。
范例 :
val = analogRead(0); //讀出類比腳位 0 的值并指定給 val變數(shù)
analogWrite(pin, value)
數(shù)字IO口PWM輸出函數(shù),給一個接口寫入模擬值(PWM波)。改變PWM腳位的輸出電壓值。對于 ATmega168芯片的Arduino(包括Mini或BT),該函數(shù)可以工作于 3, 5, 6, 9, 10和 11號接口,即“analogWrite(接口名稱, 數(shù)值)”,pin表示3, 5, 6, 9, 10, 11,value表示為0~255。比如可用于電機(jī)PWM調(diào)速或音樂播放。
例如:輸出電壓2.5伏特(V),該值大約是128。
范例 :
analogWrite(9,128); // 輸出電壓約2.5伏特(V)
擴(kuò)展 I/O
shiftOut(dataPin, clockPin, bitOrder, value)
SPI外部IO擴(kuò)展函數(shù),通常使用帶SPI接口的74HC595做8個IO擴(kuò)展,把資料傳給用來延伸數(shù)位輸出的暫存器,此函式通常使用在延伸數(shù)位的輸出。函式使用一個腳位表示資料、一個腳位表示時脈。dataPin為數(shù)據(jù)口,clockPin為時鐘口,bitOrder用來表示位元間移動的方式,為數(shù)據(jù)傳輸方向(MSBFIRST高位在前,LSBFIRST低位在前),value會以byte形式輸出,表示所要傳送的數(shù)據(jù)(0~255),另外還需要一個IO口做74HC595的使能控制。
范例 :
shiftOut(dataPin, clockPin, LSBFIRST, 255);
unsigned long pulseIn(pin, value)
脈沖長度記錄函數(shù),設(shè)定讀取腳位狀態(tài)的持續(xù)時間,返回時間參數(shù)(us),例如使用紅外線、加速度感測器測得某一項數(shù)值時,在時間單位內(nèi)不會改變狀態(tài)。pin表示為0~13,value為HIGH或LOW。比如value為HIGH,那么當(dāng)pin輸入為高電平時,開始計時,當(dāng)pin輸入為低電平時,停止計時,然后返回該時間。
范例 :
time = pulsein(7,HIGH); // 設(shè)定腳位7的狀態(tài)在時間單位內(nèi)保持為HIGH
時間函數(shù)
unsigned long millis()
返回時間函數(shù)(單位ms), 回傳晶片開始執(zhí)行到目前的毫秒,該函數(shù)是指,當(dāng)程序運(yùn)行就開始計時并返回記錄的參數(shù),該參數(shù)溢出大概需要50天時間。
范例:
duration = millis()-lastTime; // 表示自“l(fā)astTime”至當(dāng)下的時間
delay(ms) 延時函數(shù)(單位ms),延時一段時間,暫停晶片執(zhí)行多少毫秒,
delay(1000)為一秒。
范例:
delay(500); //暫停半秒(500毫秒)
delayMicroseconds(us) 延時函數(shù)(單位us)暫停晶片執(zhí)行多少微秒。
delayMicroseconds(1000); //暫停1豪秒
數(shù)學(xué)函數(shù)
min(x, y)
求最小值 ,回傳兩數(shù)之間較小者
范例:
val = min(10,20); // 回傳10
max(x, y)
求最大值 ,回傳兩數(shù)之間較大者
范例:
val = max(10,20); // 回傳20
abs(x)
計算絕對值 ,回傳該數(shù)的絕對值,可以將負(fù)數(shù)轉(zhuǎn)正數(shù)。
范例:
val = abs(-5); // 回傳5
constrain(x, a, b) 約束函數(shù),下限a,上限b,判斷x變數(shù)位于a與b之間的狀態(tài)。x若小于a回傳a;介于a與b之間回傳x本身;大于b回傳b
范例:
val = constrain(analogRead(0), 0, 255); // 忽略大于255的數(shù)
map(value, fromLow, fromHigh, toLow, toHigh)
約束函數(shù),value必須在fromLow與toLow之間和fromHigh與toHigh之間。將value變數(shù)依照fromLow與fromHigh范圍,對等轉(zhuǎn)換至toLow與toHigh范圍。時常使用于讀取類比訊號,轉(zhuǎn)換至程式所需要的范圍值。
例如:
val = map(analogRead(0),0,1023,100, 200); // 將analog0 所讀取到的訊號對等轉(zhuǎn)換至100,200之間的數(shù)值。
pow(base, exponent)
開方函數(shù),base的exponent次方。回傳一個數(shù)(base)的指數(shù)(exponent)值。
范例:
double x = pow(y, 32); // 設(shè)定x為y的32次方
sq(x) 平方
sqrt(x) 開根號
回傳double型態(tài)的取平方根值。
范例:
double a = sqrt(1138); // 回傳1138平方根的近似值 33.73425674438
三角函數(shù)
sin (rad)
回傳角度(radians)的三角函數(shù)sine值。
范例:
double sine = sin(2); // 近似值 0.90929737091
cos(rad)
回傳角度(radians)的三角函數(shù)cosine值。
范例:
double cosine = cos(2); //近似值-0.41614685058
tan(rad)
回傳角度(radians)的三角函數(shù)tangent值。
范例:
double tangent = tan(2); //近似值-2.18503975868
隨機(jī)數(shù)函數(shù)
randomSeed(seed)
隨機(jī)數(shù)端口定義函數(shù),seed表示讀模擬口analogRead(pin)函數(shù) 。
事實上在Arduino里的亂數(shù)是可以被預(yù)知的。所以如果需要一個真正的亂數(shù),可以呼叫此函式重新設(shè)定產(chǎn)生亂數(shù)種子。你可以使用亂數(shù)當(dāng)作亂數(shù)的種子,以確保數(shù)字以隨機(jī)的方式出現(xiàn),通常會使用類比輸入當(dāng)作亂數(shù)種子,藉此可以產(chǎn)生與環(huán)境有關(guān)的亂數(shù)(例如:無線電波、宇宙雷射線、電話和螢光燈發(fā)出的電磁波等)。
范例:
randomSeed(analogRead(5)); // 使用類比輸入當(dāng)作亂數(shù)種子
long random(max)
隨機(jī)數(shù)函數(shù),返回數(shù)據(jù)大于等于0,小于max。
范例:
long randnum = random(11); // 回傳 0 -10之間的數(shù)字
long random(min, max)
隨機(jī)數(shù)函數(shù),返回數(shù)據(jù)大于等于min,小于max。
范例:
long randnum = random(0, 100); // 回傳0 – 99 之間的數(shù)字
外部中斷函數(shù)
attachInterrupt(interrupt, , mode)
外部中斷只能用到數(shù)字IO口2和3,interrupt表示中斷口初始0或1,表示一個功能函數(shù),mode:LOW低電平中斷,CHANGE有變化就中斷,RISING上升沿中斷,F(xiàn)ALLING 下降沿中斷。
detachInterrupt(interrupt)
中斷開關(guān),interrupt=1 開,interrupt=0 關(guān)。
中斷使能函數(shù)
interrupts() 使能中斷
noInterrupts() 禁止中斷
串口收發(fā)函數(shù)
Serial.begin(speed)
串口定義波特率函數(shù),設(shè)置串行每秒傳輸數(shù)據(jù)的速率(波特率),可以指定Arduino從電腦交換訊息的速率,通常我們使用9600 bps。,speed表示波特率,如9600,19200等。在同計算機(jī)通訊時,使用下面這些值:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600或 115200 bps(每秒位元組)。。你也可以在任何時候使用其它的值,比如,與0號或1號插口通信就要求特殊的波特率。用在setup()函數(shù)里
范例:
Serial.begin(9600)
int Serial.available()
判斷緩沖器狀態(tài)。回傳有多少位元組(bytes)的資料尚未被read()函式讀取,如果回傳值是0代表所有序列埠上資料都已經(jīng)被read()函式讀取。
范例:
int count = Serial.available();
int Serial.read()
讀串口并返回收到參數(shù)。Serial.read()——讀取持續(xù)輸入的數(shù)據(jù)。讀取1byte的序列資料
范例:
int data = Serial.read();
Serial.flush()
清空緩沖器。 有時候因為資料速度太快,超過程式處理資料的速度,你可以使用此函式清除緩沖區(qū)內(nèi)的資料。經(jīng)過此函式可以確保緩沖區(qū)(buffer)內(nèi)的資料都是最新的。
范例:
Serial.flush();
Serial.print(data)
從串行端口輸出數(shù)據(jù)。Serial.print(數(shù)據(jù))默認(rèn)為十進(jìn)制等于Serial.print(數(shù)據(jù),DEC)。
Serial.print(data, encoding)
經(jīng)序列埠傳送資料,提供編碼方式的選項。Serial.print(數(shù)據(jù),數(shù)據(jù)的進(jìn)制)如果沒有指定,預(yù)設(shè)以一般文字傳送。
范例:
Serial.print(75); // 列印出 “75”
Serial.print(75, DEC); //列印出 “75”
Serial.print(75, HEX); // “4B” (75 的十六進(jìn)位)
Serial.print(75, OCT); // “113” (75 in的八進(jìn)位)
Serial.print(75, BIN); // “1001011” (75的二進(jìn)位)
Serial.print(75, BYTE); // “K” (以byte進(jìn)行傳送,顯示以ASCII編碼方式)
Serial.println(data)
從串行端口輸出數(shù)據(jù),跟隨一個回車和一個換行符。這個函數(shù)所取得的值與 Serial.print()一樣。
Serial.println(data, encoding)
與Serial.print()相同,但會在資料尾端加上換行字元( )。意思如同你在鍵盤上打了一些資料后按下Enter。
范例:
Serial.println(75); //列印出“75 ”
Serial.println(75, DEC); //列印出“75 ”
Serial.println(75, HEX); // “4B ”
Serial.println(75, OCT); // “113 ”
Serial.println(75, BIN); // “1001011 ”
Serial.println(75, BYTE); // “K ”
以上幾個函數(shù)是常用基本函數(shù),還有很多以后會慢慢學(xué)習(xí)
Arduino語言庫文件
官方庫文件
· EEPROM - EEPROM讀寫程序庫
· LiquidCrystal - LCD控制程序庫
· Servo - 舵機(jī)控制程序庫
· SoftwareSerial - 任何數(shù)字IO口模擬串口程序庫
· Stepper - 步進(jìn)電機(jī)控制程序庫
· Wire - TWI/I2C總線程序庫
· Matrix - LED矩陣控制程序庫
· Sprite - LED矩陣圖象處理控制程序庫
Arduuino復(fù)合運(yùn)算符
+= , -= , *= , /=
對一個變量和另一個參數(shù)或變量完成一個數(shù)學(xué)運(yùn)算。+=(以及其他)可以縮短語法長度。
Syntax語法
x += y; // 等價于 x = x + y;
x -= y; // 等價于 x = x - y;
x *= y; // 等價于 x = x * y;
x /= y; // 等價于 x = x / y;
Parameters參數(shù)
x:任何變量類型
y:任何變量類型或常數(shù)
Examples范例
x = 2;
x += 4; // x現(xiàn)在為6
x -= 3; // x現(xiàn)在為3
x *= 10; // x現(xiàn)在為30
x /= 2; // x現(xiàn)在為15
Syntax語法
x++; // increment x by one and returns the old value of x
// 將x的值加1并返回原來的x的值。 ++x; // increment x by one and returns the new value of x // 將x的值加1并返回現(xiàn)在的x的值。
x-- ; // decrement x by one and returns the old value of x // 將x的值減1并返回原來的x的值。
--x ; // decrement x by one and returns the new value of x // 將x的值減1并返回現(xiàn)在的x的值。
Parameters參數(shù)
x: an integer or long (possibly unsigned)
x:一個整數(shù)或長整數(shù)(可以無符號)
Returns返回
The original or newly incremented / decremented value of the variable.
返回變量原始值或增加/消耗后的新值。
Examples范例
x = 2;
y = ++x; // x now contains 3, y contains 3 // x現(xiàn)在為3,y為3
y = x--; // x contains 2 again, y still contains 3 // x現(xiàn)在仍然為2,y將為3
評論
查看更多