arduinohanshu_Arduino 常用函数参考文档
封裝好的API,使得程序中的語句更容易被理解,我們不用理會單片機(jī)中繁雜的寄存器配置,就能直觀的控制Arduino,增強(qiáng)程序可讀性的同時,也提高了開發(fā)效率。
本篇主要介紹:
一,項(xiàng)目結(jié)構(gòu)
1.setup
2.loop
3.main
二,數(shù)字輸入輸出
1.pinMode ( pin , mode )
2.digitalWrite ( pin , value )
3.digitalRead ( pin )
三,模擬輸入輸出
1.analogRead
2.analogWrite
四,模擬輸入輸出
1.tone
2.pulisein
3.外部中斷
-----------------------------------------------------------------------------------------------------------
一,項(xiàng)目結(jié)構(gòu)
1.setup
2.loop
3.main
1.setup():
Arduino控制器通電或復(fù)位后,即會開始執(zhí)行setup() 函數(shù)中的程序,該部分只會執(zhí)行一次。
通常我們會在setup() 函數(shù)中完成Arduino的初始化設(shè)置,如配置I/O口狀態(tài),初始化串口等操作。
eg.示例程序
//給13號引腳連接的設(shè)備設(shè)置一個別名“l(fā)ed”
int led = 13;//在板子啟動或者復(fù)位重啟后, setup部分的程序只會運(yùn)行一次
voidsetup(){//將“l(fā)ed”引腳設(shè)置為輸出狀態(tài)
pinMode(led, OUTPUT);
}//setup部分程序運(yùn)行完后,loop部分的程序會不斷重復(fù)運(yùn)行
voidloop()
{
digitalWrite(led, HIGH);//點(diǎn)亮LED
delay(1000); //等待一秒鐘
digitalWrite(led, LOW); //通過將引腳電平拉低,關(guān)閉LED
delay(1000); //等待一秒鐘
}
2.loop():
在setup() 函數(shù)中的程序執(zhí)行完后,Arduino會接著執(zhí)行l(wèi)oop() 函數(shù)中的程序。而loop()函數(shù)是一個死循環(huán),其中的程序會不斷的重復(fù)運(yùn)行。
通常我們會在loop() 函數(shù)中完成程序的主要功能,如驅(qū)動各種模塊,采集數(shù)據(jù)等。
eg.示例程序
//給13號引腳連接的設(shè)備設(shè)置一個別名“l(fā)ed”
int led = 13;//在板子啟動或者復(fù)位重啟后, setup部分的程序只會運(yùn)行一次
voidsetup(){//將“l(fā)ed”引腳設(shè)置為輸出狀態(tài)
pinMode(led, OUTPUT);
}//setup部分程序運(yùn)行完后,loop部分的程序會不斷重復(fù)運(yùn)行
voidloop()
{
digitalWrite(led, HIGH);//點(diǎn)亮LED
delay(1000); //等待一秒鐘
digitalWrite(led, LOW); //通過將引腳電平拉低,關(guān)閉LED
delay(1000); //等待一秒鐘
}
3.main():
在進(jìn)行Arduino開發(fā)時,沒有像傳統(tǒng)C/C++程序使用入口函數(shù)main。實(shí)際上main函數(shù)存在于Arduino核心庫中,且仍然是程序的入口。
在Arduino核心庫中可見main.cpp文件,其內(nèi)容如下:
#include
//Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }//Weak empty variant initialization function.//May be redefined by variant files.
voidinitVariant() __attribute__((weak));voidinitVariant() { }voidsetupUSB() __attribute__((weak));voidsetupUSB() { }int main(void)
{
init();
initVariant();#if defined(USBCON)USBDevice.attach();#endifsetup();for(;;) {
loop();if(serialEventRun) serialEventRun();
}return 0;
}
通過以上程序可見,Arduino程序中編寫的setup和loop函數(shù),都在main函數(shù)中調(diào)用了。
loop的循環(huán)執(zhí)行,是通過for循環(huán)實(shí)現(xiàn)的,且每次loop結(jié)束后,都會進(jìn)行串口事件判斷,也正是因?yàn)檫@種設(shè)計(jì),串口事件不能實(shí)時響應(yīng)。
二,數(shù)字輸入輸出
1.pinMode ( pin , mode )
2.digitalWrite ( pin , value )
3.digitalRead ( pin )
1.pinMode ( pin , mode ) :
在使用輸入或輸出功能前,你需要先通過pinMode() 函數(shù)配置引腳的模式為輸入模式或輸出模式。
參數(shù):
參數(shù)pin為指定配置的引腳編號
參數(shù)mode為指定的配置模式
通常可用模式有三種:
INPUT 輸入模式
OUTPUT 輸出模式
INPUT_PULLUP 輸入上拉模式
eg.示例程序
/*
Blink
等待一秒鐘,點(diǎn)亮LED,再等待一秒鐘,熄滅LED,如此循環(huán)
*/
// 在大多數(shù)Arduino控制板上 13號引腳都連接了一個標(biāo)有“L”的LED燈
// 給13號引腳連接的設(shè)備設(shè)置一個別名“l(fā)ed”
int led = 13;
// 在板子啟動或者復(fù)位重啟后, setup部分的程序只會運(yùn)行一次
void setup(){
// 將“l(fā)ed”引腳設(shè)置為輸出狀態(tài)
pinMode(led, OUTPUT);
}
// setup部分程序運(yùn)行完后,loop部分的程序會不斷重復(fù)運(yùn)行
void loop()
{
digitalWrite(led, HIGH); // 點(diǎn)亮LED
delay(1000); // 等待一秒鐘
digitalWrite(led, LOW); // 通過將引腳電平拉低,關(guān)閉LED
delay(1000); // 等待一秒鐘
}
2.digitalWrite ( pin , value ) :
之前我們在Blink程序中使用到了pinMode(13, OUTPUT),即是把13號引腳配置為輸出模式。
配置成輸出模式后,你還需要使用digitalWrite() 讓其輸出高電平或者是低電平。
參數(shù):
參數(shù)pin為指定輸出的引腳編號;
參數(shù)value為你要指定輸出的電平
使用HIGH指定輸出高電平,或是使用LOW指定輸出低電平。
eg.示例程序
/*
Blink
等待一秒鐘,點(diǎn)亮LED,再等待一秒鐘,熄滅LED,如此循環(huán)
*/
// 在大多數(shù)Arduino控制板上 13號引腳都連接了一個標(biāo)有“L”的LED燈
// 給13號引腳連接的設(shè)備設(shè)置一個別名“l(fā)ed”
int led = 13;
// 在板子啟動或者復(fù)位重啟后, setup部分的程序只會運(yùn)行一次
void setup(){
// 將“l(fā)ed”引腳設(shè)置為輸出狀態(tài)
pinMode(led, OUTPUT);
}
// setup部分程序運(yùn)行完后,loop部分的程序會不斷重復(fù)運(yùn)行
void loop()
{
digitalWrite(led, HIGH); // 點(diǎn)亮LED
delay(1000); // 等待一秒鐘
digitalWrite(led, LOW); // 通過將引腳電平拉低,關(guān)閉LED
delay(1000); // 等待一秒鐘
}
Arduino中輸出的低電平為0V,輸出的高電平為當(dāng)前Arduino的工作電壓。
例如Arduino UNO的工作電壓為5V,其高電平輸出也是5V;Arduino Uno工作電壓為3.3V,所以高電平輸出也就是3.3V。
3.digitalRead ( pin ) :
在使用輸入或輸出功能前,你需要先通過pinMode() 函數(shù)配置引腳的模式為輸入模式或輸出模式。
參數(shù):
參數(shù)pin為指定讀取狀態(tài)的引腳編號。
返回值:
返回值為獲取到的信號狀態(tài),1為高電平,0為低電平。
eg.示例程序
1 /*
2 通過2號引腳連接的按鍵,控制13號引腳連接的LED3 */
4
5 //設(shè)置各引腳別名
6 const int buttonPin = 2; //連接按鍵的引腳
7 const int ledPin = 13; //連接LED的引腳8
9 //變量定義
10 int buttonState = 0; //存儲按鍵狀態(tài)的變量
11
12 voidsetup() {13 //初始化LED引腳為輸出狀態(tài)
14 pinMode(ledPin, OUTPUT);15 //初始化按鍵引腳為輸入狀態(tài)
16 pinMode(buttonPin, INPUT);17 }18
19 voidloop(){20 //讀取按鍵狀態(tài)并存儲在變量中
21 buttonState =digitalRead(buttonPin);22
23 //檢查按鍵是否被按下24 //如果按鍵按下,那buttonState應(yīng)該為高電平
25 if (buttonState ==HIGH) {26 //點(diǎn)亮LED
27 digitalWrite(ledPin, HIGH);28 }29 else{30 //熄滅LED
31 digitalWrite(ledPin, LOW);32 }33 }
三,模擬輸入輸出
1.analogRead
2.analogWrite
1.analogRead ( pin ) :
模擬輸入引腳是帶有ADC(Analog-to-Digital Converter,模數(shù)轉(zhuǎn)換器)功能的引腳。
它可以將外部輸入的模擬信號轉(zhuǎn)換為芯片運(yùn)算時可以識別的數(shù)字信號,從而實(shí)現(xiàn)讀入模擬值的功能。
模擬輸入功能需要使用analogRead() 函數(shù)。
參數(shù):
參數(shù)pin是指定要讀取模擬值的引腳,被指定的引腳必須是模擬輸入引腳。
如analogRead(A0),即是讀取A0引腳上的模擬值。
返回值:
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號轉(zhuǎn)換為0~1023的整數(shù)形式表示。
eg.示例程序
/*光敏電阻檢測環(huán)境光http://www.arduino.cn/
*/
voidsetup()
{//初始化串口
Serial.begin(9600);
}voidloop()
{//讀出當(dāng)前光線強(qiáng)度,并輸出到串口顯示
int sensorValue =analogRead(A0);
Serial.println(sensorValue);
delay(1000);
}
2.analogWrite ( pin , value ) :
使用analogWrite() 函數(shù)實(shí)現(xiàn)PWM輸出功能。
在Arduino Uno中,提供PWM功能的引腳為3、5、6、9、10、11。
在analogWrite() 和analogRead() 函數(shù)內(nèi)部,已經(jīng)完成了引腳的初始化,因此不用在Setup() 函數(shù)中進(jìn)行初始化操作。
參數(shù):
參數(shù)pin是指定要輸出PWM波的引腳;
參數(shù)value指定是PWM的脈沖寬度,范圍為0~255。
返回值:
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號轉(zhuǎn)換為0~1023的整數(shù)形式表示。
eg.示例程序
/*Fading
通過analogWrite() 函數(shù)實(shí)現(xiàn)呼吸燈效果*/
int ledPin = 9; //LED連接在9號引腳上
voidsetup() {//Setup部分不進(jìn)行任何處理
}voidloop() {//從暗到亮,以每次加5的形式逐漸亮起來
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {//輸出PWM
analogWrite(ledPin, fadeValue);//等待30ms,以便觀察到漸變效果
delay(30);
}//從亮到暗,以每次減5的形式逐漸暗下來
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {//輸出PWM
analogWrite(ledPin, fadeValue);//等待30ms,以便觀察到漸變效果
delay(30);
}
}
四,模擬輸入輸出
1.tone
2.pulisein
3.外部中斷
1.調(diào)聲函數(shù)
1)tone ( ) :
可以讓指定引腳產(chǎn)生一個占空比為50%的指定頻率的方波。
語法:
tone(pin, frequency) tone(pin, frequency, duration)
返回值:
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號轉(zhuǎn)換為0~1023的整數(shù)形式表示。
2)no Tone ( pin ):
停止指定引腳上的方波輸出。
語法:
noTone(pin)
參數(shù):
pin : 余姚停止方波輸出的引腳
eg.示例程序
/*Melody
Plays a melody
This example code is in the public domain.http://arduino.cc/en/Tutorial/Tone
*/#include"pitches.h"
//記錄曲子的音符
int melody[] ={
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};//音符持續(xù)時間 4為四分音符, 8為八分音符
int noteDurations[] ={4, 8, 8, 4,4,4,4,4};voidsetup() {//遍歷整個曲子的音符
for (int thisNote = 0; thisNote < 8; thisNote++) {//noteDurations[]數(shù)組中存儲的是音符的類型//我們需要將其換算為音符持續(xù)時間,方法如下://音符持續(xù)時間=1000ms / 音符類型//例如,四分音符=1000 / 4,8分音符 = 1000/8
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);//為了能辨別出不同的音調(diào),你需要在兩個音調(diào)間設(shè)置一定的延時//增加30%延時時間是比較合適的
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);//停止發(fā)聲
noTone(8);
}
}voidloop() {//程序并不重復(fù),因此這里為空
}
2.pulisein() :
檢測指定引腳上的脈沖信號寬度。
例如當(dāng)要檢查高電平脈沖時,pulseln()會等待指定引腳輸入的電平變高,當(dāng)變高后開始記時,知道輸入電平變低,停止計(jì)時。
pulseln()函數(shù)會返回這個脈沖信號的持續(xù)時間,即這個脈沖的寬度。
函數(shù)還可以設(shè)定超時時間,如果超時設(shè)定時間,仍未檢測到脈沖,則會退出pulseln()函數(shù)并返回0.
當(dāng)沒有設(shè)定超時時間時,pulseln()會默認(rèn)1秒鐘的超時時間。
語法:
1)pulseln ( pin , value )
2)pulsein ( pin , value , timeout )
參數(shù):
pin : 需要讀取脈沖的引腳
value :需要讀取的脈沖類型, HIGH OR LOW
timeout :超時時間 ,單位微秒 ,數(shù)據(jù)類型為無符號長整型。
返回值:
返回脈沖寬度 , 單位微秒 ,數(shù)據(jù)類型為無符號長整型 。 如果在指定時間內(nèi)沒有檢測到脈沖,則返回0 .
eg.示例程序
/*SR04超聲波傳感器驅(qū)動
串口顯示檢測距離*/
//設(shè)定SR04連接的Arduino引腳
const int TrigPin = 2;const int EchoPin = 3;floatdistance;voidsetup()
{//初始化串口通信及連接SR04的引腳
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);//要檢測引腳上輸入的脈沖寬度,需要先設(shè)置為輸入狀態(tài)
pinMode(EchoPin, INPUT);
Serial.println("Ultrasonic sensor:");
}voidloop()
{//產(chǎn)生一個10us的高脈沖去觸發(fā)TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);//檢測脈沖寬度,并計(jì)算出距離
distance = pulseIn(EchoPin, HIGH)/ 58.00;
Serial.print(distance);
Serial.print("cm");
Serial.println();
delay(1000);
}
3.外部中斷
影響中斷的處理程序——中斷函數(shù),當(dāng)中斷觸發(fā)后,Arduino便會進(jìn)行這個函數(shù)。
該函數(shù)不能帶任何參數(shù),且返回類型為空。如:
voidHello () {
flag=ture ;
}
1)attachlneterrupt ( pin , ISR , mode )
對中斷引腳進(jìn)行初始化設(shè)置,以開啟Arduino的外部中斷功能
示例:
attachinterrupt ( 2 , Hello , LOW ) ;該語句會開啟Arduino Uno 的 2 號引腳(中斷編號0)的外部中斷功能,并指定下降沿時觸發(fā)該中斷。
當(dāng)2號引腳上電平由高變低后,該中斷會被觸發(fā),Arduino即會運(yùn)行Hello ()函數(shù)中的語句。
2) detachlnterrupt ( pin )
如果你不需要使用外部中斷了,你可以用中斷分離函數(shù)detachlnterrupt()來關(guān)閉中斷功能。
參數(shù):
pin : 需要禁用中斷的引腳。
示例:
detachlnterrupt( 2 )
eg.示例程序
/*Arduino外部中斷的使用
外部中斷觸發(fā)警報(bào)聲*/
//默認(rèn)無遮擋,蜂鳴器發(fā)聲
volatile boolean RunBuzzer = true;voidsetup()
{
Serial.begin(9600);//初始化外部中斷//當(dāng)2號引腳輸入的電平由高變低時,觸發(fā)中斷函數(shù)warning
attachInterrupt(2, warning, CHANGE);
}voidloop()
{if(RunBuzzer)
{
tone(8,1000);
}else{
noTone(8);
}
}//中斷函數(shù)
voidwarning ()
{
RunBuzzer=!RunBuzzer;
}
總結(jié)
以上是生活随笔為你收集整理的arduinohanshu_Arduino 常用函数参考文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惠普的电脑怎么开启 惠普电脑如何开机
- 下一篇: 神经网络 并行预测_研究人员研究了为什么