通常,一個(gè)類庫(kù)中包含兩種后綴的文件:.h文件,和.cpp文件。
.h文件稱作頭文件,其用于聲明類庫(kù)及其成員;.cpp文件稱作源文件,其用于定義類庫(kù)及其成員。
編寫頭文件
首先我們需要建立一個(gè)SR04.h的頭文件,在SR04.h這個(gè)文件中我們要聲明一個(gè)SR04超聲波類。
類的聲明方法如下:
[mw_shl_code=cpp,true]
class SR04 {
public:
private:
};[/mw_shl_code]通常一個(gè)類可以包含兩個(gè)部分——public和private。public中聲明的函數(shù)和變量可以被外部程序所訪問,而private中聲明的函數(shù)和變量,只能從這個(gè)類的內(nèi)部訪問。
接著,根據(jù)我們的實(shí)際需求來設(shè)計(jì)這個(gè)類,SR04類的結(jié)構(gòu)如圖4-4所示。
圖4-4 SR04類結(jié)構(gòu)圖
它包含兩個(gè)成員函數(shù)和三個(gè)成員變量。
SR04() 函數(shù)是一個(gè)與類同名的構(gòu)造函數(shù),用于初始化對(duì)象。我們需要在public中聲明這個(gè)函數(shù)。聲明如下:
[mw_shl_code=cpp,true]
SR04(int TrigPin,int EchoPin);[/mw_shl_code]
SR04(int TrigPin,int EchoPin);[/mw_shl_code]
這個(gè)構(gòu)造函數(shù)用來替代之前我們使用的void init_SR04(int TrigPin,int EchoPin) 函數(shù)。需要注意的是構(gòu)造函數(shù)必須與類同名,且不能有返回類型。
我們還需要一個(gè)GetDistance函數(shù)來獲取并處理超聲波傳感器返回的信息
[mw_shl_code=cpp,true]
float GetDistance();[/mw_shl_code]
float GetDistance();[/mw_shl_code]
這個(gè)函數(shù)用來替代我們之前使用的 float GetDistance (int TrigPin,int EchoPin) 函數(shù)
還有一些程序運(yùn)行過程中的函數(shù)或變量,用戶在使用時(shí)并不會(huì)接觸到他們,我們可以將其放在private部分中聲明:
[mw_shl_code=cpp,true]
// 記錄SR04使用的引腳
int Trig_pin;
int Echo_pin;
// 記錄SR04返回的距離
float distance;[/mw_shl_code]
// 記錄SR04使用的引腳
int Trig_pin;
int Echo_pin;
// 記錄SR04返回的距離
float distance;[/mw_shl_code]
完整的SR04.h代碼如下:
[mw_shl_code=cpp,true]#ifndef SR04_H
#define SR04_H
#include "Arduino.h"
class SR04 {
public:
SR04(int TrigPin,int EchoPin);
float GetDistance();
private:
int Trig_pin;
int Echo_pin;
float distance;
};
#endif[/mw_shl_code]
預(yù)處理命令
以“#”開頭的語句,為預(yù)處理命令。之前我們包含文件使用的#include,及常量定義時(shí)使用的#define均為預(yù)處理命令。
預(yù)處理命令并不是C/C++語言的組成部分,編譯器不會(huì)直接對(duì)其進(jìn)行編譯,而是在編譯前,系統(tǒng)會(huì)預(yù)先處理這些命令。
宏定義
如你的程序中用#define COL 1112 定義了一個(gè)名為COL的常量,實(shí)際在編譯前,系統(tǒng)會(huì)將你代碼中所有的COL替換為1112,再對(duì)替換后的代碼進(jìn)行編譯。
這種定義方式稱之為宏定義。即使用一個(gè)特定的標(biāo)識(shí)符來代表一個(gè)字符串。其一般形式為:
[mw_shl_code=cpp,true]
#define 標(biāo)識(shí)符字符串[/mw_shl_code]
在Arduino中,我們常用到HIGH、LOW、INPUT、OUTPUT等參數(shù)、及圓周率PI等常量都是通過宏的方式定義的。
文件包含
若程序中使用#include包含了一個(gè)文件,例如#include <EEPROM.h>,在預(yù)處理時(shí)系統(tǒng)會(huì)將該命令替換成EEPROM.h文件中的實(shí)際內(nèi)容,再對(duì)替換后的代碼進(jìn)行編譯。
文件包含命令的一般形式為:
[mw_shl_code=cpp,true]
#include<文件名>[/mw_shl_code]
#include<文件名>[/mw_shl_code]
或
[mw_shl_code=cpp,true]#include“文件名”[/mw_shl_code]
兩種形式的實(shí)際效果是一樣的,只是使用<文件名>形式時(shí),系統(tǒng)會(huì)優(yōu)先在Arduino庫(kù)文件中尋找目標(biāo)文件,若沒有找到,系統(tǒng)會(huì)再到當(dāng)前Arduino項(xiàng)目的項(xiàng)目文件夾中查找;而使用“文件名”形式時(shí),系統(tǒng)會(huì)優(yōu)先在你的Arduino項(xiàng)目文件中查找目標(biāo)文件,若沒有找到,再查找Arduino庫(kù)文件。
條件編譯
回到SR04.h,在其中,你會(huì)看到以下代碼:
#ifndef SR04_H
#define SR04_H
.
.
.
#endif[/mw_shl_code]
其中
[mw_shl_code=cpp,true]
#ifndef標(biāo)識(shí)符
程序段
#endif[/mw_shl_code]
#ifndef標(biāo)識(shí)符
程序段
#endif[/mw_shl_code]
為條件編譯命令。#ifndef SR04_H會(huì)查找標(biāo)識(shí)符SR04_H是否在程序的其他位置被#define定義過。若沒有被定義過,則定義該標(biāo)識(shí)符。這個(gè)寫法主要為了防止重復(fù)的包含某文件,避免程序編譯出錯(cuò)。
編寫源文件
接著,我們還要建立一個(gè)SR04.cpp源文件。在SR04.cpp文件中,我們需要寫出了頭文件中聲明的成員函數(shù)的具體實(shí)現(xiàn)代碼。
完整代碼如下:
[mw_shl_code=cpp,true]
#include "Arduino.h"
#include "SR04.h"
SR04::SR04(int TP, int EP)
{
pinMode(TP,OUTPUT);
pinMode(EP,INPUT);
Trig_pin=TP;
Echo_pin=EP;
}
float SR04::GetDistance()
{
digitalWrite(Trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(Trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trig_pin, LOW);
float distance = pulseIn(Echo_pin, HIGH) / 58.00;
return distance;
}[/mw_shl_code]
#include "Arduino.h"
#include "SR04.h"
SR04::SR04(int TP, int EP)
{
pinMode(TP,OUTPUT);
pinMode(EP,INPUT);
Trig_pin=TP;
Echo_pin=EP;
}
float SR04::GetDistance()
{
digitalWrite(Trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(Trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trig_pin, LOW);
float distance = pulseIn(Echo_pin, HIGH) / 58.00;
return distance;
}[/mw_shl_code]
域操作符
我們?cè)赟R04.h文件中聲明了SR04類及其成員,在SR04.cpp中定義該函數(shù)的實(shí)現(xiàn)方法。在類聲明以外定義成員函數(shù)時(shí),需要使用域操作符::,說明該函數(shù)作用于SR04類。
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。