arduinohanshu_Arduino 常用函数参考文档
封裝好的API,使得程序中的語句更容易被理解,我們不用理會單片機中繁雜的寄存器配置,就能直觀的控制Arduino,增強程序可讀性的同時,也提高了開發效率。
本篇主要介紹:
一,項目結構
1.setup
2.loop
3.main
二,數字輸入輸出
1.pinMode ( pin , mode )
2.digitalWrite ( pin , value )
3.digitalRead ( pin )
三,模擬輸入輸出
1.analogRead
2.analogWrite
四,模擬輸入輸出
1.tone
2.pulisein
3.外部中斷
-----------------------------------------------------------------------------------------------------------
一,項目結構
1.setup
2.loop
3.main
1.setup():
Arduino控制器通電或復位后,即會開始執行setup() 函數中的程序,該部分只會執行一次。
通常我們會在setup() 函數中完成Arduino的初始化設置,如配置I/O口狀態,初始化串口等操作。
eg.示例程序
//給13號引腳連接的設備設置一個別名“led”
int led = 13;//在板子啟動或者復位重啟后, setup部分的程序只會運行一次
voidsetup(){//將“led”引腳設置為輸出狀態
pinMode(led, OUTPUT);
}//setup部分程序運行完后,loop部分的程序會不斷重復運行
voidloop()
{
digitalWrite(led, HIGH);//點亮LED
delay(1000); //等待一秒鐘
digitalWrite(led, LOW); //通過將引腳電平拉低,關閉LED
delay(1000); //等待一秒鐘
}
2.loop():
在setup() 函數中的程序執行完后,Arduino會接著執行loop() 函數中的程序。而loop()函數是一個死循環,其中的程序會不斷的重復運行。
通常我們會在loop() 函數中完成程序的主要功能,如驅動各種模塊,采集數據等。
eg.示例程序
//給13號引腳連接的設備設置一個別名“led”
int led = 13;//在板子啟動或者復位重啟后, setup部分的程序只會運行一次
voidsetup(){//將“led”引腳設置為輸出狀態
pinMode(led, OUTPUT);
}//setup部分程序運行完后,loop部分的程序會不斷重復運行
voidloop()
{
digitalWrite(led, HIGH);//點亮LED
delay(1000); //等待一秒鐘
digitalWrite(led, LOW); //通過將引腳電平拉低,關閉LED
delay(1000); //等待一秒鐘
}
3.main():
在進行Arduino開發時,沒有像傳統C/C++程序使用入口函數main。實際上main函數存在于Arduino核心庫中,且仍然是程序的入口。
在Arduino核心庫中可見main.cpp文件,其內容如下:
#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函數,都在main函數中調用了。
loop的循環執行,是通過for循環實現的,且每次loop結束后,都會進行串口事件判斷,也正是因為這種設計,串口事件不能實時響應。
二,數字輸入輸出
1.pinMode ( pin , mode )
2.digitalWrite ( pin , value )
3.digitalRead ( pin )
1.pinMode ( pin , mode ) :
在使用輸入或輸出功能前,你需要先通過pinMode() 函數配置引腳的模式為輸入模式或輸出模式。
參數:
參數pin為指定配置的引腳編號
參數mode為指定的配置模式
通常可用模式有三種:
INPUT 輸入模式
OUTPUT 輸出模式
INPUT_PULLUP 輸入上拉模式
eg.示例程序
/*
Blink
等待一秒鐘,點亮LED,再等待一秒鐘,熄滅LED,如此循環
*/
// 在大多數Arduino控制板上 13號引腳都連接了一個標有“L”的LED燈
// 給13號引腳連接的設備設置一個別名“led”
int led = 13;
// 在板子啟動或者復位重啟后, setup部分的程序只會運行一次
void setup(){
// 將“led”引腳設置為輸出狀態
pinMode(led, OUTPUT);
}
// setup部分程序運行完后,loop部分的程序會不斷重復運行
void loop()
{
digitalWrite(led, HIGH); // 點亮LED
delay(1000); // 等待一秒鐘
digitalWrite(led, LOW); // 通過將引腳電平拉低,關閉LED
delay(1000); // 等待一秒鐘
}
2.digitalWrite ( pin , value ) :
之前我們在Blink程序中使用到了pinMode(13, OUTPUT),即是把13號引腳配置為輸出模式。
配置成輸出模式后,你還需要使用digitalWrite() 讓其輸出高電平或者是低電平。
參數:
參數pin為指定輸出的引腳編號;
參數value為你要指定輸出的電平
使用HIGH指定輸出高電平,或是使用LOW指定輸出低電平。
eg.示例程序
/*
Blink
等待一秒鐘,點亮LED,再等待一秒鐘,熄滅LED,如此循環
*/
// 在大多數Arduino控制板上 13號引腳都連接了一個標有“L”的LED燈
// 給13號引腳連接的設備設置一個別名“led”
int led = 13;
// 在板子啟動或者復位重啟后, setup部分的程序只會運行一次
void setup(){
// 將“led”引腳設置為輸出狀態
pinMode(led, OUTPUT);
}
// setup部分程序運行完后,loop部分的程序會不斷重復運行
void loop()
{
digitalWrite(led, HIGH); // 點亮LED
delay(1000); // 等待一秒鐘
digitalWrite(led, LOW); // 通過將引腳電平拉低,關閉LED
delay(1000); // 等待一秒鐘
}
Arduino中輸出的低電平為0V,輸出的高電平為當前Arduino的工作電壓。
例如Arduino UNO的工作電壓為5V,其高電平輸出也是5V;Arduino Uno工作電壓為3.3V,所以高電平輸出也就是3.3V。
3.digitalRead ( pin ) :
在使用輸入或輸出功能前,你需要先通過pinMode() 函數配置引腳的模式為輸入模式或輸出模式。
參數:
參數pin為指定讀取狀態的引腳編號。
返回值:
返回值為獲取到的信號狀態,1為高電平,0為低電平。
eg.示例程序
1 /*
2 通過2號引腳連接的按鍵,控制13號引腳連接的LED3 */
4
5 //設置各引腳別名
6 const int buttonPin = 2; //連接按鍵的引腳
7 const int ledPin = 13; //連接LED的引腳8
9 //變量定義
10 int buttonState = 0; //存儲按鍵狀態的變量
11
12 voidsetup() {13 //初始化LED引腳為輸出狀態
14 pinMode(ledPin, OUTPUT);15 //初始化按鍵引腳為輸入狀態
16 pinMode(buttonPin, INPUT);17 }18
19 voidloop(){20 //讀取按鍵狀態并存儲在變量中
21 buttonState =digitalRead(buttonPin);22
23 //檢查按鍵是否被按下24 //如果按鍵按下,那buttonState應該為高電平
25 if (buttonState ==HIGH) {26 //點亮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,模數轉換器)功能的引腳。
它可以將外部輸入的模擬信號轉換為芯片運算時可以識別的數字信號,從而實現讀入模擬值的功能。
模擬輸入功能需要使用analogRead() 函數。
參數:
參數pin是指定要讀取模擬值的引腳,被指定的引腳必須是模擬輸入引腳。
如analogRead(A0),即是讀取A0引腳上的模擬值。
返回值:
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號轉換為0~1023的整數形式表示。
eg.示例程序
/*光敏電阻檢測環境光http://www.arduino.cn/
*/
voidsetup()
{//初始化串口
Serial.begin(9600);
}voidloop()
{//讀出當前光線強度,并輸出到串口顯示
int sensorValue =analogRead(A0);
Serial.println(sensorValue);
delay(1000);
}
2.analogWrite ( pin , value ) :
使用analogWrite() 函數實現PWM輸出功能。
在Arduino Uno中,提供PWM功能的引腳為3、5、6、9、10、11。
在analogWrite() 和analogRead() 函數內部,已經完成了引腳的初始化,因此不用在Setup() 函數中進行初始化操作。
參數:
參數pin是指定要輸出PWM波的引腳;
參數value指定是PWM的脈沖寬度,范圍為0~255。
返回值:
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號轉換為0~1023的整數形式表示。
eg.示例程序
/*Fading
通過analogWrite() 函數實現呼吸燈效果*/
int ledPin = 9; //LED連接在9號引腳上
voidsetup() {//Setup部分不進行任何處理
}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.調聲函數
1)tone ( ) :
可以讓指定引腳產生一個占空比為50%的指定頻率的方波。
語法:
tone(pin, frequency) tone(pin, frequency, duration)
返回值:
Arduino Uno模擬輸入功能有10位精度,即可以將0~5V的電壓信號轉換為0~1023的整數形式表示。
2)no Tone ( pin ):
停止指定引腳上的方波輸出。
語法:
noTone(pin)
參數:
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};//音符持續時間 4為四分音符, 8為八分音符
int noteDurations[] ={4, 8, 8, 4,4,4,4,4};voidsetup() {//遍歷整個曲子的音符
for (int thisNote = 0; thisNote < 8; thisNote++) {//noteDurations[]數組中存儲的是音符的類型//我們需要將其換算為音符持續時間,方法如下://音符持續時間=1000ms / 音符類型//例如,四分音符=1000 / 4,8分音符 = 1000/8
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);//為了能辨別出不同的音調,你需要在兩個音調間設置一定的延時//增加30%延時時間是比較合適的
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);//停止發聲
noTone(8);
}
}voidloop() {//程序并不重復,因此這里為空
}
2.pulisein() :
檢測指定引腳上的脈沖信號寬度。
例如當要檢查高電平脈沖時,pulseln()會等待指定引腳輸入的電平變高,當變高后開始記時,知道輸入電平變低,停止計時。
pulseln()函數會返回這個脈沖信號的持續時間,即這個脈沖的寬度。
函數還可以設定超時時間,如果超時設定時間,仍未檢測到脈沖,則會退出pulseln()函數并返回0.
當沒有設定超時時間時,pulseln()會默認1秒鐘的超時時間。
語法:
1)pulseln ( pin , value )
2)pulsein ( pin , value , timeout )
參數:
pin : 需要讀取脈沖的引腳
value :需要讀取的脈沖類型, HIGH OR LOW
timeout :超時時間 ,單位微秒 ,數據類型為無符號長整型。
返回值:
返回脈沖寬度 , 單位微秒 ,數據類型為無符號長整型 。 如果在指定時間內沒有檢測到脈沖,則返回0 .
eg.示例程序
/*SR04超聲波傳感器驅動
串口顯示檢測距離*/
//設定SR04連接的Arduino引腳
const int TrigPin = 2;const int EchoPin = 3;floatdistance;voidsetup()
{//初始化串口通信及連接SR04的引腳
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);//要檢測引腳上輸入的脈沖寬度,需要先設置為輸入狀態
pinMode(EchoPin, INPUT);
Serial.println("Ultrasonic sensor:");
}voidloop()
{//產生一個10us的高脈沖去觸發TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);//檢測脈沖寬度,并計算出距離
distance = pulseIn(EchoPin, HIGH)/ 58.00;
Serial.print(distance);
Serial.print("cm");
Serial.println();
delay(1000);
}
3.外部中斷
影響中斷的處理程序——中斷函數,當中斷觸發后,Arduino便會進行這個函數。
該函數不能帶任何參數,且返回類型為空。如:
voidHello () {
flag=ture ;
}
1)attachlneterrupt ( pin , ISR , mode )
對中斷引腳進行初始化設置,以開啟Arduino的外部中斷功能
示例:
attachinterrupt ( 2 , Hello , LOW ) ;該語句會開啟Arduino Uno 的 2 號引腳(中斷編號0)的外部中斷功能,并指定下降沿時觸發該中斷。
當2號引腳上電平由高變低后,該中斷會被觸發,Arduino即會運行Hello ()函數中的語句。
2) detachlnterrupt ( pin )
如果你不需要使用外部中斷了,你可以用中斷分離函數detachlnterrupt()來關閉中斷功能。
參數:
pin : 需要禁用中斷的引腳。
示例:
detachlnterrupt( 2 )
eg.示例程序
/*Arduino外部中斷的使用
外部中斷觸發警報聲*/
//默認無遮擋,蜂鳴器發聲
volatile boolean RunBuzzer = true;voidsetup()
{
Serial.begin(9600);//初始化外部中斷//當2號引腳輸入的電平由高變低時,觸發中斷函數warning
attachInterrupt(2, warning, CHANGE);
}voidloop()
{if(RunBuzzer)
{
tone(8,1000);
}else{
noTone(8);
}
}//中斷函數
voidwarning ()
{
RunBuzzer=!RunBuzzer;
}
總結
以上是生活随笔為你收集整理的arduinohanshu_Arduino 常用函数参考文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 惠普的电脑怎么开启 惠普电脑如何开机
- 下一篇: mysql自连接查询去重_MySQL命令