Arduino--常用函數(shù)(二)

一柱锹、數(shù)字 I/O

  1. pinMode()
    描述
    將指定的引腳配置成輸出或輸入百姓。詳情請(qǐng)見(jiàn)digital pins。
    語(yǔ)法
    pinMode(pin, mode)
    參數(shù)
    pin:要設(shè)置模式的引腳
    mode:INPUT或OUTPUT
    返回
    無(wú)
    例子
ledPin = 13 // LED連接到數(shù)字腳13
void setup()
{
pinMode(ledPin符匾,OUTPUT); //設(shè)置數(shù)字腳為輸出
}
void loop()
{
digitalWrite(ledPin净薛,HIGH); //點(diǎn)亮LED
delay(1000); // 等待一秒
digitalWrite(ledPin, LOW); // 滅掉LED
延遲(1000); //等待第二個(gè)
}

注意
模擬輸入腳也能當(dāng)做數(shù)字腳使用,參見(jiàn)A0俘闯,A1等

  1. digitalWrite()
    描述
    給一個(gè)數(shù)字引腳寫(xiě)入HIGH或者LOW潭苞。
    如果一個(gè)引腳已經(jīng)使用pinMode()配置為OUTPUT模式,其電壓將被設(shè)置為相應(yīng)的值真朗,HIGH為5V(3.3V控制板上為3.3V)此疹,LOW為0V。
    如果引腳配置為INPUT模式,使用digitalWrite()寫(xiě)入HIGH值蝗碎,將使內(nèi)部20K上拉電阻(詳見(jiàn)數(shù)字引腳教程)湖笨。寫(xiě)入LOW將會(huì)禁用上拉。上拉電阻可以點(diǎn)亮一個(gè)LED讓其微微亮蹦骑,如果LED工作慈省,但是亮度很低,可能是因?yàn)檫@個(gè)原因引起的眠菇。補(bǔ)救的辦法是 使用pinMode()函數(shù)設(shè)置為輸出引腳辫呻。
    注意:數(shù)字13號(hào)引腳難以作為數(shù)字輸入使用,因?yàn)榇蟛糠值目刂瓢迳鲜褂昧艘活wLED與一個(gè)電阻連接到他琼锋。如果啟動(dòng)了內(nèi)部的20K上拉電阻放闺,他的電壓將在1.7V左右,而不是正常的5V缕坎,因?yàn)榘遢dLED串聯(lián)的電阻把他使他降了下來(lái)怖侦,這意味著他返回的值總是LOW。如果必須使用數(shù)字13號(hào)引腳的輸入模式谜叹,需要使用外部上拉下拉電阻匾寝。
    語(yǔ)法
    digitalWrite(pin, value)
    參數(shù)
    pin: 引腳編號(hào)(如1,5,10,A0荷腊,A3)
    value: HIGH or LOW
    返回
    無(wú)
    例子
int ledPin = 13; // LED連接到數(shù)字13號(hào)端口
void setup()
{
pinMode(ledPin, OUTPUT); // 設(shè)置數(shù)字端口為輸入模式
}
void loop()
{
digitalWrite(ledPin, HIGH); // 使LED亮
delay(1000); // 延遲一秒
digitalWrite(ledPin, LOW); // 使LED滅
delay(1000); // 延遲一秒
}

13號(hào)端口設(shè)置為高電平艳悔,延遲一秒,然后設(shè)置為低電平女仰。
注釋
模擬引腳也可以當(dāng)做數(shù)字引腳使用猜年,使用方法是輸入端口A0,A1疾忍,A2等乔外。

  1. digitalRead()
    描述
    讀取指定引腳的值,HIGH或LOW一罩。
    語(yǔ)法
    digitalRead(PIN)
    參數(shù)
    pin:你想讀取的引腳號(hào)(int)
    返回
    HIGH 或 LOW
    例子
ledPin = 13 // LED連接到13腳
int inPin = 7; // 按鈕連接到數(shù)字引腳7
int val = 0; //定義變量存以儲(chǔ)讀值
void setup()
{
pinMode(ledPin, OUTPUT); // 將13腳設(shè)置為輸出
pinMode(inPin, INPUT); // 將7腳設(shè)置為輸入
}
void loop()
{
val = digitalRead(inPin); // 讀取輸入腳
digitalWrite(ledPin, val); //將LED值設(shè)置為按鈕的值
}

