วิธีแก้ไข Error: 'DS3231 clock' redeclared as different kind of symbol

error: ‘DS3231 clock’ redeclared as different kind of symbol

Code

#include <DS3231.h>
#include <Wire.h>

DS3231 clock;

byte year;
byte month;
byte date;
byte dow;
byte hour;
byte minute;
byte second;

bool century = false;
bool h12Flag;
bool pmFlag;

/*****************************************************************************************************
 * Setup
 *  - Open Serial and Wire connection
 *  - Explain to the user how to use the program
 *****************************************************************************************************/
void setup() {
  // Start the serial port
  Serial.begin(57600);

  // Start the I2C interface
  Wire.begin();

  // Request the time correction on the Serial
  delay(4000);
  Serial.println("Format YYMMDDwhhmmssx");
  Serial.println("Where YY = Year (ex. 20 for 2020)");
  Serial.println("      MM = Month (ex. 04 for April)");
  Serial.println("      DD = Day of month (ex. 09 for 9th)");
  Serial.println("      w  = Day of week from 1 to 7, 1 = Sunday (ex. 5 for Thursday)");
  Serial.println("      hh = hours in 24h format (ex. 09 for 9AM or 21 for 9PM)");
  Serial.println("      mm = minutes (ex. 02)");
  Serial.println("      ss = seconds (ex. 42)");
  Serial.println("Example for input : 2004095090242x");
  Serial.println("-----------------------------------------------------------------------------");
  Serial.println("Please enter the current time to set on DS3231 ended by 'x':");
}

/*****************************************************************************************************
 * Loop
 *  - Each time we receive the time correction on the Serial
 *  - Set the clock of the DS3231
 *  - Echo the value from the DS3231 during 5 seconds
 *****************************************************************************************************/
void loop() {
  // If something is coming in on the serial line, it's
  // a time correction so set the clock accordingly.
  if (Serial.available()) {
    inputDateFromSerial();

    clock.setClockMode(false);  // set to 24h

    clock.setYear(year);
    clock.setMonth(month);
    clock.setDate(date);
    clock.setDoW(dow);
    clock.setHour(hour);
    clock.setMinute(minute);
    clock.setSecond(second);
    
    // Give time at next five seconds
    for (uint8_t i = 0; i < 5; i++){
        delay(1000);
        Serial.print(clock.getYear(), DEC);
        Serial.print("-");
        Serial.print(clock.getMonth(century), DEC);
        Serial.print("-");
        Serial.print(clock.getDate(), DEC);
        Serial.print(" ");
        Serial.print(clock.getHour(h12Flag, pmFlag), DEC); //24-hr
        Serial.print(":");
        Serial.print(clock.getMinute(), DEC);
        Serial.print(":");
        Serial.println(clock.getSecond(), DEC);
    }

    // Notify that we are ready for the next input
    Serial.println("Please enter the current time to set on DS3231 ended by 'x':");
  }
  delay(1000);
}

/*****************************************************************************************************
 * inputDateFromSerial
 *  - Read and interpret the data from the Serial input
 *  - Store the data in global variables
 *****************************************************************************************************/
void inputDateFromSerial() {
	// Call this if you notice something coming in on 
	// the serial port. The stuff coming in should be in 
	// the order YYMMDDwHHMMSS, with an 'x' at the end.
	boolean isStrComplete = false;
	char inputChar;
	byte temp1, temp2;
	char inputStr[20];

	uint8_t currentPos = 0;
	while (!isStrComplete) {
		if (Serial.available()) {
			inputChar = Serial.read();
			inputStr[currentPos] = inputChar;
			currentPos += 1;

      // Check if string complete (end with "x")
			if (inputChar == 'x') {
				isStrComplete = true;
			}
		}
	}
	Serial.println(inputStr);

  // Find the end of char "x"
  int posX = -1;
  for(uint8_t i = 0; i < 20; i++) {
    if(inputStr[i] == 'x') {
      posX = i;
      break;
    }
  }

  // Consider 0 character in ASCII
  uint8_t zeroAscii = '0';
 
	// Read Year first
	temp1 = (byte)inputStr[posX - 13] - zeroAscii;
	temp2 = (byte)inputStr[posX - 12] - zeroAscii;
	year = temp1 * 10 + temp2;
  
	// now month
	temp1 = (byte)inputStr[posX - 11] - zeroAscii;
	temp2 = (byte)inputStr[posX - 10] - zeroAscii;
	month = temp1 * 10 + temp2;
	
	// now date
	temp1 = (byte)inputStr[posX - 9] - zeroAscii;
	temp2 = (byte)inputStr[posX - 8] - zeroAscii;
	date = temp1 * 10 + temp2;
	
	// now Day of Week
	dow = (byte)inputStr[posX - 7] - zeroAscii;		
	
	// now Hour
	temp1 = (byte)inputStr[posX - 6] - zeroAscii;
	temp2 = (byte)inputStr[posX - 5] - zeroAscii;
	hour = temp1 * 10 + temp2;
	
	// now Minute
	temp1 = (byte)inputStr[posX - 4] - zeroAscii;
	temp2 = (byte)inputStr[posX - 3] - zeroAscii;
	minute = temp1 * 10 + temp2;
	
	// now Second
	temp1 = (byte)inputStr[posX - 2] - zeroAscii;
	temp2 = (byte)inputStr[posX - 1] - zeroAscii;
	second = temp1 * 10 + temp2;
}

