Arduino 語法、函數使用、最常用函數、arduino教程、arduino筆記、參考手冊

數字 I/O

pinMode()
描述
將指定的引腳配置成輸出或輸入。詳情請見digital pins。
語法
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 延遲(1000); //等待第二個 }

注意
模擬輸入腳也能當做數字腳使用,參加A0,A1,等

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號引腳的輸入模式,需要使用外部上拉下拉電阻。
語法
digitalWrite(pin, value)
參數
pin: 引腳編號(如1,5,10,A0,A3)
value: HIGH or LOW
返回

例子

int ledPin = 13; // LED連接到數字13號端口 void setup() {
pinMode(ledPin, OUTPUT); // 設置數字端口爲輸入模式 } void loop() {
digitalWrite(ledPin, HIGH); // 使LED亮 delay(1000);
// 延遲一秒 digitalWrite(ledPin, LOW); // 使LED滅 delay(1000);
// 延遲一秒 }

13號端口設置爲高電平,延遲一秒,然後設置爲低電平。
註釋
模擬引腳也可以當做數字引腳使用,使用方法是輸入端口A0,A1,A2等。

digitalRead()
描述
讀取指定引腳的值,HIGH或LOW。
語法
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值設置爲按鈕的值 }

將13腳設置爲輸入腳7腳的值。
注意
如果引腳懸空,digitalRead()會返回HIGH或LOW(隨機變化)。
模擬輸入腳能當做數字腳使用,參見A0,A1等。

模擬 I/O

analogReference()
描述
配置用於模擬輸入的基準電壓(即輸入範圍的最大值)。選項​​有:
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的整數值
注意事項
如果模擬輸入引腳沒有連入電路,由analogRead()返回的值將根據多項因素(例如其他模擬輸入引腳,你的手靠近板子等)產生波動。例子

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
描述
從一個引腳輸出模擬值(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函數沒有直接關係。
語法
analogWrite(pin,value)
參數
pin:用於輸入數值的引腳。
value:佔空比:0(完全關閉)到255(完全打開)之間。
返回

說明和已知問題
引腳5和6的PWM輸出將高於預期的佔空比(輸出的數值偏高)。這是因爲millis()和delay()功能,和PWM輸出共享相同的內部定時器。這將導致大多時候處於低佔空比狀態(如:0 - 10),並可能導致在數值爲0時,沒有完全關閉引腳5和6。
例子
通過讀取電位器的阻值控制LED的亮度

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()將不會有效果。
注意:如果你想在多個引腳上產生不同的聲音,你要在對下個引腳使用tone()前對剛纔的引腳調用noTone().
語法
noTone(pin)
參數
pin: 所要停止產生聲音的引腳
返回

shiftOut()
描述
將一個數據的一個字節一位一位的移出。從最高有效位(最左邊)或最低有效位(最右邊)開始。依次向數據腳寫入每一位,之後時鐘腳被拉高或拉低,指示剛纔的數據有效。
注意:如果你所連接的設備時鐘類型爲上升沿,你要確定在調用shiftOut()前時鐘腳爲低電平,如調用digitalWrite(clockPin, LOW)。
注意:這是一個軟件實現;Arduino提供了一個硬件實現的SPI庫,它速度更快但只在特定腳有效。
語法
shiftOut(dataPin, clockPin, bitOrder, value)
參數
dataPin:輸出每一位數據的引腳(int)
clockPin:時鐘腳,當dataPin有值時此引腳電平變化(int)
bitOrder:輸出位的順序,最高位優先或最低位優先
value: 要移位輸出的數據(byte)
返回

shiftIn()
描述
將一個數據的一個字節一位一位的移入。從最高有效位(最左邊)或最低有效位(最右邊)開始。對於每個位,先拉高時鐘電平,再從數據傳輸線中讀取一位,再將時鐘線拉低。
注意:這是一個軟件實現;Arduino提供了一個硬件實現的SPI庫,它速度更快但只在特定腳有效。
語法
shiftIn(dataPin,clockPin,bitOrder)
參數
dataPin:輸出每一位數據的引腳(int)
clockPin:時鐘腳,當dataPin有值時此引腳電平變化(int)
bitOrder:輸出位的順序,最高位優先或最低位優先
返回
讀取的值(byte)

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 是一個無符號長整數,試圖和其他數據類型(如整型數)做數學運算可能會產生錯誤。
當中斷函數發生時,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毫秒)
語法
delay(ms)
參數
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()代替。
語法
delayMicroseconds(us)
參數
us:暫停的時間,單位微秒(unsigned int)
返回