將13腳設(shè)置為輸入腳7腳的值杨幼。
注意
如果引腳懸空,digitalRead()會(huì)返回HIGH或LOW(隨機(jī)變化)聂渊。
模擬輸入腳能當(dāng)做數(shù)字腳使用差购,參見(jiàn)A0,A1等汉嗽。

二欲逃、模擬 I/O

  1. analogReference()
    描述
    配置用于模擬輸入的基準(zhǔn)電壓(即輸入范圍的最大值)。選項(xiàng)??有:
    DEFAULT:默認(rèn)5V(Arduino板為5V)或3.3伏特(Arduino板為3.3V)為基準(zhǔn)電壓诊胞。
    INTERNAL:在ATmega168和ATmega328上以1.1V為基準(zhǔn)電壓暖夭,以及在ATmega8上以2.56V為基準(zhǔn)電壓(Arduino Mega無(wú)此選項(xiàng))
    INTERNAL1V1:以1.1V為基準(zhǔn)電壓(此選項(xiàng)僅針對(duì)Arduino Mega)
    INTERNAL2V56:以2.56V為基準(zhǔn)電壓(此選項(xiàng)僅針對(duì)Arduino Mega)
    EXTERNAL:以AREF引腳(0至5V)的電壓作為基準(zhǔn)電壓锹杈。
    參數(shù)
    type:使用哪種參考類(lèi)型(DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, 或者 EXTERNAL)。
    返回
    無(wú)
    注意事項(xiàng)
    改變基準(zhǔn)電壓后迈着,之前從anal??ogRead()讀取的數(shù)據(jù)可能不準(zhǔn)確竭望。
    警告
    不要在AREF引腳上使用使用任何小于0V或超過(guò)5V的外部電壓。如果你使用AREF引腳上的電壓作為基準(zhǔn)電壓裕菠,你在調(diào)用analogRead()前必須設(shè)置參考類(lèi)型為EXTERNAL咬清。否則,你將會(huì)削短有效的基準(zhǔn)電壓(內(nèi)部產(chǎn)生)和AREF引腳奴潘,這可能會(huì)損壞您Arduino板上的單片機(jī)旧烧。
    另外,您可以在外部基準(zhǔn)電壓和AREF引腳之間連接一個(gè)5K電阻画髓,使你可以在外部和內(nèi)部基準(zhǔn)電壓之間切換掘剪。請(qǐng)注意,總阻值將會(huì)發(fā)生改變奈虾,因?yàn)锳REF引腳內(nèi)部有一個(gè)32K電阻夺谁。這兩個(gè)電阻都有分壓作用。所以肉微,例如匾鸥,如果輸入2.5V的電壓,最終在在AREF引腳上的電壓將為2.5 * 32 /(32 + 5)= 2.2V碉纳。

  2. analogRead()
    描述
    從指定的模擬引腳讀取數(shù)據(jù)值勿负。 Arduino板包含一個(gè)6通道(Mini和Nano有8個(gè)通道,Mega有16個(gè)通道)劳曹,10位模擬數(shù)字轉(zhuǎn)換器奴愉。這意味著它將0至5伏特之間的輸入電壓映射到0至1023之間的整數(shù)值。這將產(chǎn)生讀數(shù)之間的關(guān)系:5伏特/ 1024單位厚者,或0.0049伏特(4.9 mV)每單位躁劣。輸入范圍和精度可以使用analogReference()改變。 它需要大約100微秒(0.0001)來(lái)讀取模擬輸入库菲,所以最大的閱讀速度是每秒10000次。
    語(yǔ)法
    analogRead(PIN)
    數(shù)值的讀取
    引腳:從輸入引腳(大部分板子從0到5志膀,Mini和Nano從0到7熙宇,Mega從0到15)讀取數(shù)值
    返回
    從0到1023的整數(shù)值
    注意事項(xiàng)
    如果模擬輸入引腳沒(méi)有連入電路,由analogRead()返回的值將根據(jù)多項(xiàng)因素(例如其他模擬輸入引腳溉浙,你的手靠近板子等)產(chǎn)生波動(dòng)烫止。
    例子