image

สาเหตุของปัญหา

เนื่องจาก class ที่ชื่อว่า clock ไปซ้ำกับ Class มาตฐานของภาษาซี Library ชื่อ time.h นั้น เองทำให้เราไม่สามารถใช้ชื่อ Class ซ้ำได้ จึงต้องเปลี่ยนชื่อใหม่เป็นอย่างอื่นกรณีนี้ผมจะเปลี่ยนเป็น clock1

โค้ตที่แก้ไขแล้ว

#include <DS3231.h>
#include <Wire.h>
DS3231 clock1;

byte year;
byte month;
byte date;
byte dow;
byte hour;
byte minute;
byte second;

bool century = false;
bool h12Flag;
bool pmFlag;

void setup() {
  // Start the serial port
  Serial.begin(112500);

  // Start the I2C interface
  Wire.begin();

  // Request the time correction on the Serial
  delay(4000);
  Serial.println("Format YYMMDDwhhmmssx");
  Serial.println("Where YY = Year (ex. 20 for 2020)");
  Serial.println("      MM = Month (ex. 04 for April)");
  Serial.println("      DD = Day of month (ex. 09 for 9th)");
  Serial.println("      w  = Day of week from 1 to 7, 1 = Sunday (ex. 5 for Thursday)");
  Serial.println("      hh = hours in 24h format (ex. 09 for 9AM or 21 for 9PM)");
  Serial.println("      mm = minutes (ex. 02)");
  Serial.println("      ss = seconds (ex. 42)");
  Serial.println("Example for input : 2004095090242x");
  Serial.println("-----------------------------------------------------------------------------");
  Serial.println("Please enter the current time to set on DS3231 ended by 'x':");
}

void loop() {
  // If something is coming in on the serial line, it's
  // a time correction so set the clock accordingly.
  if (Serial.available()) {
    inputDateFromSerial();

    clock1.setClockMode(false);  // set to 24h

    clock1.setYear(year);
    clock1.setMonth(month);
    clock1.setDate(date);
    clock1.setDoW(dow);
    clock1.setHour(hour);
    clock1.setMinute(minute);
    clock1.setSecond(second);
    
    // Give time at next five seconds
    for (uint8_t i = 0; i < 5; i++){
        delay(1000);
        Serial.print(clock1.getYear(), DEC);
        Serial.print("-");
        Serial.print(clock1.getMonth(century), DEC);
        Serial.print("-");
        Serial.print(clock1.getDate(), DEC);
        Serial.print(" ");
        Serial.print(clock1.getHour(h12Flag, pmFlag), DEC); //24-hr
        Serial.print(":");
        Serial.print(clock1.getMinute(), DEC);
        Serial.print(":");
        Serial.println(clock1.getSecond(), DEC);
    }

    // Notify that we are ready for the next input
    Serial.println("Please enter the current time to set on DS3231 ended by 'x':");
  }
  delay(1000);
}

/*****************************************************************************************************
 * inputDateFromSerial
 *  - Read and interpret the data from the Serial input
 *  - Store the data in global variables
 *****************************************************************************************************/
void inputDateFromSerial() {
	// Call this if you notice something coming in on 
	// the serial port. The stuff coming in should be in 
	// the order YYMMDDwHHMMSS, with an 'x' at the end.
	boolean isStrComplete = false;
	char inputChar;
	byte temp1, temp2;
	char inputStr[20];

	uint8_t currentPos = 0;
	while (!isStrComplete) {
		if (Serial.available()) {
			inputChar = Serial.read();
			inputStr[currentPos] = inputChar;
			currentPos += 1;

      // Check if string complete (end with "x")
			if (inputChar == 'x') {
				isStrComplete = true;
			}
		}
	}
	Serial.println(inputStr);

  // Find the end of char "x"
  int posX = -1;
  for(uint8_t i = 0; i < 20; i++) {
    if(inputStr[i] == 'x') {
      posX = i;
      break;
    }
  }

  // Consider 0 character in ASCII
  uint8_t zeroAscii = '0';
 
	// Read Year first
	temp1 = (byte)inputStr[posX - 13] - zeroAscii;
	temp2 = (byte)inputStr[posX - 12] - zeroAscii;
	year = temp1 * 10 + temp2;
  
	// now month
	temp1 = (byte)inputStr[posX - 11] - zeroAscii;
	temp2 = (byte)inputStr[posX - 10] - zeroAscii;
	month = temp1 * 10 + temp2;
	
	// now date
	temp1 = (byte)inputStr[posX - 9] - zeroAscii;
	temp2 = (byte)inputStr[posX - 8] - zeroAscii;
	date = temp1 * 10 + temp2;
	
	// now Day of Week
	dow = (byte)inputStr[posX - 7] - zeroAscii;		
	
	// now Hour
	temp1 = (byte)inputStr[posX - 6] - zeroAscii;
	temp2 = (byte)inputStr[posX - 5] - zeroAscii;
	hour = temp1 * 10 + temp2;
	
	// now Minute
	temp1 = (byte)inputStr[posX - 4] - zeroAscii;
	temp2 = (byte)inputStr[posX - 3] - zeroAscii;
	minute = temp1 * 10 + temp2;
	
	// now Second
	temp1 = (byte)inputStr[posX - 2] - zeroAscii;
	temp2 = (byte)inputStr[posX - 1] - zeroAscii;
	second = temp1 * 10 + temp2;
}