例子

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微秒 }

將8號引腳配置爲輸出腳。它會發出一系列週期100微秒的方波。
警告和已知問題
此函數在3微秒以上工作的非常準確。我們不能保證,delayMicroseconds在更小的時間內延時準確。
Arduino0018版本後,delayMicroseconds()不再會使中斷失效。

數學運算

min()
min(x, y)

描述
計算兩個數字中的最小值。
參數
X:第一個數字,任何數據類型
Y:第二個數字,任何數據類型
返回
兩個數字中的較小者。
舉例
sensVal = min(sensVal,100); //將 sensVal 或 100 中較小者賦值給 sensVal
//確保它永遠不會大於 100。
註釋
直觀的比較,max() 方法常被用來約束變量的下限,而 min() 常被用來約束變量的上限。
警告
由於 min() 函數的實現方式,應避免在括號內出現其他函數,這將導致不正確的結果。
min(a++, 100); //避免這種情況 - 會產生不正確的結果
a++;
min(a, 100); //使用這種形式替代 - 將其他數學運算放在函數之外

max()
max(x,y)

描述
計算兩個數的最大值。
參數
X:第一個數字,任何數據類型
Y:第二個數字,任何數據類型
返回
兩個參數中較大的一個。
例子
sensVal = max(senVal, 20); // 將20或更大值賦給sensVal
//(有效保障它的值至少爲20)
注意
和直觀相反,max()通常用來約束變量最小值,而min()通常用來約束變量的最大值。
警告
由於max()函數的實現方法,要避免在括號內嵌套其他函數,這可能會導致不正確的結果。
max(a–, 0); //避免此用法,這會導致不正確結果

a–; // 用此方法代替
max(a, 0); // 將其他計算放在函數外

abs()
描述
計算一個數的絕對值。
參數
X:一個數
返回
如果x大於或等於0,則返回它本身。如果x小於0,則返回它的相反數。
警告
由於實現ABS()函數的方法,避免在括號內使用任何函數(括號內只能是數字),否則將導致不正確的結果。
ABS(a+ +); //避免這種情況,否則它將產生不正確的結果
a + +; //使用這段代碼代替上述的錯誤代碼
ABS(a); //保證其他函數放在括號的外部

constrain()
描述
將一個數約束在一個範圍內
參數
x:要被約束的數字,所有的數據類型適用。
a:該範圍的最小值,所有的數據類型適用。
b:該範圍的最大值,所有的數據類型適用。
返回值
x:如果 x是介於 a 和 b之間
a:如果 x小於a
b:如果 x大於b
例子
sensVal = constrain(sensVal, 10, 150);
//傳感器返回值的範圍限制在10到150之間

map()
描述
將一個數從一個範圍映射到另外一個範圍。也就是說,會將 fromLow 到 fromHigh 之間的值映射到 toLow 在 toHigh 之間的值。
不限制值的範圍,因爲範圍外的值有時是刻意的和有用的。如果需要限制的範圍, constrain() 函數可以用於此函數之前或之後。
注意,兩個範圍中的“下限”可以比“上限”更大或者更小,因此 map() 函數可以用來翻轉數值的範圍,例如:
y = map(x, 1, 50, 50, 1);
這個函數同樣可以處理負數,請看下面這個例子:
y = map(x, 1, 50, 50, -100);
是有效的並且可以很好的運行。
map() 函數使用整型數進行運算因此不會產生分數,這時運算應該表明它需要這樣做。小數的餘數部分會被捨去,不會四捨五入或者平均。
參數
value:需要映射的值
fromLow:當前範圍值的下限
fromHigh:當前範圍值的上限
toLow:目標範圍值的下限
toHigh:目標範圍值的上限
返回
被映射的值。
例子

/映射一個模擬值到8位(0到255)/ 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()
描述
計算一個數的冪次方。Pow()可以用來計算一個數的分數冪。這用來產生指數冪的數或曲線非常方便。
參數
base:底數(float)
exponent:冪(float)
返回
一個數的冪次方值(double)
例子
詳情見 庫代碼中的fscale函數。

