數(shù)字I/O
pinMode()
void pinMode (uint8_t pin, uint8_t mode)
設(shè)置引腳模式
配置引腳為輸出或輸出模式.
參數(shù):
pin 引腳編號(hào)
mode: INPUT, OUTPUT, 或 INPUT_PULLUP.
例子:
int ledPin = 13; // LED connected to digital pin
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
注解:
模擬引腳也可以當(dāng)作數(shù)字引腳使用, 編號(hào)為14(對(duì)應(yīng)模擬引腳0)到19(對(duì)應(yīng)模擬引腳5).
digitalWrite()
void digitalWrite (uint8_t pin, uint8_t value)
寫(xiě)數(shù)字引腳
寫(xiě)數(shù)字引腳, 對(duì)應(yīng)引腳的高低電平. 在寫(xiě)引腳之前, 需要將引腳設(shè)置為OUTPUT模式.
參數(shù):
pin 引腳編號(hào)
value HIGH 或 LOW
用法:
int ledPin = 13; // LED connected to digital pin
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // 點(diǎn)亮LED
delay(1000); // 等待1秒
digitalWrite(ledPin, LOW); // 關(guān)
delay(1000); // waits for a second
}
注解:
模擬引腳也可以當(dāng)作數(shù)字引腳使用, 編號(hào)為14(對(duì)應(yīng)模擬引腳0)到19(對(duì)應(yīng)模擬引腳5).
digitalRead()
int digitalRead (uint8_t pin)
讀數(shù)字引腳
讀數(shù)字引腳, 返回引腳的高低電平. 在讀引腳之前, 需要將引腳設(shè)置為INPUT模式.
參數(shù):
pin 引腳編號(hào)
返回:
HIGH或LOW
int ledPin = 13; // LED connected to digital pin
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the buton's value
}
注解:
如果引腳沒(méi)有鏈接到任何地方, 那么將隨機(jī)返回 HIGH 或 LOW.
模擬I/O
analogReference()
void analogReference (uint8_t type)
配置參考電壓
配置模式引腳的參考電壓. 函數(shù) analogRead 在讀取模擬值之后, 將根據(jù)參考電壓將擬值轉(zhuǎn)換到[0,10]區(qū)間.
有以下類(lèi)型:
DEFAULT : 默認(rèn)5V.
INTERNAL: 低功耗模式.
ATmega168和ATmega8對(duì)應(yīng)1.1V到2.56V.
EXTERNAL: 擴(kuò)展模式.
通過(guò)AREF引腳獲取參考電壓.
參數(shù):
type 參考類(lèi)型(DEFAULT/INTERNAL/EXTERNAL)
analogRead()
int analogRead (uint8_t pin)
讀模擬引腳
讀模擬引腳, 返回[0-10]之間的值. 每讀一次需要花1微妙的時(shí)間.
參數(shù):
pin 引腳編號(hào)
返回:
0到10之間的值
例子:
int analogPin = 3; // potentiometer wiper (middle terminal) connected to analog pin 3
// outside leads to ground and +5V
int val = 0; // variable to store the value read
void setup()
{
Serial.begin(9600); // setup serial
}
void loop()
{
val = analogRead(analogPin); // read the input pin
Serial.println(val); // debug value
}
analogWrite()
void analogWrite (uint8_t pin, int value)
寫(xiě)模擬引腳
參數(shù):
pin 引腳編號(hào)
value 0到255之間的值, 0對(duì)應(yīng)off, 255對(duì)應(yīng)on
寫(xiě)一個(gè)模擬值(PWM)到引腳. 可以用來(lái)控制LED的亮度, 或者控制電機(jī)的轉(zhuǎn)速. 在執(zhí)行該操作后, 應(yīng)該等待一定時(shí)間后才能對(duì)該引腳進(jìn)行下一次的讀或?qū)懖僮? PWM的頻率大約為490Hz.
在一些基于ATmega168的新的Arduino控制板(如Mini 和BT)中, 該函數(shù)支持以下引腳: 3, 5, 6, 9, 10格嘁。 在基于ATmega8的型號(hào)中支持9, 10引腳.
例子:
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop()
{
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val / 4); // analogRead values go from 0 to 10, analogWrite values from 0 to 255
}
高級(jí)I/O
shiftOut()
void shiftOut (uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val)
位移輸出函數(shù)
輸入value數(shù)據(jù)后Arduino會(huì)自動(dòng)把數(shù)據(jù)移動(dòng)分配到8個(gè)并行輸出端. 其中dataPin為連接DS的引腳號(hào), clockPin為連接SH_CP的引腳號(hào), bitOrder為設(shè)置數(shù)據(jù)位移順序, 分別為高位先入MSBFIRST或者低位先入LSBFIRST.
參數(shù):
dataPin 數(shù)據(jù)引腳
clockPin 時(shí)鐘引腳
bitOrder 移位順序 ( MSBFIRST 或 LSBFIRST)
val 數(shù)據(jù)
// Do this for MSBFIRST serial
int data = 500;
// shift out highbyte
shiftOut(dataPin, clock, MSBFIRST, (data >> 8));
// shift out lowbyte
shiftOut(dataPin, clock, MSBFIRST, data);
// Or do this for LSBFIRST serial
data = 500;
// shift out lowbyte
shiftOut(dataPin, clock, LSBFIRST, data);
// shift out highbyte
shiftOut(dataPin, clock, LSBFIRST, (data >> 8));
pulseIn()
unsigned long pulseIn (uint8_t pin, uint8_t state, unsigned long timeout)
讀脈沖
讀引腳的脈沖, 脈沖可以是 HIGH 或 LOW. 如果是 HIGH, 函數(shù)將先等引腳變?yōu)楦唠娖? 然后 開(kāi)始計(jì)時(shí), 一直到變?yōu)榈碗娖綖橹? 返回脈沖持續(xù)的時(shí)間長(zhǎng)短, 單位為毫秒. 如果超時(shí)還沒(méi)有 讀到的話, 將返回0.
參數(shù):
1 pin 引腳編號(hào)
2 state 脈沖狀態(tài)
3 timeout 超時(shí)時(shí)間
下面的例子演示了統(tǒng)計(jì)高電平的繼續(xù)時(shí)間:
int pin = 7;
unsigned long duration;
void setup()
{
pinMode(pin, INPUT);
}
void loop()
{
duration = pulseIn(pin, HIGH);
}
時(shí)間
millis()
unsigned long millis (void)
毫秒時(shí)間
獲取機(jī)器運(yùn)行的時(shí)間長(zhǎng)度, 單位毫秒. 系統(tǒng)最長(zhǎng)的記錄時(shí)間為9小時(shí)分, 如果超出時(shí)間將從0開(kāi)始. 警告:時(shí)間為 unsigned long類(lèi)型, 如果用 int 保存時(shí)間將得到錯(cuò)誤結(jié)果。
delay(ms)
void delay (unsigned long ms)
延時(shí)(毫秒)
延時(shí), 單位毫秒(1秒有1000毫秒).
警告: 參數(shù)為unsigned long, 因此在延時(shí)參數(shù)超過(guò)767(int型最大值)時(shí), 需要用"UL"后綴表示為無(wú)符號(hào) 長(zhǎng)整型, 例如: delay(60000UL);. 同樣在參數(shù)表達(dá)式, 切表達(dá)式中有int類(lèi)型時(shí), 需要強(qiáng)制轉(zhuǎn)換為 unsigned long類(lèi)型, 例如: delay((unsigned long)tdelay * 100UL);.
例子設(shè)置
引腳對(duì)應(yīng)的LED等以1秒頻率閃爍:
int ledPin = 13; // LED connected to digital pin
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
delayMicroseconds(us)
void delayMicroseconds (unsigned int us)
延時(shí)(微秒)
延時(shí), 單位為微妙(1毫秒有1000微妙). 如果延時(shí)的時(shí)間有幾千微妙, 那么建議使用 delay 函數(shù). 目前參數(shù)最大支持16383微妙(不過(guò)以后的版本中可能會(huì)變化).
以下代碼向第8號(hào)引腳發(fā)送脈沖, 每次脈沖持續(xù)50微妙的時(shí)間.
int outPin = 8; // digital pin 8
void setup()
{
pinMode(outPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(outPin, HIGH); // sets the pin on
delayMicroseconds(50); // pauses for 50 microseconds
digitalWrite(outPin, LOW); // sets the pin off
delayMicroseconds(50); // pauses for 50 microseconds
}
數(shù)學(xué)庫(kù)
min()
#define min(a, b) ((a)<(b)?(a):(b))
最小值
取兩者之間最小值. 例如:
sensVal = min(sensVal, 100); // assigns sensVal to the smaller of sensVal or 100
// ensuring that it never gets above 100.
max()
#define max(a, b) ((a)>(b)?(a):(b))
最大值
取兩者之間最大值. 例如:
sensVal = max(senVal, 20); // assigns sensVal to the larger of sensVal or 20
// (effectively ensuring that it is at least 20)
abs()
abs(x) ((x)>0?(x):-(x))
求絕對(duì)值
constrain()
#define constrain(amt, low, high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
調(diào)整到區(qū)間
如果值 amt 小于 low, 則返回 low; 如果 amt 大于 high, 則返回 high; 否則, 返回 amt . 一般可以用于將值歸一化到某個(gè)區(qū)間.
例如:
sensVal = constrain(sensVal, 10, 150);
// limits range of sensor values to between 10 and 150
map()
long map ( long x, long in_min, long in_max, long out_min, long out_max)
等比映射
將位于[in_min, in_max]之間的x映射到[out_min, out_max].
參數(shù):
x 要映射的值
in_min 映射前區(qū)間
in_max 映射前區(qū)間
out_min 映射后區(qū)間
out_max 映射后區(qū)間
例如下面的代碼中用 map 將模擬量從[0,10]映射到[0,255]區(qū)間:
// Map an analog value to 8 bits (0 to 255)
void setup() {}
void loop()
{
int val = analogRead(0);
val = map(val, 0, 10, 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()
double pow (float base, float exponent)
指數(shù)函數(shù)
sqrt()
double sqrt (double x)
//開(kāi)平方
三角函數(shù)
sin(),cos(),tan()
float sin (float rad);//正弦函數(shù)
float cos (float rad);//余弦函數(shù)
float tan (float rad);//正切函數(shù)
隨機(jī)數(shù)
randomSeed()
void randomSeed ( unsigned int seed )
設(shè)置隨機(jī)種子
可以用當(dāng)前時(shí)間作為隨機(jī)種子. 隨機(jī)種子的設(shè)置對(duì)產(chǎn)生的隨機(jī)序列有影響.
參數(shù):
seed 隨機(jī)種子
random()
long random (long howbig)
生成隨機(jī)數(shù)
生成[0, howbig-1]范圍的隨機(jī)數(shù).
參數(shù):
howbig 最大值
long random (long howsmall, long howbig)
生成隨機(jī)數(shù)
生成[howsmall, howbig-1]范圍的隨機(jī)數(shù).
參數(shù):
howsmall 最小值
howbig 最大值
位操作
位操作
#define lowByte(w) ((w) & 0xff) //取低字節(jié)
#define highByte(w) ((w) >> 8) //取高字節(jié)
#define bitRead(value, bit) (((value) >> (bit)) & 0x01) //讀一個(gè)bit
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) //寫(xiě)一個(gè)bit
#define bitSet(value, bit) ((value) |= (1UL << (bit))) //設(shè)置一個(gè)bit
#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) //清空一個(gè)bit
#define bit(b) (1 << (b)) //生成相應(yīng)bit
設(shè)置中斷函數(shù)
achInterrupt()
void achInterrupt (uint8_t interruptNum, void(*)(void)userFunc, int mode)
設(shè)置中斷
指定中斷函數(shù). 外部中斷有0和1兩種, 一般對(duì)應(yīng)2號(hào)和3號(hào)數(shù)字引腳.
參數(shù):
interrupt 中斷類(lèi)型, 0或1
fun 對(duì)應(yīng)函數(shù) mode 觸發(fā)方式. 有以下幾種:
- LOW 低電平觸發(fā)中斷
- CHANGE 變化時(shí)觸發(fā)中斷
- RISING 低電平變?yōu)楦唠娖接|發(fā)中斷
- FALLING 高電平變?yōu)榈碗娖接|發(fā)中斷
注解: 在中斷函數(shù)中 delay 函數(shù)不能使用, millis 始終返回進(jìn)入中斷前的值. 讀串口數(shù)據(jù)的話, 可能會(huì)丟失. 中斷函數(shù)中使用的變量需要定義為 volatile 類(lèi)型. 下面的例子如果通過(guò)外部引腳觸發(fā)中斷函數(shù), 然后控制LED的閃爍.
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
achInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state = !state;
}
detachInterrupt()
void detachInterrupt (uint8_t interruptNum)
取消中斷
取消指定類(lèi)型的中斷.
參數(shù):
interrupt 中斷的類(lèi)型.
interrupts()
#define interrupts() sei()
開(kāi)中斷
例子:
void setup() {}
void loop()
{
noInterrupts();
// critical, time-sensitive code here
interrupts();
// other code here
}
noInterrupts()
#define noInterrupts() cli()
關(guān)中斷
例子:
void setup() {}
void loop()
{
noInterrupts();
// critical, time-sensitive code here
interrupts();
// other code here
}
串口通訊
void begin (long) 打開(kāi)串口
uint8_t available (void) 有串口數(shù)據(jù)返回真
int read (void) //讀串口
void flush (void) //刷新串口數(shù)據(jù)
virtual void write (uint8_t) //寫(xiě)串口 </pre>
begin()
void HardwareSerial::begin (long speed)
打開(kāi)串口
參數(shù):
speed 波特率
available()
獲取串口上可讀取的數(shù)據(jù)的字節(jié)數(shù)。該數(shù)據(jù)是指已經(jīng)到達(dá)并存儲(chǔ)在接收緩存(共有64字節(jié))中绞蹦。available()繼承自Stream實(shí)用類(lèi)懊纳。
語(yǔ)法:
Serial.available()
Arduino Mega only: Serial1.available() Serial2.available() Serial3.available()
參數(shù): 無(wú)
返回值:
返回可讀取的字節(jié)數(shù)
示例:
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
Arduino Mega example:
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
// read from port 0, send to port 1:
if (Serial.available()) {
int inByte = Serial.read();
Serial1.print(inByte, BYTE);
}
// read from port 1, send to port 0:
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.print(inByte, BYTE);
}
}
read()
讀串口數(shù)據(jù)嘀倒,read()繼承自Stream實(shí)用類(lèi)页藻。
語(yǔ)法:
Serial.read()
Arduino Mega only: Serial1.read() Serial2.read() Serial3.read()
參數(shù): 無(wú)
返回值: 串口上第一個(gè)可讀取的字節(jié)(如果沒(méi)有可讀取的數(shù)據(jù)則返回-1)- int型软免。
示例:
int incomingByte = 0; // 用于存儲(chǔ)從串口讀到的數(shù)據(jù)
void setup() {
Serial.begin(9600); // 打開(kāi)串呂周循,設(shè)置速率為9600 bps
}
void loop() {
// 只在收到數(shù)據(jù)時(shí)發(fā)送數(shù)據(jù)
if (Serial.available() > 0) {
// 讀取傳入的字節(jié)
incomingByte = Serial.read();
// 指示你收到的數(shù)據(jù)
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
flush()
刷新串口數(shù)據(jù)
print()
往串口發(fā)數(shù)據(jù)强法,無(wú)換行描述 以人類(lèi)可讀的ASCII碼形式向串口發(fā)送數(shù)據(jù)万俗,該函數(shù)有多種格式。整數(shù)的每一數(shù)位將以ASCII碼形式發(fā)送饮怯。浮點(diǎn)數(shù)同樣以ASCII碼形式發(fā)送闰歪,默認(rèn)保留小數(shù)點(diǎn)后兩位。字節(jié)型數(shù)據(jù)將以單個(gè)字符形式發(fā)送硕淑。字符和字符串會(huì)以其相應(yīng)的形式發(fā)送课竣。
例如:
Serial.print(78) 發(fā)送 "78"
Serial.print(1.456) 發(fā)送 "1.456"
Serial.print('N') 發(fā)送 "N"
Serial.print("Hello world.") 發(fā)送 "Hello world."
可選的第二個(gè)參數(shù)用于指定數(shù)據(jù)的格式。允許的值為:BIN (binary二進(jìn)制), OCT (octal八進(jìn)制), DEC (decimal十進(jìn)制), HEX (hexadecimal十六進(jìn)制)置媳。對(duì)于浮點(diǎn)數(shù)于樟,該參數(shù)指定小數(shù)點(diǎn)的位數(shù)。
例如:
Serial.print(78, BIN) gives "1000"
Serial.print(78, OCT) gives "6"
Serial.print(78, DEC) gives "78"
Serial.print(78, HEX) gives "4E"
Serial.println(1.456, 0) gives "1"
Serial.println(1.456, 2) gives "1.46"
Serial.println(1.456, 4) gives "1.4560"
你可以用F()把待發(fā)送的字符串包裝到flash存儲(chǔ)器拇囊。例如:
Serial.print(F(“Hello World”))
要發(fā)送單個(gè)字節(jié)數(shù)據(jù)迂曲,請(qǐng)使用Serial.write()。
語(yǔ)法:
Serial.print(val)
Serial.print(val, format)
參數(shù):
val: 要發(fā)送的數(shù)據(jù)(任何數(shù)據(jù)類(lèi)型)
format: 指定數(shù)字的基數(shù)(用于整型數(shù))或者小數(shù)的位數(shù)(用于浮點(diǎn)數(shù))寥袭。
返回值:
size_t (long): print()返回發(fā)送的字節(jié)數(shù)(可丟棄該返回值)路捧。
示例:
/*
Uses a FOR loop for data and prints a number in various formats.
*/
int x = 0; // variable
void setup() {
Serial.begin(9600); // open the serial port at 9600 bps:
}
void loop() {
// print labels
Serial.print("NO FORMAT"); // prints a label
Serial.print("\t"); // prints a tab
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++){ // only part of the ASCII chart, change to suit
// print it out in many formats:
Serial.print(x); // print as an ASCII-encoded decimal - same as "DEC"
Serial.print("\t"); // prints a tab
Serial.print(x, DEC); // print as an ASCII-encoded decimal
Serial.print("\t"); // prints a tab
Serial.print(x, HEX); // print as an ASCII-encoded hexadecimal
Serial.print("\t"); // prints a tab
Serial.print(x, OCT); // print as an ASCII-encoded octal
Serial.print("\t"); // prints a tab
Serial.println(x, BIN); // print as an ASCII-encoded binary
// then adds the carriage return with "println"
delay(200); // delay 200 milliseconds
}
Serial.println(""); // prints another carriage return
}
編程技巧: 在版本1.0時(shí),串口傳輸是異步的传黄,Serial.print()會(huì)在數(shù)據(jù)發(fā)送完成前返回杰扫。
println()
往串口發(fā)數(shù)據(jù),類(lèi)似Serial.print()膘掰,但有換行
write()
寫(xiě)二進(jìn)制數(shù)據(jù)到串口章姓,數(shù)據(jù)是一個(gè)字節(jié)一個(gè)字節(jié)地發(fā)送的,若以字符形式發(fā)送數(shù)字請(qǐng)使用print()代替识埋。
語(yǔ)法:
Serial.write(val)
Serial.write(str)
Serial.write(buf, len)
Arduino Mega也支持:Serial1, Serial2, Serial3(在Serial的位置)
參數(shù):
val: 作為單個(gè)字節(jié)發(fā)送的數(shù)據(jù)
str: 由一系列字節(jié)組成的字符串
buf: 同一系列字節(jié)組成的數(shù)組
len: 要發(fā)送的數(shù)組的長(zhǎng)度
返回:
byte
write()會(huì)返回發(fā)送的字節(jié)數(shù)凡伊,所以讀取該返回值是可選的。
示例:
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.write(45); //以二進(jìn)制形式發(fā)送數(shù)字45
int bytesSent = Serial.write(“hello”); //發(fā)送字符串“hello” 并返回該字符串的長(zhǎng)度窒舟。
}
peak()
描述: 返回收到的串口數(shù)據(jù)的下一個(gè)字節(jié)(字符)系忙,但是并不把該數(shù)據(jù)從串口數(shù)據(jù)緩存中清除。就是說(shuō)惠豺,每次成功調(diào)用peak()將返回相同的字符银还。與read()一樣,peak()繼承自Stream實(shí)用類(lèi)洁墙。
語(yǔ)法: 可參照Serail.read()
serialEvent()
描述: 當(dāng)串口有數(shù)據(jù)到達(dá)時(shí)調(diào)用該函數(shù)(然后使用Serial.read()捕獲該數(shù)據(jù))见剩。
注意:目前serialEvent()并不兼容于Esplora, Leonardo, 或 Micro。
語(yǔ)法:
void serialEvent(){
//statements
}
//Arduino Mega only:
void serialEven(){
//statements
}
void serialEven(){
//statements
}
void serialEven(){
//statements
}
statements可以是任何有效的語(yǔ)句扫俺。