int analogPin = 3; //電位器(中間的引腳)連接到模擬輸入引腳3
                  //另外兩個(gè)引腳分別接地和+5 V
int val = 0; //定義變量來(lái)存儲(chǔ)讀取的數(shù)值
void setup()
{
serial.begin(9600); //設(shè)置波特率(9600)
}
void loop()
{
val = analogRead(analogPin); //從輸入引腳讀取數(shù)值
serial.println(val); //顯示讀取的數(shù)值
}
  1. analogWrite() PWM
    描述
    從一個(gè)引腳輸出模擬值(PWM)〈粱可用于讓LED以不同的亮度點(diǎn)亮或驅(qū)動(dòng)電機(jī)以不同的速度旋轉(zhuǎn)馆蠕。analogWrite()輸出結(jié)束后期升,該引腳將產(chǎn)生一個(gè)穩(wěn)定的特殊占空比方波,直到下次調(diào)用analogWrite()(或在同一引腳調(diào)用digitalRead()或digitalWrite())互躬。PWM信號(hào)的頻率大約是490赫茲播赁。
    在大多數(shù)arduino板(ATmega168或ATmega328),只有引腳3吼渡,5容为,6,9寺酪,10和11可以實(shí)現(xiàn)該功能坎背。在aduino Mega上,引腳2到13可以實(shí)現(xiàn)該功能寄雀。老的Arduino板(ATmega8)的只有引腳9得滤、10、11可以使用analogWrite()盒犹。在使用analogWrite()前,你不需要調(diào)用pinMode()來(lái)設(shè)置引腳為輸出引腳。
    analogWrite函數(shù)與模擬引腳悍募、analogRead函數(shù)沒(méi)有直接關(guān)系。
    語(yǔ)法
    analogWrite(pin,value)
    參數(shù)
    pin:用于輸入數(shù)值的引腳。
    value:占空比:0(完全關(guān)閉)到255(完全打開(kāi))之間。
    返回
    無(wú)
    說(shuō)明和已知問(wèn)題
    引腳5和6的PWM輸出將高于預(yù)期的占空比(輸出的數(shù)值偏高)邦尊。這是因?yàn)閙illis()和delay()功能疑苫,和PWM輸出共享相同的內(nèi)部定時(shí)器挺勿。這將導(dǎo)致大多時(shí)候處于低占空比狀態(tài)(如:0 - 10)蚊丐,并可能導(dǎo)致在數(shù)值為0時(shí)凛篙,沒(méi)有完全關(guān)閉引腳5和6填物。
    例子
    通過(guò)讀取電位器的阻值控制LED的亮度
int ledPin = 9; // LED連接到數(shù)字引腳9
int analogPin = 3; //電位器連接到模擬引腳3
int val = 0; //定義變量存以儲(chǔ)讀值
void setup()
{
pinMode(ledPin,OUTPUT); //設(shè)置引腳為輸出引腳
}
void loop()
{
val = analogRead(analogPin); //從輸入引腳讀取數(shù)值
analogWrite(ledPin覆劈,val / 4); // 以val / 4的數(shù)值點(diǎn)亮LED(因?yàn)閍nalogRead讀取的數(shù)值從0到1023,而analogWrite輸出的數(shù)值從0到255)
}