sqrt()
描述
計算一個數的平方根。
參數
x:被開方數,任何類型
返回
此數的平方根,類型double

其他不常用函數:
ceil()–
exp()–
fabs()–
floor()–
fma()–
fmax()–
fmin()–
fmod()–
ldexp()–
log()–
log10()–
round()–
signbit()–
sq()–
square()–
trunc()–

三角函數

sin()
描述
計算角度的正弦(弧度)。其結果在-1和1之間。
參數
rad: 弧度制的角度(float)
返回
角度的正弦值(double)

cos()
描述
計算一個角度的餘弦值(用弧度表示)。返回值在 -1 和 1 之間。
參數
rad:用弧度表示的角度 (浮點數)
返回
角度的餘弦值 (雙精度浮點數)

tan()
描述
計算角度的正切(弧度)。結果在負無窮大和無窮大之間。
參數
rad:弧度制的角度(float)
返回
角度的正切值

acos()–
asin()–
atan()–
atan2()–
cosh()–
degrees()–
hypot()–
radians()–
sinh()–
tanh()–

隨機數

randomSeed()

描述
使用randomSeed()初始化僞隨機數生成器,使生成器在隨機序列中的任意點開始。這個序列,雖然很長,並且是隨機的,但始終是同一序列。
如需要在一個random()序列上生成真正意義的隨機數,在執行其子序列時使用randomSeed()函數預設一個絕對的隨機輸入,例如在一個斷開引腳上的analogRead()函數的返回值。
反之,有些時候僞隨機數的精確重複也是有用的。這可以在一個隨機系列開始前,通過調用一個使用固定數值的randomSeed()函數來完成。
參數
long,int - 通過數字生成種子。
返回
沒有返回值
例子

long randNumber; void setup(){ Serial.begin(9600);
randomSeed(analogRead(0)); } void loop(){ randNumber =
random(300); Serial.println(randNumber);
delay(50); }

random()
描述
使用random()函數將生成僞隨機數。
語法
random(max)
random(min, max)
參數
min - 隨機數的最小值,隨機數將包含此值。 (此參數可選)
max - 隨機數的最大值,隨機數不包含此值。
返回
min和max-1之間的隨機數( 數據類型爲long )
注意
如需要在一個random()序列上生成真正意義的隨機數,在執行其子序列時使用randomSeed()函數預設一個絕對的隨機輸入,例如在一個斷開引腳上的analogRead()函數的返回值。
反之,有些時候僞隨機數的精確重複也是有用的。這可以在一個隨機系列開始前,通過調用一個使用固定數值的randomSeed()函數來完成。
例子

long randNumber; void setup(){ Serial.begin(9600);
//如果模擬輸入引腳0爲斷開,隨機的模擬噪聲 //將會調用randomSeed()函數在每次代碼運行時生成 //不同的種子數值。
//randomSeed()將隨機打亂random函數。 randomSeed(analogRead(0)); } void
loop() { //打印一個0到299之間的隨機數 randNumber = random(300);
Serial.println(randNumber); //打印一個10到19之間的隨機數 randNumber =
random(10, 20); Serial.println(randNumber);
delay(50); }

位操作

lowByte()
描述
語法
參數
返回
lowByte()
描述
提取一個變量(例如一個字)的低位(最右邊)字節。
語法
lowByte(x)
參數
x:任何類型的值
返回
字節

highByte()
描述
提取一個字節的高位(最左邊的),或一個更長的字節的第二低位。
語法
highByte(x)
參數
x:任何類型的值
返回
byte

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)
參數
n:需要計算的位
返回值
位值

設置中斷函數

attachInterrupt()
attachInterrupt(interrupt, function, mode)
description
當發生外部中斷時,調用一個指定函數。當中斷髮生時,該函數會取代正在執行的程序。大多數的Arduino板有兩個外部中斷:0(數字引腳2)和1(數字引腳3)。
arduino Mege有四個外部中斷:數字2(引腳21),3(20針),4(引腳19),5(引腳18)。
語法
interrupt:中斷引腳數
function:中斷髮生時調用的函數,此函數必須不帶參數和不返回任何值。該函數有時被稱爲中斷服務程序。
mode:定義何時發生中斷以下四個contstants預定有效值:
LOW 當引腳爲低電平時,觸發中斷
CHANGE 當引腳電平發生改變時,觸發中斷
RISING 當引腳由低電平變爲高電平時,觸發中斷
FALLING 當引腳由高電平變爲低電平時,觸發中斷.
返回

