Ошибка повторного объявления библиотеки Arduino

Я здесь впервые и надеюсь, что кто-нибудь сможет вам помочь! Я постараюсь изложить это максимально кратко.

Итак, у меня есть два датчика/модуля: один — ЖК-экран от elerow, а другой — DS1307. Оба подключены через аналог 4 и 5. Я пробовал подключить их с помощью макета, но наткнулся на следующую проблему с библиотеками (даже не знаю, возможно ли то, чего я пытаюсь достичь, но Тем не менее я пытаюсь (и терплю ужасные неудачи))

In file included from C:\Users\c\Documents\Arduino\Sketches\IC2_Checker\BME280_LCD_Time\BME280_LCD_Time.ino:22:0:

    C:\Users\c\Documents\Arduino\libraries\RTClib/RTClib.h:79:31: error: redeclaration of 'OFF'

     enum Ds1307SqwPinMode { OFF = 0x00, ON = 0x80, SquareWave1HZ = 0x10, SquareWave4kHz = 0x11, SquareWave8kHz = 0x12, SquareWave32kHz = 0x13 };

                                   ^ 
In file included from C:\Users\c\Documents\Arduino\Sketches\IC2_Checker\BME280_LCD_Time\BME280_LCD_Time.ino:21:0:

    C:\Users\c\Documents\Arduino\libraries\I2C_LCD/I2C_LCD.h:457:5: note: previous declaration 'LCD_SwitchState OFF'    
         OFF=0x00,

         ^    
    In file included from C:\Users\c\Documents\Arduino\Sketches\IC2_Checker\BME280_LCD_Time\BME280_LCD_Time.ino:22:0:

    C:\Users\c\Documents\Arduino\libraries\RTClib/RTClib.h:79:42: error: redeclaration of 'ON'

     enum Ds1307SqwPinMode { OFF = 0x00, ON = 0x80, SquareWave1HZ = 0x10, SquareWave4kHz = 0x11, SquareWave8kHz = 0x12, SquareWave32kHz = 0x13 };

                                              ^
In file included from C:\Users\c\Documents\Arduino\Sketches\IC2_Checker\BME280_LCD_Time\BME280_LCD_Time.ino:21:0:

    C:\Users\c\Documents\Arduino\libraries\I2C_LCD/I2C_LCD.h:458:5: note: previous declaration 'LCD_SwitchState ON'

         ON=0x01

         ^

    exit status 1
    Error compiling for board Arduino/Genuino Uno.

Я понимаю, что библиотеки конфликтуют друг с другом по следующим вопросам:

  • ВЫКЛ = 0x00
  • ВКЛ = 0x80
  • ВКЛ= 0x01

Можно ли как-нибудь это исправить? Я знаю, что надо редактировать библиотеки .h, но не знаю, что и на что менять, вот код библиотеки на самом модуле:

//RTC на базе чипа DS1307, подключенного по I2C и библиотеке Wire
enum Ds1307SqwPinMode { OFF = 0x00, ON = 0x80, SquareWave1HZ = 0x10, SquareWave4kHz = 0x11, SquareWave8kHz = 0x12, SquareWave32kHz = 0x13 };

class RTC_DS1307 {
public:
   boolean begin(void);
   static void adjust(const DateTime& dt);
   uint8_t isrunning(void);
   static DateTime now();
   static Ds1307SqwPinMode readSqwPinMode();
   static void writeSqwPinMode(Ds1307SqwPinMode mode);
   uint8_t readnvram(uint8_t address);
   void readnvram(uint8_t* buf, uint8_t size, uint8_t address);
   void writenvram(uint8_t address, uint8_t data);
   void writenvram(uint8_t address, uint8_t* buf, uint8_t size);
};

Спасибо за помощь!

Копия