三胁赢、高級(jí) I/O

  1. tone()
    描述
    在一個(gè)引腳上產(chǎn)生一個(gè)特定頻率的方波(50%占空比)企蹭。持續(xù)時(shí)間可以設(shè)定,否則波形會(huì)一直產(chǎn)生直到調(diào)用noTone()函數(shù)智末。該引腳可以連接壓電蜂鳴器或其他喇叭播放聲音谅摄。
    在同一時(shí)刻只能產(chǎn)生一個(gè)聲音。如果一個(gè)引腳已經(jīng)在播放音樂(lè)系馆,那調(diào)用tone()將不會(huì)有任何效果送漠。如果音樂(lè)在同一個(gè)引腳上播放,它會(huì)自動(dòng)調(diào)整頻率由蘑。
    使用tone()函數(shù)會(huì)與3腳和11腳的PWM產(chǎn)生干擾(Mega板除外)闽寡。
    注意:如果你要在多個(gè)引腳上產(chǎn)生不同的音調(diào),你要在對(duì)下一個(gè)引腳使用tone()函數(shù)前對(duì)此引腳調(diào)用noTone()函數(shù)尼酿。
    語(yǔ)法
    tone(pin, frequency)
    tone(pin, frequency, duration)
    參數(shù)
    pin:要產(chǎn)生聲音的引腳
    frequency: 產(chǎn)生聲音的頻率爷狈,單位Hz,類(lèi)型unsigned int
    duration:聲音持續(xù)的時(shí)間裳擎,單位毫秒(可選)涎永,類(lèi)型unsigned long
  2. noTone()
    描述
    停止由tone()產(chǎn)生的方波。如果沒(méi)有使用tone()將不會(huì)有效果句惯。
    注意:如果你想在多個(gè)引腳上產(chǎn)生不同的聲音土辩,你要在對(duì)下個(gè)引腳使用tone()前對(duì)剛才的引腳調(diào)用noTone().
    語(yǔ)法
    noTone(pin)
    參數(shù)
    pin: 所要停止產(chǎn)生聲音的引腳
  3. shiftOut()
    描述
    將一個(gè)數(shù)據(jù)的一個(gè)字節(jié)一位一位的移出。從最高有效位(最左邊)或最低有效位(最右邊)開(kāi)始抢野。依次向數(shù)據(jù)腳寫(xiě)入每一位拷淘,之后時(shí)鐘腳被拉高或拉低,指示剛才的數(shù)據(jù)有效指孤。
    注意:如果你所連接的設(shè)備時(shí)鐘類(lèi)型為上升沿启涯,你要確定在調(diào)用shiftOut()前時(shí)鐘腳為低電平,如調(diào)用digitalWrite(clockPin, LOW)恃轩。
    注意:這是一個(gè)軟件實(shí)現(xiàn)结洼;Arduino提供了一個(gè)硬件實(shí)現(xiàn)的SPI庫(kù),它速度更快但只在特定腳有效叉跛。
    語(yǔ)法
    shiftOut(dataPin, clockPin, bitOrder, value)
    參數(shù)
    dataPin:輸出每一位數(shù)據(jù)的引腳(int)
    clockPin:時(shí)鐘腳松忍,當(dāng)dataPin有值時(shí)此引腳電平變化(int)
    bitOrder:輸出位的順序,最高位優(yōu)先或最低位優(yōu)先
    value: 要移位輸出的數(shù)據(jù)(byte)
    返回
    無(wú)
    注意
dataPin和clockPin要用pinMode()配置為輸出筷厘。 shiftOut目前只能輸出1個(gè)字節(jié)(8位)鸣峭,所以如果輸出值大于255需要分兩步宏所。
//最高有效位優(yōu)先串行輸出
int 數(shù)據(jù)= 500;
//移位輸出高字節(jié)
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
//移位輸出低字節(jié)
shiftOut(data, clock, MSBFIRST, data);
//最低有效位優(yōu)先串行輸出
data = 500;
//移位輸出低字節(jié)
shiftOut(dataPin, clock, LSBFIRST, data);
//移位輸出高字節(jié)
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));

例子

// 相應(yīng)電路,查看tutorial on controlling a 74HC595 shift register
// ************************************************ ************** //
// 注釋?zhuān)菏褂?4HC595移位寄存器從0到255計(jì)數(shù) //
//
// ************************************************ ****************
//引腳連接到74HC595的ST_CP
int latchPin = 8;
//引腳連接到74HC595的SH_CP
int clockPin = 12;
// //引腳連接到74HC595的DS
int dataPin = 11;
void setup() {
//設(shè)置引腳為輸出
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//向上計(jì)數(shù)程序
(J = 0; J <256; J + +){
 //傳輸數(shù)據(jù)的時(shí)候?qū)atchPin拉低
digitalWrite(latchpin, LOW);
 shiftOut的 (dataPin摊溶,clockPin爬骤,LSBFIRST,J);
//之后將latchPin拉高以告訴芯片
 //它不需要再接受信息了
digitalWrite(latchpin, HIGH);
 delay(1000);
}
}
  1. shiftIn()
    描述
    將一個(gè)數(shù)據(jù)的一個(gè)字節(jié)一位一位的移入莫换。從最高有效位(最左邊)或最低有效位(最右邊)開(kāi)始霞玄。對(duì)于每個(gè)位,先拉高時(shí)鐘電平拉岁,再?gòu)臄?shù)據(jù)傳輸線中讀取一位坷剧,再將時(shí)鐘線拉低。
    注意:這是一個(gè)軟件實(shí)現(xiàn)膛薛;Arduino提供了一個(gè)硬件實(shí)現(xiàn)的SPI庫(kù)听隐,它速度更快但只在特定腳有效。
    語(yǔ)法