注意事項
當中斷函數發生時,delay()和millis()的數值將不會繼續變化。當中斷髮生時,串口收到的數據可能會丟失。你應該聲明一個變量來在未發生中斷時儲存變量。
使用中斷
在單片機自動化程序中當突發事件發生時,中斷是非常有用的,它可以幫助解決時序問題。一個使用中斷的任務可能會讀一個旋轉編碼器,監視用戶的輸入。
如果你想以確保程序始終抓住一個旋轉編碼器的脈衝,從來不缺少一個脈衝,它將使寫一個程序做任何事情都要非常棘手,因爲該計劃將需要不斷輪詢的傳感器線編碼器,爲了趕上脈衝發生時。其他傳感器也是如此,如試圖讀取一個聲音傳感器正試圖趕上一按,或紅外線槽傳感器(照片滅弧室),試圖抓住一個硬幣下降。在所有這些情況下,使用一箇中斷可以釋放的微控制器來完成其他一些工作。
程序示例

int pin = 13; volatile int state = LOW; void setup() {
pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void
loop() { digitalWrite(pin, state); } void blink() { state =
!state; }

detachInterrupt()
detachInterrupt(interrupt)

描述
關閉給定的中斷。
參數
interrupt: 中斷禁用的數(0或者1).

開關中斷

interrupts()
interrupts()(中斷)

描述
重新啓用中斷(使用noInterrupts()命令後將被禁用)。中斷允許一些重要任務在後臺運行,默認狀態是啓用的。禁用中斷後一些函數可能無法工作,並傳入信息可能會被忽略。中斷會稍微打亂代碼的時間,但是在關鍵部分可以禁用中斷。
參數

返回

例子

void setup() { } void loop() { noInterrupts(); //重要、時間敏感的代碼
interrupts(); //其他代碼寫在這裏 }

noInterrupts()
描述
禁止中斷(重新使能中斷interrupts())。中斷允許在後臺運行一些重要任務,默認使能中斷。禁止中斷時部分函數會無法工作,通信中接收到的信息也可能會丟失。
中斷會稍影響計時代碼,在某些特定的代碼中也會失效。
參數
無。
返回
無。
例子

void setup() void loop() { noInterrupts(); //關鍵的、時間敏感的代碼放在這
interrupts(); //其他代碼放在這 }

通訊

Serial
用於Arduino控制板和一臺計算機或其他設備之間的通信。所有的Arduino控制板有至少一個串口(又稱作爲UART或USART)。它通過0(RX)和1(TX)數字引腳經過串口轉換芯片連接計算機USB端口與計算機進行通信。因此,如果你使用這些功能的同時你不能使用引腳0和1作爲輸入或輸出。
您可以使用Arduino IDE內置的串口監視器與Arduino板通信。點擊工具欄上的串口監視器按鈕,調用begin()函數(選擇相同的波特率)。
Arduino Mega 有三個額外的串口:Serial 1使用19(RX)和18(TX),Serial 2使用17(RX)和16(TX),Serial3使用15(RX)和14(TX)。 若要使用這三個引腳與您的個人電腦通信,你需要一個額外的USB轉串口適配器,因爲這三個引腳沒有連接到Mega上的USB轉串口適配器。若要用它們來與外部的TTL串口設備進行通信,將TX引腳連接到您的設備的RX引腳,將RX引腳連接到您的設備的TX引腳,將GND連接到您的設備的GND。(不要直接將這些引腳直接連接到RS232串口;他們的工作電壓在+/- 12V,可能會損壞您的Arduino控制板。)
Arduino Leonardo板使用Serial 1通過0(RX)和1(TX)與viaRS-232通信,。Serial預留給使用Mouse and Keyboard libarariies的USB CDC通信 。更多信息,請參考Leonardo 開始使用頁和硬件頁。
函數
if (Serial)
說明
表示指定的串口是否準備好。
在Leonardo上,if(Serial)表示不論有無USB CDC,串行連接都是開放的。對於所有其他的情況,包括Leonardo上的if(Serial1),將一直返回true。這來自於 Arduino 1.0.1 版本的介紹.
語法
對於所有的arduino板:
if (Serial)
Arduino Leonardo 特有:
if (Serial1)
Arduino Mega 特有:
if (Serial1)
if (Serial2)
if (Serial3)
參數

返回
布爾值:如果指定的串行端口是可用的,則返回true。如果查詢Leonardo的USB CDC串行連接之前,它是準備好的,將只返回false。
例子

void setup() { //初始化串口和等待端口打開: Serial.begin(9600); while
(!Serial) { //等待串口連接。只有 Leonardo 需要。 } } void loop() { //正常進行 }

available()
說明
獲取從串口讀取有效的字節數(字符)。這是已經傳輸到,並存儲在串行接收緩衝區(能夠存儲64個字節)的數據。 available()繼承了 Stream類。
語法
Serial.available()
僅適用於Arduino Mega :
Serial1.available()
Serial2.available()
Serial3.available()
參數

返回
可讀取的字節數
例子

incomingByte = 0; //傳入的串行數據 void setup() { Serial.begin(9600);
// 打開串行端口,設置傳輸波特率爲9600 bps } void loop() {
//只有當你接收到數據時纔會發送數據,: if (Serial.available() > 0) {
//讀取傳入的字節:
incomingByte = Serial.read();

//顯示你得到的數據:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);   } } Arduino Mega 的例子:  void setup() {   Serial.begin(9600);   Serial1.begin(9600);   }   void

loop() { //讀取端口0,發送到端口1: if (Serial.available()) {
int inByte = Serial.read();
Serial1.print(inByte, BYTE);
} //讀端口1,發送到端口0: if (Serial1.available()) {
int inByte = Serial1.read();
Serial.print(inByte, BYTE); } }

begin()
說明
將串行數據傳輸速率設置爲位/秒(波特)。與計算機進行通信時,可以使用這些波特率:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。當然,您也可以指定其他波特率 - 例如,引腳0和1和一個元件進行通信,它需要一個特定的波特率。
語法
Serial.begin(speed) 僅適用於Arduino Mega : Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)
參數
speed: 位/秒 (波特) - long
返回

例子

void setup() {
Serial.begin(9600); // 打開串口,設置數據傳輸速率爲9600bps } void loop() { Arduino Mega 的例子: // Arduino Mega 可以使用四個串口 // (Serial, Serial1,
Serial2, Serial3), // 從而設置四個不同的波特率: void setup(){
Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200);
Serial3.begin(4800);
Serial.println(“Hello Computer”); Serial1.println(“Hello Serial 1”); Serial2.println(“Hello Serial 2”); Serial3.println(“Hello
Serial 3”); } void loop() {}

