Arduino語言
Arduino使用C/C++編寫程序,雖然C++兼容C語言,但這是兩種語言,C語言是一種面向過程的編程語言,C++是一種面向對象的編程語言。早期的Arduino核心庫使用C語言編寫,后來引進了面向對象的思想,目前最新的Arduino核心庫采用C與C++混合編寫而成。
通常我們說的Arduino語言,是指Arduino核心庫文件提供的各種應用程序編程接口(Application Programming Interface,簡稱API)的集合。這些API是對更底層的單片機支持庫進行二次封裝所形成的。例如,使用AVR單片機的Arduino的核心庫是對AVR-Libc(基于GCC的AVR支持庫)的二次封裝。
傳統開發方式中,你需要厘清每個寄存器的意義及之間的關系,然后通過配置多個寄存器來達到目的。
關鍵字:
if.。.else
必須緊接著一個問題表示式(expression),若這個表示式為真,緊連著表示式后的代碼就會被執行。若這個表示式為假,則執行緊接著else之后的代碼。 只使用 if不搭配else是被允許的。
范例:
if (val == 1) {
}
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燈
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
語法符號:
//單行注釋: /*多行注釋:在這個范圍內你可以寫一整首詩*/
運算符:
% 余數除法== 等于 !=不等于《= 小于等于》= 大于等于&& 交集|| 聯集
! 反相
數據類型:
boolean 布林
布爾變數的值只能為真(true)或是假(false)
char 字符
單一字符例如 A,和一般的計算機做法一樣Arduino 將字符儲存成一個數字,即使你看到的明明就是一個文字。
用數字表示一個字符時,它的值有效范圍為 -128 到127。
注意:有兩種主流的計算機編碼系統ASCII 和UNICODE。ASCII 表示了127個字符, 用來在序列終端機和分時計算器之間傳輸文字。
UNICODE可表示的字符量比較多,在現代計算機操作系統內它可以用來表示多國語言。
在位數需求較少的信息傳輸時,例如意大利文或英文這類由拉丁文,阿拉伯數字和一般常見符號構成的語言,ASCII仍是目前主要用來交換信息的編碼法。
byte 字節類型
儲存的數值范圍為0到255。如同字符一樣字節型態的變量只需要用一個字節(8位)的內存空間儲存。
int 整數
整數數據型態用到2字節的內存空間,可表示的整數范圍為 –32,768 到 32,767; 整數變量是Arduino內最常用到的數據型態。
unsigned int 無符號整數(絕對值)
無號整數同樣利用2字節的內存空間,無號意謂著它不能儲存負的數值,因此無號整數可表示的整數范圍為0 到 65,535。
long 長整數
長整數利用到的內存大小是整數的兩倍,因此它可表示的整數范圍從 –2,147,483,648 到 2,147,483,647。
unsigned 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亮度時,你可以宣告六個變量light01,light02,light03,light04,light05,light06,但其實你有更好的選擇,例如宣告一個整數數組變量如下:
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 設定為輸入模式
pinMode(1,INPUT);//將腳位1設定為輸入模式
pinMode(2,INPUT);//將腳位2設定為輸入模式
pinMode(3,INPUT);//將腳位3設定為輸入模式
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
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 所讀取到的訊號對等轉換至100,200之間的數值。
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
隨機數函數
randomSeed(seed)
隨機數端口定義函數,seed表示讀模擬口analogRead(pin)函數 。
事實上在Arduino里的亂數是可以被預知的。所以如果需要一個真正的亂數,可以呼叫此函式重新設定產生亂數種子。你可以使用亂數當作亂數的種子,以確保數字以隨機的方式出現,通常會使用類比輸入當作亂數種子,藉此可以產生與環境有關的亂數(例如:無線電波、宇宙雷射線、電話和螢光燈發出的電磁波等)。
范例:
randomSeed(analogRead(5)); // 使用類比輸入當作亂數種子
long random(max)
隨機數函數,返回數據大于等于0,小于max。
范例:
long randnum = random(11); // 回傳 0 -10之間的數字
long random(min, max)
隨機數函數,返回數據大于等于min,小于max。
范例:
long randnum = random(0, 100); // 回傳0 – 99 之間的數字
外部中斷函數
attachInterrupt(interrupt, , mode)
外部中斷只能用到數字IO口2和3,interrupt表示中斷口初始0或1,表示一個功能函數,mode:LOW低電平中斷,CHANGE有變化就中斷,RISING上升沿中斷,FALLING 下降沿中斷。
detachInterrupt(interrupt)
中斷開關,interrupt=1 開,interrupt=0 關。
中斷使能函數
interrupts() 使能中斷
noInterrupts() 禁止中斷
串口收發函數
Serial.begin(speed)
串口定義波特率函數,設置串行每秒傳輸數據的速率(波特率),可以指定Arduino從電腦交換訊息的速率,通常我們使用9600 bps。,speed表示波特率,如9600,19200等。在同計算機通訊時,使用下面這些值:300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600或 115200 bps(每秒位元組)。。你也可以在任何時候使用其它的值,比如,與0號或1號插口通信就要求特殊的波特率。用在setup()函數里
范例:
Serial.begin(9600)
int Serial.available()
判斷緩沖器狀態。回傳有多少位元組(bytes)的資料尚未被read()函式讀取,如果回傳值是0代表所有序列埠上資料都已經被read()函式讀取。
范例:
int count = Serial.available();
int Serial.read()
讀串口并返回收到參數。Serial.read()——讀取持續輸入的數據。讀取1byte的序列資料
范例:
int data = Serial.read();
Serial.flush()
清空緩沖器。 有時候因為資料速度太快,超過程式處理資料的速度,你可以使用此函式清除緩沖區內的資料。經過此函式可以確保緩沖區(buffer)內的資料都是最新的。
范例:
Serial.flush();
Serial.print(data)
從串行端口輸出數據。Serial.print(數據)默認為十進制等于Serial.print(數據,DEC)。
Serial.print(data, encoding)
經序列埠傳送資料,提供編碼方式的選項。Serial.print(數據,數據的進制)如果沒有指定,預設以一般文字傳送。
范例:
Serial.print(75); // 列印出 “75”
Serial.print(75, DEC); //列印出 “75”
Serial.print(75, HEX); // “4B” (75 的十六進位)
Serial.print(75, OCT); // “113” (75 in的八進位)
Serial.print(75, BIN); // “1001011” (75的二進位)
Serial.print(75, BYTE); // “K” (以byte進行傳送,顯示以ASCII編碼方式)
Serial.println(data)
從串行端口輸出數據,跟隨一個回車和一個換行符。這個函數所取得的值與 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 ”
以上幾個函數是常用基本函數,還有很多以后會慢慢學習
Arduino語言庫文件
官方庫文件
· EEPROM - EEPROM讀寫程序庫
· LiquidCrystal - LCD控制程序庫
· Servo - 舵機控制程序庫
· SoftwareSerial - 任何數字IO口模擬串口程序庫
· Stepper - 步進電機控制程序庫
· Wire - TWI/I2C總線程序庫
· Matrix - LED矩陣控制程序庫
· Sprite - LED矩陣圖象處理控制程序庫
Arduuino復合運算符
+= , -= , *= , /=
對一個變量和另一個參數或變量完成一個數學運算。+=(以及其他)可以縮短語法長度。
Syntax語法
x += y; // 等價于 x = x + y;
x -= y; // 等價于 x = x - y;
x *= y; // 等價于 x = x * y;
x /= y; // 等價于 x = x / y;
Parameters參數
x:任何變量類型
y:任何變量類型或常數
Examples范例
x = 2;
x += 4; // x現在為6
x -= 3; // x現在為3
x *= 10; // x現在為30
x /= 2; // x現在為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并返回現在的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并返回現在的x的值。
Parameters參數
x: an integer or long (possibly unsigned)
x:一個整數或長整數(可以無符號)
Returns返回
The original or newly incremented / decremented value of the variable.
返回變量原始值或增加/消耗后的新值。
Examples范例
x = 2;
y = ++x; // x now contains 3, y contains 3 // x現在為3,y為3
y = x--; // x contains 2 again, y still contains 3 // x現在仍然為2,y將為3
評論
查看更多