shiftIn(dataPin,clockPin,bitOrder)

參數(shù)
dataPin:輸出每一位數(shù)據(jù)的引腳(int)
clockPin:時(shí)鐘腳哄啄,當(dāng)dataPin有值時(shí)此引腳電平變化(int)
bitOrder:輸出位的順序雅任,最高位優(yōu)先或最低位優(yōu)先

  1. pulseIn()
    描述
    讀取一個(gè)引腳的脈沖(HIGH或LOW)。例如咨跌,如果value是HIGH沪么,pulseIn()會(huì)等待引腳變?yōu)镠IGH,開(kāi)始計(jì)時(shí)锌半,再等待引腳變?yōu)長(zhǎng)OW并停止計(jì)時(shí)禽车。返回脈沖的長(zhǎng)度,單位微秒刊殉。如果在指定的時(shí)間內(nèi)無(wú)脈沖函數(shù)返回殉摔。
    此函數(shù)的計(jì)時(shí)功能由經(jīng)驗(yàn)決定,長(zhǎng)時(shí)間的脈沖計(jì)時(shí)可能會(huì)出錯(cuò)记焊。計(jì)時(shí)范圍從10微秒至3分鐘逸月。(1秒=1000毫秒=1000000微秒)
    語(yǔ)法
pulseIn(pin, value)
pulseIn(pin, value, timeout)

參數(shù)
pin:你要進(jìn)行脈沖計(jì)時(shí)的引腳號(hào)(int)。
value:要讀取的脈沖類(lèi)型遍膜,HIGH或LOW(int)碗硬。
timeout (可選):指定脈沖計(jì)數(shù)的等待時(shí)間,單位為微秒瓢颅,默認(rèn)值是1秒(unsigned long)
返回
脈沖長(zhǎng)度(微秒)恩尾,如果等待超時(shí)返回0(unsigned long)
例子

int pin = 7;
unsigned long duration;
void setup()
{
pinMode(pin, INPUT);
}
void loop()
{
duration = pulseIn(pin, HIGH);;
}

四、時(shí)間

  1. millis()
    描述
    返回Arduino開(kāi)發(fā)板從運(yùn)行當(dāng)前程序開(kāi)始的毫秒數(shù)挽懦。這個(gè)數(shù)字將在約50天后溢出(歸零)翰意。
    參數(shù)
    無(wú)
    返回
    返回從運(yùn)行當(dāng)前程序開(kāi)始的毫秒數(shù)(無(wú)符號(hào)長(zhǎng)整數(shù))。
    例子
unsigned long time;
void setup(){
 Serial.begin(9600);
}
void loop(){
serial.print(“Time:”);
time = millis();
//打印從程序開(kāi)始到現(xiàn)在的時(shí)間
serial.println(time);
//等待一秒鐘猎物,以免發(fā)送大量的數(shù)據(jù)
 delay(1000);
}

提示
注意虎囚,參數(shù) millis 是一個(gè)無(wú)符號(hào)長(zhǎng)整數(shù),試圖和其他數(shù)據(jù)類(lèi)型(如整型數(shù))做數(shù)學(xué)運(yùn)算可能會(huì)產(chǎn)生錯(cuò)誤蔫磨。
當(dāng)中斷函數(shù)發(fā)生時(shí),millis()的數(shù)值將不會(huì)繼續(xù)變化圃伶。

  1. micros()
    描述
    返回 Arduino 開(kāi)發(fā)板從運(yùn)行當(dāng)前程序開(kāi)始的微秒數(shù)堤如。這個(gè)數(shù)字將在約70分鐘后溢出(歸零)。在 16MHz 的 Arduino 開(kāi)發(fā)板上(比如 Duemilanove 和 Nano)窒朋,這個(gè)函數(shù)的分辨率為四微秒(即返回值總是四的倍數(shù))搀罢。在 8MHz 的 Arduino 開(kāi)發(fā)板上(比如 LilyPad),這個(gè)函數(shù)的分辨率為八微秒侥猩。
    注意 :每毫秒是1,000微秒榔至,每秒是1,000,000微秒。
    參數(shù)
    無(wú)
    返回
    返回從運(yùn)行當(dāng)前程序開(kāi)始的微秒數(shù)(無(wú)符號(hào)長(zhǎng)整數(shù))欺劳。
    例子
