2012-10-25 146 views
2

在我的Arduino IDE中,我建立了一個程序,它通過一個移位寄存器運行八個LED,現在正在嘗試創建一個類來控制移位寄存器。到目前爲止,我已經創建了文件,並創建了一個構造函數的類的一些功能,但是當我嘗試驗證碼的IDE說,我在這裏重新定義類shiftreg是錯誤消息:Arduino類重定義錯誤

In file included from Lab9_step3.cpp:97: 
shiftreg.h:2: error: redefinition of 'class shiftreg' 
shiftreg.h:3: error: previous definition of 'class shiftreg' 

我對lab_9代碼:

/*  --------------------------------------------------------- 
*  | Arduino Experimentation Kit Example Code    | 
*  | CIRC-05 .: 8 More LEDs :. (74HC595 Shift Register) | 
*  --------------------------------------------------------- 
* 
* We have already controlled 8 LEDs however this does it in a slightly 
* different manner. Rather than using 8 pins we will use just three 
* and an additional chip. 
* 
* 
*/ 
#include "shiftreg.h" 

//Pin Definitions 
//Pin Definitions 
//The 74HC595 uses a serial communication 
//link which has three pins 
shiftreg a(2, 3, 4); 

int sensorPin = 0; // select the input pin for the potentiometer 
int sensorValue = 0; // variable to store the value coming from the sensor 




/* 
* setup() - this function runs once when you turn your Arduino on 
* We set the three control pins to outputs 
*/ 
void setup() 
{ 
    a.pinmode(); 
} 

/* 
* loop() - this function will start after setup finishes and then repeat 
* we set which LEDs we want on then call a routine which sends the states to the 74HC595 
*/ 
void loop()      // run over and over again 
{ 
    for(int i = 0; i < 256; i++){ 
    a.update(i); 

    // read the value from the sensor: 
    sensorValue = analogRead(sensorPin); 

    delay(sensorValue); 
    } 
} 



    /****************************** 

    /* 
    * updateLEDsLong() - sends the LED states set in ledStates to the 74HC595 
    * sequence. Same as updateLEDs except the shifting out is done in software 
    * so you can see what is happening. 
    */ 
// void updateLEDsLong(int value){ 
//  digitalWrite(latch, LOW); //Pulls the chips latch low 
//  for(int i = 0; i < 8; i++){ //Will repeat 8 times (once for each bit) 
//  int bit = value & B10000000; //We use a "bitmask" to select only the eighth 
//         //bit in our number (the one we are addressing this time thro 
//      //ugh 
//  value = value << 1;   //we move our number up one bit value so next time bit 7 will 
//      // be 
//         //bit 8 and we will do our math on it 
//  if(bit == 128){digitalWrite(data, HIGH);} //if bit 8 is set then set our data pin high 
//  else{digitalWrite(data, LOW);}   //if bit 8 is unset then set the data pin low 
//  digitalWrite(clock, HIGH);    //the next three lines pulse the clock pin 
//  delay(1); 
//  digitalWrite(clock, LOW); 
//  } 
//  digitalWrite(latch, HIGH); //pulls the latch high shifting our data into being displayed 
// } 
//  
//  
// //These are used in the bitwise math that we use to change individual LEDs 
// //For more details http://en.wikipedia.org/wiki/Bitwise_operation 
// int bits[] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000}; 
// int masks[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111}; 
// /* 
//  * changeLED(int led, int state) - changes an individual LED 
//  * LEDs are 0 to 7 and state is either 0 - OFF or 1 - ON 
//  */ 
//  void changeLED(int led, int state){ 
//  ledState = ledState & masks[led]; //clears ledState of the bit we are addressing 
//  if(state == ON){ledState = ledState | bits[led];} //if the bit is on we will add it to le 
//      //dState 
//  updateLEDs(ledState);    //send the new LED state to the shift register 
//  } 
//  **********************************/ 

和我的shiftreg.h代碼:

/*Shift Register 
*/    (Error occurs here) 
class shiftreg (and here) 
{ 
    private: 
    //Pin Definitions 
    //Pin Definitions 
    //The 74HC595 uses a serial communication 
    //link which has three pins 
    int data; 
    int clock; 
    int latch; 

    public: 
    shiftreg (int _data, int _clock, int _latch); 
    void update(int value); 
    void pinmode(); 
}; 

和我的shiftreg.cpp代碼:

#include "shiftreg.h" 

/*shiftreg constructor: 
*/ 
shiftreg::shiftreg (int _data, int _clock, int _latch) 
{ 
    data = _data; 
    clock = _clock; 
    latch = _latch; 

    //Used for single LED manipulation 
    int ledState = 0; 
    const int ON = HIGH; 
    const int OFF = LOW; 
} 

/* 
* updateLEDs() - sends the LED states set in ledStates to the 74HC595 
* sequence 
*/ 
void shiftreg::update(int value) 
{ 
    digitalWrite(latch, LOW);  //Pulls the chips latch low 
    shiftOut(data, clock, MSBFIRST, value); //Shifts out the 8 bits to the shift register 
    digitalWrite(latch, HIGH); //Pulls the latch high displaying the data 
} 

/* 
*/ 
void shiftreg::pinmode() 
{ 
    pinMode(data, OUTPUT); 
    pinMode(clock, OUTPUT); 
    pinMode(latch, OUTPUT); 
} 

感謝您的幫助!

回答

4

根據錯誤消息,您在Lab9_step3.cpp的第97行包含shiftreg.h。那上面的96條線是什麼?錯誤可能在某處。

如果我不得不猜測,我會說,你直接或間接地包括shiftreg.h兩次(或更多)Lab9_step3.cpp,並且錯誤的發生是因爲在頭文件中沒有包含警衛。

嘗試添加以下內容shiftreg.h

#ifndef SHIFTREG_H 
#define SHIFTREG_H 

class shiftreg 
{ 
    // ... 
}; 

#endif 
+0

謝謝!我不知道它是如何認爲我在97行添加了shiftreg.h,我的代碼並沒有那麼遠!包含該文件的所有代碼。但是當我做了你所說的話,並加入了包括守衛它就像一個魅力!是包括arduino特定的東西嗎?或者他們只是一般用於C++?我之前在Emacs for C++中完成過類,但這是我第一次使用Arduino。 – cmpickle

+1

@cmpickle它們絕不是Arduino特有的,實際上,C/C++頭文件不包含它們是非常罕見的。當你不需要它們時,我能想到的唯一例子是當你通過多次重複包含同一個文件來做一些預處理器的詭計。 – Praetorian