進階之路(基礎篇) - 011 arduino api基礎手冊
arduino 函數 api
程序結構
在Arduino中, 標準的程序入口main函數在內部被定義, 用戶只需要關心以下兩個函數:
void setup()
void loop()
setup() 函數用於初始化, loop() 函數用於執行. 初始化函數一般放在程序開頭, 用於設置一些引腳的輸出/輸入模式, 初始化串口通訊等類似工作. loop() 函數中 的代碼將被循環執行, 例如: 讀入引腳狀態, 設置引腳輸出狀態等.
控制語句
if,if...else,for,switch,while,do...while,break,continue,return,goto
相關語法
; (分號),(大括號),// (單行註釋),/* */ (多行註釋),#define,#include,
算術運算符
= (賦值),+ (加),- (減),* (乘),/ (除),% (取模)
比較運算符
== (等於),!= (不等於),< (小於),> (大於),<= (小於等於),>= (大於等於)
布爾運算符
&& (邏輯與)、|| (邏輯或)、! (邏輯非)
指針運算符
* 指針運算符 & 地址運算符
位運算
& (位與)、| (位或)、^ (位異或)、~ (位非)、<< (左移)、>> (右移)、端口操作
復合運算符
++ (自加)、-- (自減)、+= (復合加)、-= (復合減)、*= (復合乘)、/= (復合除)、&= (復合與)、|= (復合或)
常量
HIGH | LOW
INPUT | OUTPUT
true | false
整數常量
浮點數常量
數據類型
void(無類型)
word(字組) 0~65535 //16位
boolean(布爾型) 0~1 //1位
char(字符型) -128~+127 //8位
unsigned char(無符號字符型) 0~255 //8位
short -32768~+32767 //16位
byte(字節型) //8bit
int(整型) -2147483648~+2147483647 //32位
unsigned int(無符號整型) 0~65535 //16位
long(長整型) -2147483648~+2147483647 //32位
unsigned long(無符號長整型) 0~4297967295 //32位
float(單精度) -3.4028235E+38~+3.4028235E+38
double(雙精度)
string(字符串)
array(數組)
數據類型轉換
char(),byte(),int(),word(),long(),float()
變量作用域&修飾符
變量作用域
static (靜態變量),volatile (易變變量),const (不可改變變量)
輔助工具
sizeof() (sizeof運算符)、ASCII碼表
//基本函數
/**************數字I/O*************/
pinMode(pin,mode); //設置引腳輸出狀態
pinMode函數用於配置引腳為輸入或輸出模式,該函數是一個無返回值函數,函數有兩個參數 pin 和 mode,pin參數表示所要配置的引腳,mode 參數表示設置的模式——INPUT(輸入模式),OUTPUT(輸出模式)和INPUT_PULLUP(輸入模式,且引腳點位拉高);
digitalWrite(pin,value); //設置引腳的輸出數據
digitalWrite函數的作用是設置引腳輸出引腳引腳的電平為高電平或地電平。該函數是一個無返回值函數,函數有兩個參數pin和value,pin參數表示所要配置的引腳,value參數表示輸出電壓——HIGH(高點平)和LOW(第電平)。
int digitalRead(pin); //引腳數據讀取
digitalRead函數用在函數為輸入情況,可以獲取引腳電壓的情況——HIGH(高電平)或LOW(低電平),參數 pin參數表示要獲取電壓值的引腳,該函數返回值為 int 類型,表示引腳的電壓情況。
/*************模擬I/O*************/
analogRead(pin); //讀取引腳的電壓值
analogRead函數用於讀取引腳的模擬量電壓值,每一次讀取需要消耗的時間為 100us。參數 pin參數表示要獲取模擬量電壓值的引腳,該函數返回值為 int 類型,表示模擬量電壓值,範圍在 0~1023。
analogWrite(pin,value); //設置引腳輸出模擬量(PWM)
通過指定引腳輸出模擬量(PWM),可用於讓LED以不同的亮度點亮或驅動電機以不同的速度旋轉。
analogWrite()輸出結束後,該引腳將產生一個穩定的特殊PWM波形,直到下次調用 analogWrite()(或在同一引腳使用digitalRead()或 digitalWrite())。
PWM信號的頻率大約是490Hz。
在大多 Arduino板(ATmega168或ATmega328)上,只有引腳3,5,6,9,10和11可以實現該功能。AduinoMega上,引腳2~13可以實現該功能。Arduino舊版本的板子 (ATmega8)只有9,10,11可以使用 analogWrite()。
在使用 analogWrite()前,不需要使用 pinMode()來設定引腳。analogWrite函數與模擬引腳、analogRead函數沒有直接關系。
analogReference(type); //設置模擬參考電壓
analogReference函數的作用是配置引腳的參考電壓。在嵌入式應用中引腳獲取模擬電壓值之後,將根據參考電壓將模擬值轉換到0~1023。該函數為無返回值函數,參考為 mode 類型,有 3 種類型(DEFAULT/INTERNAL/EXTERNAL),具體含義如下所表示。
NEFAULT:預設置,參考電壓5V
INTERNAL:低電壓模式,使用偏內基準電壓源。
INTERNAL1V1:1V的內基準電壓源(只能在 ArduinoMega使用)
INTERNAL2V56:56V的內基準電壓源(只能在 ArduinoMega使用)
EXTERNAL:擴展模式,通過AREF引腳獲取參考電壓
實際電壓 = (analogRead(pin)*基準電壓)/1024;
/*************高級I/O************/
shiftOut(dataPin, clockPin, bitOrder, val); //將一個數據以此移出
這個函數的作用是將一個數據的一個字符組中的字符組中的字符以次移出。從最高有效位(最左邊)或最低有效位(最右邊)開始。依次向數據引腳寫入每一個字符,之後時鐘引腳被拉高或拉低,指示剛才的數據有效。
註意:如果鏈接的設備時鐘類型為上升沿,就要確定在調用 shiftOut()前時鐘引腳為低電平,如調用 digitalWrite(clockPin,LOW)。
這是一個軟件實現的功能。
Arduino提供了一個硬件實現的ISP函數庫,它速度更快,但只在特定引腳才會有效。
dataPin:數據輸出引腳,數據的每一個字符將逐次輸出。引腳模式需要設置成輸出。
clockPin:時鐘輸出引腳,為數據輸出提供時鐘,引腳模式需要設置成輸出。
bitOrder:數據位移順序選擇字符,該參數為byte類型,有兩種類型可選擇,分別是高位先入 MSBFIRST 和低位先入 LSBFIRST
val:所有輸出的數據
shiftOut函數能夠將數據通過串行的方式在引腳上輸出,相當於一般意義上的同步串行通信,這是控制器與控制器,控制器與傳感器之間常用的一種通信方式。
pulseIn(pin, state, timeout); //讀取引腳上的脈沖時長
pin:讀取脈沖的引腳編號
state:讀取引腳的脈沖的電平狀態
timeout:最大的讀取時長(已um為單位)
/************時間函數************/
millis();
millis函數可通過返回值、返回獲取機器運行的時間長度,單位為ms。系統最長的記錄時間為9小時22分,如果超出時間從0開始。函數返回值為unsigned long 型,無參數。
delay(ms);
delay函數為一個延時函數,曾在Blink程序中用到,參數表示設置的延長時間,單位ms。
delayMicroseconds(us);
delayMicroseconds函數為一個延時函數,參數表示設置的延長時間,單位us。
/**************數學庫************/
min(x, y); //返回兩個參數中較小的值。
max(x, y); //返回兩個參數中較大的值。
abs(x); //返回參數的絕對值。
constrain(amt, low, high); //區間
如果 amt<low,則返回low的值。
如果 amt>high,則返回high的值。
如果 low<amt<high,則返回amt的值。
map(x, in_min, in_max, out_min, out_max); //區間映射
map函數的作用是將[in_min,in_max]範圍內的X等比映射到[out_min,out_max]範圍內。意思是說,這個函數可以由原來的比例範圍,換算成另一個比例範圍。
x:判斷的數字。
in_min:原來的數字範圍最小的數值。
in_max:原來的數字範圍最大的數值。
out_min:計算後範圍最小的數值。
out_max:計算後範圍最大的數值。
pow(base, exponent); //求 base的 exponent次方
sqrt(x); //求平方根
/************三角函數***********/
sin(rad); //正弦
cos(rad); //余弦
tan(rad); //正切
/**************隨機數************/
randomSeed(seed); //生成偽隨機數。(調用random函數)
long myRandomNumber = random(max);
random(howbig); //生成偽隨機數。
random函數返回一個0~howbig-1之間的隨機數。可以做模擬噪聲信號。
random(howsmall, howbig);
/*********字符串(string)**********/
charAT(); //獲取字符串的第 n 個字符
String1.charAT(n); //string是字符串的頭指針
compareTo(); //比較兩個字符串
compareTo函數是比較兩個字符串,相同返回兩個字符串當前比較字符串的差值。前-後
語法:string1.compareTo(string2);
string1:第一個字符串
string2:第二個字符串
concat(); //字符串拼接
string1.concat(string2); //把 string2拼接到 string1後面
endsWith(); //字符串尾部判斷對比
string1.endsWith(string2); //判斷 string1尾部是否是字符串 string2,當然你也可以用它來判斷‘\n‘
equals(); //判斷字符串是否相等。
string1.equals(string2);
string1:被判斷的字符串
string2:判斷的字符串
返回值是布爾類型,true 和 false
equalslgnoreCase(string2); //判讀字符串口是否相等。
string1.equalslgnoreCase(string2);
string1:被判斷的字符串
string2:判斷的字符串
返回值是布爾類型,true 和 false
getBytes(); //字符串的復制和和函數 toCharArray()功能非常相識。
string1.getBytes(buf,len);
string1:原本的字符串
buf:要搬移的目的變量
len:字符串長度
indexOf(); //在字符串中選擇特定的字符,並返回位置的功能函數。(正向)
如果你想在一個很長的字符串中查找這個特別的關鍵字,可以使用這個函數。
string1.indexOf(val);
string1.indexOf(val,from);
string1:原本的字符串
val:想要找的關鍵字,可以是char或 string 字符串。
from:選擇性參數,你可以特別指定從那個位置開始尋找這個關鍵字。
返回值:成功返回位置,失敗返回-1
lastlndexOf(); //在字符串中選擇特定的字符串,並返回位置的功能函數。(反向)
string1.lastlndexOf(val);
string1.lastlndexOf(val,from);
string1:原本的字符串
val:想要找到的關鍵字,可以是char或者 string字符串。
from:選擇性參數,你可以特別指定從那個位置回頭尋找這個關鍵字。
返回值:成功返回位置,失敗返回-1
length(); //測量字符長度
string1.length();
string1:要被測量的字符串。
返回值:字符串的長度。
replace(); //字符串替換
string1.replace(string2,string3);
string1:原本的字符串。
string2:在字符串中欲被替換的字符串。
string3:要替換之後的新字符串。
返回值:無
setCharAt(); //字符替換
string1.setCharAt(i,charl);
string1:原本的字符串。
i:字符串中欲被換掉的字符的位置。
charl:要替換的字符,註意只有一個字符,而不是字符串。
返回值:無
startsWith(); //判斷字符串是否已某個特殊的字符串開始的
string1.starts With(string2);
string1:原本的字符串。
string2:判斷是不是已這個字符串開始。
返回值:布爾代數,true 和 false
substring(); //用來截取字符串中間的某一位置。另外是決定那裏結束。
string1.substring(from); //返回 from 之後的
string1.substring(from,to); //返回 from 和 to 之間的
string1:原本的字符串
from:要截取的字符串從第幾個字開始。
to:要截取後面的第幾個字。
返回值:返回的字符串。
toCharArray(); // 把string拷貝char中
toCharArray函數是字符串處理中常用的一個函數,你可以把他當成 string 轉 char[] 的轉換函數,或者復制文字的函數,他的功能和 getBytes()非常相似,toCharArray()函數轉換後是呈現文字,而getBytes()函數轉換後是呈現數字。
string1.toCharArray(buf,len);
string:原本的字符串。
buf:指定的char[]的位置,註意char[]的空間,一個要等於或大於復制的大小,不然存儲器和程序都會產生不可預期的問題。
len:要復制的字符串長度。
返回值:要復制的字符串長度。
toInt(); // string 轉 int
string1.toInt();
string1:字符串,如"123"
返回值:整數,如 123
toLowerCase(); //把英文全部轉換為小寫
string1.toLowerCase();
string1:字符串(全英文)
返回值:字符串(小寫)
toUpperCase(); //把英文全部轉換為大寫
string1.toUpperCase();
string1:字符串(全英文)
返回值:字符串(大寫)
trim(); //自動清除字符串中最前面和最後面的空白數據。
string1.trim();
string1:原本的字符串。
返回值:無。
/**************位操作************/
lowByte();
highByte();
bitRead();
bitWrite();
bitSet();
bitClear();
bit();
/*********設置中斷函數***********/
attachInterrupt(interrupt, function, mode); //中斷設置函數
attachInterrupt函數用於設置外部中斷,函數有3個參數:interrupt、function、mode分別代表中斷源,中斷處理函數,觸發模式。參數選項可選值0或1,在 Arduino中,一般對應2號和3號引腳;參數中斷處理函數用來指定中段的處理函數,參數值為函數指針,
觸發模式有4種:
LOW(低點平觸發)、
CHANGE(變化時觸發)、
RISING(低點平轉為高點平)、
FALLING(高點平轉為低點平觸發)。
註意:
在中斷函數中 delay函數不能使用。
在使用 millis函數始終返回進入中斷前的值。
讀取串行數據的話,可能會丟失。
中斷函數中使用的變量需要定義為 volatile 類型。
detachInterrupt(interrupt); //取消中斷
interrupt為所要取消的中斷源。
/***********開關中斷************/
interrupts(); //從新啟用noInterrupts關閉的中斷
noInterrupts(); //關閉已經開啟的中斷
/***********串口通訊************/
Serial.begin(speed); //設置串口的通信速率
speed:int 整數,用來設定傳輸速率,通常是這幾個數:300,600,1200,2400,4800,9600,14400,19200,28800,18400,57600或115200
返回值:無
Serial.available(); //獲取前串口緩沖池的數據量。串口的緩存區默認只有64字節,但大小是可以改變的,詳情見:http://www.cnblogs.com/jikexianfeng/p/6250564.html
Serial.read(); //用來讀取數據,每次只能讀取一個字符。
Serial.available函數和 Serial.read函數通常是在一起使用,Serial.available函數是用來判斷是否有數據送進來,我們接著用 Serial.read函數用來讀取數據。
Serial.flush(); //清空緩沖區數據,Serial.flush()函數的功能在arduino1.0之前和之後版本是不一樣的。之前版本是用來清除已經進入緩沖區的輸入的串口數據,1.0版之後,用來等待要發送的串口數據發送完畢。詳情:http://www.cnblogs.com/jikexianfeng/p/6250638.html
Serial.print(data); //串口輸出
Serial.println(data); //串口輸出(比print的尾部多一個換行符。)
/************擴展庫************/
如果要使用一些已有的庫, 可以選擇菜單"Sketch->Import Library", 然後選擇 相應的庫. Sketch工具會自己在代碼的開頭包含庫的頭文件(#include).
在引入庫之後, 程序的體積也將會增大(因為包含了庫的代碼). 對於不是必要的庫, 直接刪除對應的#include語句就可以了.
官方擴展庫
以下是Arduino官方提供的擴展庫, 被默認包含在開發工具中.
EEPROM - 讀寫EEPROM存儲區.
Ethernet - 以太網支持.
Firmata - 基於串口的通訊協議.
LiquidCrystal - LCD液晶顯示.
Servo - 伺服電機.
SoftwareSerial - 軟件實現的串口, 可以選擇任意引腳.
Stepper - 步進電機.
Wire - I2C協議支持.
Matrix - LED顯示陣列控制.
Sprite - LED顯示陣列中子塊控制.
第三方擴展庫
這裏只包含了Roboduino擴展板的相關庫, 其他的庫信息請訪問: Arduino在線文檔 online~.
Roboduino擴展板:
RoboduinoMotor - Roboduino電機擴展板驅動.
如果需要設計自己的庫, 請參考"arduino\hardware\libraries"目錄中相關庫的代碼.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
參考書籍:http://blog.csdn.net/powenko/article/details/48570043#plain
參考文檔:https://www.douban.com/note/493189178/
參考網站:http://wiring.org.co/reference/
參考網頁:http://www.cnblogs.com/jikexianfeng/p/6031291.html
參考網頁:http://www.cnblogs.com/rayray/p/3198091.html
參考網頁:http://www.cnblogs.com/jikexianfeng/p/6250638.html
進階之路(基礎篇) - 011 arduino api基礎手冊