unsigned long time;
void setup(){
 Serial.begin(9600);
}
void loop(){
Serial.print(“Time:”);
time = micros();
//打印從程序開(kāi)始的時(shí)間
Serial.println(time);
//等待一秒鐘唧取,以免發(fā)送大量的數(shù)據(jù)
 delay(1000);
}
  1. delay()
    描述
    使程序暫定設(shè)定的時(shí)間(單位毫秒)。(一秒等于1000毫秒)
    語(yǔ)法
    delay(ms)
    參數(shù)
    ms:暫停的毫秒數(shù)(unsigned long)
    返回
    無(wú)
    例子
ledPin = 13 / / LED連接到數(shù)字13腳
void setup()
{
pinMode(ledPin, OUTPUT); // 設(shè)置引腳為輸出
}
void loop()
{
digitalWrite(ledPin, HIGH); // 點(diǎn)亮LED
delay(1000); // 等待1秒
digitalWrite(ledPin, LOW); // 滅掉LED
delay(1000); // 等待一秒
}

警告
雖然創(chuàng)建一個(gè)使用delay()的閃爍LED很簡(jiǎn)單划提,并且許多例子將很短的delay用于消除開(kāi)關(guān)抖動(dòng)枫弟,delay()確實(shí)擁有很多顯著的缺點(diǎn)。在delay函數(shù)使用的過(guò)程中鹏往,讀取傳感器值淡诗、計(jì)算、引腳操作均無(wú)法執(zhí)行伊履,因此韩容,它所帶來(lái)的后果就是使其他大多數(shù)活動(dòng)暫停。其他操作定時(shí)的方法請(qǐng)參加millis()函數(shù)和它下面的例子唐瀑。大多數(shù)熟練的程序員通常避免超過(guò)10毫秒的delay(),除非arduino程序非常簡(jiǎn)單群凶。
但某些操作在delay()執(zhí)行時(shí)任然能夠運(yùn)行,因?yàn)閐elay函數(shù)不會(huì)使中斷失效介褥。通信端口RX接收到得數(shù)據(jù)會(huì)被記錄座掘,PWM(analogWrite)值和引腳狀態(tài)會(huì)保持,中斷也會(huì)按設(shè)定的執(zhí)行柔滔。

  1. delayMicroseconds()
    描述
    使程序暫停指定的一段時(shí)間(單位:微秒)溢陪。一秒等于1000000微秒。 目前睛廊,能夠產(chǎn)生的最大的延時(shí)準(zhǔn)確值是16383形真。這可能會(huì)在未來(lái)的Arduino版本中改變。對(duì)于超過(guò)幾千微秒的延遲,你應(yīng)該使用delay()代替咆霜。
    語(yǔ)法
    delayMicroseconds(us)
    參數(shù)
    us:暫停的時(shí)間邓馒,單位微秒(unsigned int)
    返回
    無(wú)
    例子
int outPin = 8; // digital pin 8
void setup()
{
pinMode(outPin,OUTPUT); //設(shè)置為輸出的數(shù)字管腳
}
void loop()
{
digitalWrite(outPin蛾坯,HIGH); //設(shè)置引腳高電平
delayMicroseconds(50); // 暫停50微秒
digitalWrite(outPin, LOW); // 設(shè)置引腳低電平
delayMicroseconds(50); // 暫停50微秒
}

將8號(hào)引腳配置為輸出腳光酣。它會(huì)發(fā)出一系列周期100微秒的方波。
警告和已知問(wèn)題
此函數(shù)在3微秒以以上工作的非常準(zhǔn)確脉课。我們不能保證救军,delayMicroseconds在更小的時(shí)間內(nèi)延時(shí)準(zhǔn)確。
Arduino0018版本后倘零,delayMicroseconds()不再會(huì)使中斷失效唱遭。