РЕДАКТИРОВАТЬ: Я думаю, что мог бы подойти немного ближе. Я попытался реализовать один из ответов, и это привело к следующей ошибке:

    C:\Users\c\Documents\Arduino\libraries\RTClib\RTClib.cpp:284:1: error: 'Ds1307SqwPinMode' does not name a type

 Ds1307SqwPinMode RTC_DS1307::readSqwPinMode() {

 ^

exit status 1
Error compiling for board Arduino/Genuino Uno.

Это намного меньше, чем раньше. Я буду держать это в курсе!

РЕДАКТИРОВАТЬ 2:

Тем временем я попробовал что-то совершенно другое, например, изменил имя OFF и ON во всей RTClib, касаясь только модуля DS1307. Однако это дает мне совершенно новую строку ошибок, таких как:

error: 'enum Ds1307SqwPinMode' is not a class or a namespace

  RTC_DS1307 Ds1307SqwPinMode::readSqwPinMode() {

                                              ^

и:

error: could not convert '(Ds1307SqwPinMode)mode' from 'Ds1307SqwPinMode' to 'RTC_DS1307'

   return static_cast<Ds1307SqwPinMode>(mode);

                                            ^

Эти ошибки, в частности, возникают только в библиотеке .cpp. Вот где я сейчас застрял

, 👍0

Обсуждение

Подсказка №1: например, вы можете переместить перечисление в контекст класса (и сократить имя перечисления, Ds1307SqwPinMode => SqwPinMode)., @Mikael Patel

@MikaelPatel, например: «DS1307PinMode»?, @CCG

Подсказка №2: Почему некоторые функции-члены являются «статическими», а другие нет?, @Mikael Patel

@MikaelPatel, если бы я только знал, я не создал эту библиотеку сам, поэтому меня это тоже так нервирует, тем более что я новичок в Arduino. За это отвечает производитель кода elerow, я ему отправил сообщение, что что-то не так. Теперь жду ответа. А пока попробую реализовать ваше решение, спасибо!, @CCG

Совет №3: символы, состоящие только из заглавных букв, традиционно используются для определений (символы препроцессора, макросы и т. д.) в C/C++., @Mikael Patel


2 ответа


Лучший ответ:

0

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ С РЕШЕНИЕМ:

Наконец-то я наткнулся на последнюю стену проблем, прежде чем заставить ее работать,

  1. Я заново скачал все библиотеки.
  2. Перешел к файлу библиотеки .h RTClib
  3. Имена переменных изменены с OFF на OFF и на ONN (знаю, это глупо, но потерпите)
  4. Обнаружена совершенно новая ошибка, которая, по-видимому, возникает в версии платы 1.6.23.

Ошибка:

В функции «глобальные конструкторы, привязанные к BME280_LCD_TIME.o':

lto1.exe: внутренняя ошибка компилятора: ошибка сегментации

Отправьте полный отчет об ошибке

с предварительно обработанным исходным кодом, если это необходимо.

Инструкции см. в http://gcc.gnu.org/bugs.html.

lto-wrapper.exe: фатальная ошибка: C:\Program Файлы\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.15.0_x86__mdqgnx93n4wtt\hardware\tools\avr/bin/avr-gcc вернул 1 статус выхода

компиляция прекращена.

c:/программа files/windowsapps/arduinollc.arduinoide_1.8.15.0_x86__mdqgnx93n4wtt/hardware/tools/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/bin/ld .Exe: ошибка: сбой lto-wrapper

collect2.exe: ошибка: ld вернул 1 статус выхода

статус выхода 1 Ошибка компиляции для платы Arduino/Genuino Uno.

  1. Перейдите в Инструменты > Плата > Менеджер плат.
  2. Мне лично пришлось изменить «Платы Arduino AVR от Arduino версии 1.6.23» на версия 1.6.21
  3. Скомпилируйте код И это должно сработать!
,

0

Общее правило — хранить такие определения, как перечисления, в контексте класса (библиотеки). Ниже приведен возможный рефакторинг:

class RTC_DS1307 {
public:
   enum SqwPinMode { OFF = 0x00, ON = 0x80, SquareWave1HZ = 0x10, SquareWave4kHz = 0x11, SquareWave8kHz = 0x12, SquareWave32kHz = 0x13 };

   ...
   static SqwPinMode readSqwPinMode();
   static void writeSqwPinMode(SqwPinMode mode);
   ...
};

Удачи!

,

Это определенно что-то сделало! Похоже, мне теперь придется немного покопаться в .cpp! Попробую немного повозиться! Спасибо!, @CCG

Поэтому я попробовал кое-что, например, изменить имя. RTC_DS1307 Ds1307SqwPinMode::readSqwPinMode() { но все, что я делаю, это дает мне, что «Ds1307SqwPinMode» не объявлен. я в тупике от этого, @CCG

@CCG Не забудьте принять ответ., @Mikael Patel

проверьте мое предстоящее редактирование!, @CCG