end()

說明
停用串行通信,使RX和TX引腳用於一般輸入和輸出。要重新使用串行通信, 需要 Serial.begin()語句。
語法
Serial.end()
僅適用於Arduino Mega: Serial1.end() Serial2.end() Serial3.end()
參數

返回

find()
Serial.find()
說明
Serial.find() 從串行緩衝器中讀取數據,直到發現給定長度的目標字符串。如果找到目標字符串,該函數返回true,如果超時則返回false。
Serial.flush() 繼承了 Stream 類.
語法
Serial.find(target)
參數
target : 要搜索的字符串(字符)
返回
布爾型

findUntil()
Serial.findUntil()

說明
Serial.findUntil()從串行緩衝區讀取數據,直到找到一個給定的長度或字符串終止位。
如果目標字符串被發現,該函數返回true,如果超時則返回false。
Serial.findUntil()繼承了Stream類。
語法
Serial.findUntil(target, terminal)
參數
target : 要搜索的字符串(char) terminal : 在搜索中的字符串終止位 (char)
返回
布爾型

flush()
說明
等待超出的串行數據完成傳輸。(在1.0及以上的版本中,flush()語句的功能不再是丟棄所有進入緩存器的串行數據。)
flush()繼承了Stream類.
語法
Serial.flush()
僅 Arduino Mega 可以使用的語法:
Serial1.flush()
Serial2.flush()
Serial3.flush()
參數

返回

parseFloat()
Serial.parseFloat()

描述
Serial.parseFloat()命令從串口緩衝區返回第一個有效的浮點數. Characters that are not digits (or the minus sign) are skipped. parseFloat() is terminated by the first character that is not a floating point number.
Serial.parseFloat()繼承了Stream類。
語法
Serial.parseFloat()
參數