五、數(shù)學(xué)運(yùn)算

  1. min()
    min(x, y)
    描述
    計(jì)算兩個(gè)數(shù)字中的最小值呈驶。
    參數(shù)
    X:第一個(gè)數(shù)字拷泽,任何數(shù)據(jù)類(lèi)型
    Y:第二個(gè)數(shù)字,任何數(shù)據(jù)類(lèi)型
    返回
    兩個(gè)數(shù)字中的較小者袖瞻。
    舉例
sensVal = min(sensVal司致,100); //將 sensVal 或 100 中較小者賦值給 sensVal
//確保它永遠(yuǎn)不會(huì)大于 100。

注釋
直觀的比較虏辫,max() 方法常被用來(lái)約束變量的下限蚌吸,而 min() 常被用來(lái)約束變量的上限。
警告
由于 min() 函數(shù)的實(shí)現(xiàn)方式砌庄,應(yīng)避免在括號(hào)內(nèi)出現(xiàn)其他函數(shù)羹唠,這將導(dǎo)致不正確的結(jié)果。
min(a++, 100); //避免這種情況 - 會(huì)產(chǎn)生不正確的結(jié)果
a++;
min(a, 100); //使用這種形式替代 - 將其他數(shù)學(xué)運(yùn)算放在函數(shù)之外

  1. max()
    max(x,y)
    描述
    計(jì)算兩個(gè)數(shù)的最大值娄昆。
    參數(shù)
    X:第一個(gè)數(shù)字佩微,任何數(shù)據(jù)類(lèi)型
    Y:第二個(gè)數(shù)字,任何數(shù)據(jù)類(lèi)型
    返回
    兩個(gè)參數(shù)中較大的一個(gè)萌焰。
    例子
sensVal = max(senVal, 20); // 將20或更大值賦給sensVal
//(有效保障它的值至少為20)

注意
和直觀相反哺眯,max()通常用來(lái)約束變量最小值,而min()通常用來(lái)約束變量的最大值扒俯。
警告
由于max()函數(shù)的實(shí)現(xiàn)方法奶卓,要避免在括號(hào)內(nèi)嵌套其他函數(shù),這可能會(huì)導(dǎo)致不正確的結(jié)果撼玄。
max(a–, 0); //避免此用法夺姑,這會(huì)導(dǎo)致不正確結(jié)果
a–; // 用此方法代替
max(a, 0); // 將其他計(jì)算放在函數(shù)外

  1. abs()
    ABS(X)
    描述
    計(jì)算一個(gè)數(shù)的絕對(duì)值。
    參數(shù)
    X:一個(gè)數(shù)
    返回
    如果x大于或等于0掌猛,則返回它本身盏浙。 如果x小于0,則返回它的相反數(shù)。
    警告
    由于實(shí)現(xiàn)ABS()函數(shù)的方法废膘,避免在括號(hào)內(nèi)使用任何函數(shù)(括號(hào)內(nèi)只能是數(shù)字)竹海,否則將導(dǎo)致不正確的結(jié)果。
    ABS(a+ +); //避免這種情況丐黄,否則它將產(chǎn)生不正確的結(jié)果
    a ++; //使用這段代碼代替上述的錯(cuò)誤代碼
    ABS(a); //保證其他函數(shù)放在括號(hào)的外部
  2. constrain()
    描述
    將一個(gè)數(shù)約束在一個(gè)范圍內(nèi)
    參數(shù)
    x:要被約束的數(shù)字斋配,所有的數(shù)據(jù)類(lèi)型適用。
    a:該范圍的最小值孵稽,所有的數(shù)據(jù)類(lèi)型適用许起。
    b:該范圍的最大值,所有的數(shù)據(jù)類(lèi)型適用菩鲜。
    返回值
    x:如果 x是介于 a 和 b之間
    a:如果 x小于a
    b:如果 x大于b
    例子
sensVal = constrain(sensVal, 10, 150);
//傳感器返回值的范圍限制在10到150之間
  1. map()
map(value, fromLow, fromHigh, toLow, toHigh)

