2015年3月4日 星期三

建立自己的Arduino程式庫


自己K書要花很多時間,模仿別人的 code 來學習比較快。這一次是想要建立自己的 Arduino 程式庫,在 Arduino IDE 上就有很多的 library 可以拿來參考;今天從當中挑選了 EEPROM library 來作為參考對象。

EEPROM library 目錄下只有兩個檔案需要打開來看:EEPROM.cpp、EEPROM.h。直接省略掉註解文字

#ifndef EEPROM_h
#define EEPROM_h

#include <inttypes.h>

class EEPROMClass
{
  public:
    uint8_t read(int);
    void write(int, uint8_t);
};

extern EEPROMClass EEPROM;

#endif

#include <avr/eeprom.h>
#include "Arduino.h"
#include "EEPROM.h"

uint8_t EEPROMClass::read(int address)
{
                return eeprom_read_byte((unsigned char *) address);
}

void EEPROMClass::write(int address, uint8_t value)
{
                eeprom_write_byte((unsigned char *) address, value);
}

EEPROMClass EEPROM;

模仿它做了一個做加、減法計算的程式庫,分別存檔 Math.h、Math.cpp,直接在 Arduino 的 libraries 路徑下建立一個名為『Math』子目錄,兩個檔案都放在其中。

#ifndef Math_h
#define Math_h

class MathClass
{
                public:
                                int mAdd(int x, int y);
                                int mSub(int x, int y);
};

#endif

#include "Math.h"

int MathClass::mAdd(int x, int y)
{
                return x+y;
}

int MathClass::mSub(int x, int y)
{
                return x-y;
}

開啟 Arduino IDE 後,果然就會看到自給建立的 Math library 出現在其中


直接寫一個程式來試驗一下,看看是否可以順利 compile


正常完成!回頭看 code 內容怎麼覺得 Math.h 開頭兩行怪怪的,為什麼需要有 #ifndef Math_h 及 #define Math_h?拿掉又會出現錯誤


error: previous definition of 'class MathClass' 這是什麼錯誤?在某個網站 (http://www.86duino.com/?p=3607&lang=TW) 上稱呼這個架構是個“詭異的架構”,真的不瞭解為何要這麼做!網站上也介紹了如何建立程式庫,比我的內容精彩許多。

後記:
利用搜尋引擎尋找關鍵字“class”、“#infdef”、“#define”,都是在說明那個詭異的架構是為了避免重覆的宣告。

沒有留言:

張貼留言