返回
float

parseInt()
parseInt()
說明
查找傳入的串行數據流中的下一個有效的整數。 parseInt()繼承了Stream類。
語法
Serial.parseInt()
下面三個命令僅適用於Arduino Mega:
Serial1.parseInt()
Serial2.parseInt()
Serial3.parseInt()
Parameters

返回
int : 下一個有效的整數

peek()
說明
返回傳入的串行數據的下一個字節(字符),而不是進入內部串行緩衝器調取。也就是說,連續調用 peek()將返回相同的字符,與調用read()方法相同。peek()繼承自 Stream類。
語法
Serial.peek()
僅適用於Arduino Mega :
Serial1.peek()
Serial2.peek()
Serial3.peek()
參數

返回
傳入的串行數據的第一個字節(或-1,如果沒有可用的數據的話)- int

print()
說明
以人們可讀的ASCII文本形式打印數據到串口輸出。此命令可以採取多種形式。每個數字的打印輸出使用的是ASCII字符。浮點型同樣打印輸出的是ASCII字符,保留到小數點後兩位。Bytes型則打印輸出單個字符。字符和字符串原樣打印輸出。Serial.print()打印輸出數據不換行,Serial.println()打印輸出數據自動換行處理。例如

Serial.print(78)輸出爲“78” Serial.print(1.23456)輸出爲“1.23”
Serial.print(“N”)輸出爲“N” Serial.print(“Hello world.”)輸出爲“Hello world.”

也可以自己定義輸出爲幾進制(格式);可以是BIN(二進制,或以2爲基數),OCT(八進制,或以8爲基數),DEC(十進制,或以10爲基數),HEX(十六進制,或以16爲基數)。對於浮點型數字,可以指定輸出的小數數位。例如

Serial.print(78,BIN)輸出爲“1001110” Serial.print(78,OCT)輸出爲“116”
Serial.print(78,DEC)輸出爲“78” Serial.print(78,HEX)輸出爲“4E”
Serial.println(1.23456,0)輸出爲“1” Serial.println(1.23456,2)輸出爲“1.23”
Serial.println(1.23456,4)輸出爲“1.2346”

你可以通過基於閃存的字符串來進行打印輸出,將數據放入F()中,再放入Serial.print()。例如 Serial.print(F(“Hello world”)) 若要發送一個字節,則使用 Serial.write()。
語法
Serial.print(val)
Serial.print(val,格式)
參數
val:打印輸出的值 - 任何數據類型
格式:指定進制(整數數據類型)或小數位數(浮點類型)
返回
字節 print()將返回寫入的字節數,但是否使用(或讀出)這個數字是可設定的
例子:

/ * 使用for循環打印一個數字的各種格式。 */ int x = 0; // 定義一個變量並賦值 void setup()
{ Serial.begin(9600); // 打開串口傳輸,並設置波特率爲9600 } void loop() {
/ /打印標籤
Serial.print(“NO FORMAT”); // 打印一個標籤 Serial.print("\t"); // 打印一個轉義字符
Serial.print(“DEC”); Serial.print("\t");
Serial.print(“HEX”); Serial.print("\t");
Serial.print(“OCT”); Serial.print("\t");
Serial.print(“BIN”); Serial.print("\t");

for(x=0; x< 64; x++){ // 打印ASCII碼錶的一部分, 修改它的格式得到需要的內容

/ /打印多種格式:
Serial.print(x); // 以十進制格式將x打印輸出 - 與 “DEC"相同
Serial.print(”\t"); // 橫向跳格
Serial.print(x, DEC); // 以十進制格式將x打印輸出
Serial.print("\t"); // 橫向跳格
Serial.print(x, HEX); // 以十六進制格式打印輸出
Serial.print("\t"); // 橫向跳格
Serial.print(x, OCT); // 以八進制格式打印輸出
Serial.print("\t"); // 橫向跳格
Serial.println(x, BIN); // 以二進制格式打印輸出
// 然後用 “println"打印一個回車
delay(200); // 延時200ms } Serial.println(”"); // 打印一個空字符,並自動換行 } 編程技巧作爲1.0版本,串行傳輸是異步的; Serial.print()將返回之前接收到的任何字符。

println()
說明
打印數據到串行端口,輸出人們可識別的ASCII碼文本並回車 (ASCII 13, 或 ‘\r’) 及換行(ASCII 10, 或 ‘\n’)。此命令採用的形式與Serial.print ()相同 。
語法
Serial.println(val)
Serial.println(val, format)
參數
val: 打印的內容 - 任何數據類型都可以
format: 指定基數(整數數據類型)或小數位數(浮點類型)
返回
字節(byte)
println()將返回寫入的字節數,但可以選擇是否使用它。
例子

/* 模擬輸入信號 讀取模擬口0的模擬輸入,打印輸出讀取的值。 由 Tom Igoe創建於2006年3月24日 */ int
analogValue = 0; // 定義一個變量來保存模擬值 void setup() { //設置串口波特率爲9600
bps: Serial.begin(9600); } void loop() { //讀取引腳0的模擬輸入:
analogValue = analogRead(0);
//打印g各種格式: Serial.println(analogValue); //打印ASCII編碼的十進制 Serial.println(analogValue, DEC); //打印ASCII編碼的十進制
Serial.println(analogValue, HEX); //打印ASCII編碼的十六進制
Serial.println(analogValue, OCT); //打印ASCII編碼的八進制
Serial.println(analogValue, BIN); //打印一個ASCII編碼的二進制
// 延時10毫秒: delay(10); }

read()
說明
讀取傳入的串口的數據。read() 繼承自 Stream 類。
語法
serial.read()
Arduino Mega獨有:
serial1.read()
serial2.read()
serial3.read()
參數

返回
傳入的串口數據的第一個字節(或-1,如果沒有可用的數據)- int
例子

int incomingByte = 0; // 傳入的串行數據 void setup() {
Serial.begin(9600); // 打開串口,設置數據傳輸速率9600 } void loop() {
// 當你接收數據時發送數據 if (Serial.available() > 0) {
// 讀取傳入的數據:
incomingByte = Serial.read();

//打印你得到的:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);   } }

readBytes()
Serial.readBytes()
說明
Serial.readBytes()從串口讀字符到一個緩衝區。如果預設的長度讀取完畢或者時間到了 (參見 Serial.setTimeout()),函數將終止.
Serial.readBytes()返回放置在緩衝區的字符數。返回0意味着沒有發現有效的數據。
Serial.readBytes()繼承自 Stream 類.
語法
Serial.readBytes(buffer, length)
元素
buffer:用來存儲字節(char[]或byte[])的緩衝區
length:讀取的字節數(int)
返回
byte

readBytesUntil()
Serial.readBytesUntil()

說明
Serial.readBytesUntil()將字符從串行緩衝區讀取到一個數組。如果檢測到終止字符,或預設的讀取長度讀取完畢,或者時間到了 (參見 Serial.setTimeout())函數將終止。
Serial.readBytesUntil()返回讀入數組的字符數。返回0意味着沒有發現有效的數據。
Serial.readBytesUntil()繼承自 Stream類。
語法
Serial.readBytesUntil(character, buffer, length)
元素
character :要搜索的字符(char)
buffer :緩衝區來存儲字節(char[]或byte[])
length:讀的字節數(int)
返回
byte

setTimeout()
Serial.setTimeout()

說明
Serial.setTimeout()設置使用Serial.readBytesUntil() 或Serial.readBytes()時等待串口數據的最大毫秒值. 默認爲1000毫秒。
Serial.setTimeout()繼承自Stream 類。
語法
Serial.setTimeout(time)
參數
time :以毫秒爲單位的超時時間(long)。
返回結果

write()
說明
寫入二級制數據到串口。發送的數據以一個字節或者一系列的字節爲單位。如果寫入的數字爲字符,需使用print()命令進行代替。
語法
Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
Arduino Mega還支持:Serial1,Serial2,Serial3 (替代Serial)
參數
val: 以單個字節形式發的值
str: 以一串字節的形式發送的字符串
buf: 以一串字節的形式發送的數組
len: 數組的長度
返回結果
byte
write() 將返回寫入的字節數,但是否使用這個數字是可選的
例子

void setup(){ Serial.begin(9600); } void loop(){
Serial.write(45); // 發送一個值爲45的字節
int bytesSent = Serial.write(“hello”); //發送字符串“hello”,返回該字符串的長度. }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章