描述
將一個(gè)數(shù)從一個(gè)范圍映射到另外一個(gè)范圍。也就是說(shuō)惦积,會(huì)將 fromLow 到 fromHigh 之間的值映射到 toLow 在 toHigh 之間的值接校。
不限制值的范圍,因?yàn)榉秶獾闹涤袝r(shí)是刻意的和有用的狮崩。如果需要限制的范圍蛛勉, constrain() 函數(shù)可以用于此函數(shù)之前或之后。
注意睦柴,兩個(gè)范圍中的“下限”可以比“上限”更大或者更小诽凌,因此 map() 函數(shù)可以用來(lái)翻轉(zhuǎn)數(shù)值的范圍,例如:

y = map(x, 1, 50, 50, 1);

這個(gè)函數(shù)同樣可以處理負(fù)數(shù)坦敌,請(qǐng)看下面這個(gè)例子:

y = map(x, 1, 50, 50, -100);

是有效的并且可以很好的運(yùn)行侣诵。
map() 函數(shù)使用整型數(shù)進(jìn)行運(yùn)算因此不會(huì)產(chǎn)生分?jǐn)?shù),這時(shí)運(yùn)算應(yīng)該表明它需要這樣做狱窘。小數(shù)的余數(shù)部分會(huì)被舍去杜顺,不會(huì)四舍五入或者平均。
參數(shù)
value:需要映射的值
fromLow:當(dāng)前范圍值的下限
fromHigh:當(dāng)前范圍值的上限
toLow:目標(biāo)范圍值的下限
toHigh:目標(biāo)范圍值的上限
返回值
被映射的值蘸炸。
例子

/映射一個(gè)模擬值到8位(0到255)/
void setup(){}
void loop()
{
int val = analogRead(0);
val = map(val, 0, 1023, 0, 255);
analogWrite(9, val);
}

附錄:

關(guān)于數(shù)學(xué)的實(shí)現(xiàn)躬络,這里是完整函數(shù)

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;
}
  1. pow()
    pow(base, exponent)
    描述
    計(jì)算一個(gè)數(shù)的冪次方。Pow()可以用來(lái)計(jì)算一個(gè)數(shù)的分?jǐn)?shù)冪搭儒。這用來(lái)產(chǎn)生指數(shù)冪的數(shù)或曲線非常方便穷当。
    參數(shù)
    base:底數(shù)(float)
    exponent:冪(float)
    返回
    一個(gè)數(shù)的冪次方值(double)
    例子
    詳情見(jiàn) 庫(kù)代碼中的fscale函數(shù)。
  2. sqrt()
    sqrt(x)
    描述
    計(jì)算一個(gè)數(shù)的平方根淹禾。
    參數(shù)
    x:被開(kāi)方數(shù)馁菜,任何類(lèi)型
    返回值
    此數(shù)的平方根,類(lèi)型double
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稀拐,一起剝皮案震驚了整個(gè)濱河市火邓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖铲咨,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躲胳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡纤勒,警方通過(guò)查閱死者的電腦和手機(jī)坯苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摇天,“玉大人粹湃,你說(shuō)我怎么就攤上這事∪” “怎么了为鳄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)腕让。 經(jīng)常有香客問(wèn)我孤钦,道長(zhǎng),這世上最難降的妖魔是什么纯丸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任偏形,我火速辦了婚禮,結(jié)果婚禮上觉鼻,老公的妹妹穿的比我還像新娘俊扭。我一直安慰自己,他們只是感情好坠陈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布萨惑。 她就那樣靜靜地躺著,像睡著了一般畅姊。 火紅的嫁衣襯著肌膚如雪咒钟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天若未,我揣著相機(jī)與錄音朱嘴,去河邊找鬼。 笑死粗合,一個(gè)胖子當(dāng)著我的面吹牛萍嬉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隙疚,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼壤追,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了供屉?” 一聲冷哼從身側(cè)響起行冰,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溺蕉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悼做,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疯特,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年肛走,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了漓雅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朽色,死狀恐怖邻吞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葫男,我是刑警寧澤抱冷,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站梢褐,受9級(jí)特大地震影響徘层,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜利职,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘦癌。 院中可真熱鬧猪贪,春花似錦、人聲如沸讯私。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斤寇。三九已至桶癣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娘锁,已是汗流浹背牙寞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莫秆,地道東北人间雀。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镊屎,于是被迫代替她去往敵國(guó)和親惹挟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容