Возникла проблема с переобъявлением символа другого типа

Боролся с этим в течение нескольких дней, и я подозреваю, что у меня есть несколько проблем, но я не могу их найти.

Проект: нужен последовательный счет, который считает от 5 до 50, а прерывание кнопки должно запускать отображение текущего времени, а затем продолжать счет.

Проблема: не удается завершить компиляцию, так как мой "void rtcTime()" говорит, что я переобъявлен как символ другого типа.

Мы очень ценим любую помощь, которую может оказать сообщество.

Код:

// Функции даты и времени с использованием RTC DS1307, подключенного через I2C и Wire lib
#include "RTClib.h"
#include <Wire.h>


RTC_DS1307 rtc;

int count = 5;
int rtcTime = 0;
int pin = 0;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup (){

  pinMode(2, INPUT);

  rtc.begin();

  while (!Serial); // для Леонардо/Микро/Зеро

  Serial.begin(9600);

  if (! rtc.begin()) {
   Serial.println("Couldn't find RTC");
   while (1);
      }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // следующая строка устанавливает RTC на дату & время составления этого скетча
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // Эта строка устанавливает RTC с явной датой & время, например, установить
    // 21 января 2014 года в 3 часа ночи вы бы позвонили:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
     }

     attachInterrupt(pin, rtcTime, RISING);
} 


void loop()
{
  // Подсчет X5 на последовательном мониторе

  if (count > 50)
    {
    count=5;
    Serial.println(count);
    }

   else if (count<50)
    {
    count=count+5;
    Serial.println(count);
    delay(1000);
     }
  }

void rtcTime() {
    DateTime now = rtc.now();

    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    }

Сообщение об ошибке:

Arduino: 1.8.10 (Mac OS X), плата: "Arduino/Genuino Mega или Mega 2560, ATmega2560 (Мега 2560)"

ds1307_workingCopy_Mod5:60:14: ошибка: 'void rtcTime()' повторно объявлен как другой вид символа void rtcTime() { ^ /Users/kiko/Documents/Arduino/ds1307_workingCopy_Mod5/ds1307_workingCopy_Mod5.ino:9:5: примечание: предыдущее объявление 'int rtcTime' int rtcTime = 0; ^~~~~~~ /Users/kiko/Documents/Arduino/ds1307_workingCopy_Mod5/ds1307_workingCopy_Mod5.ino: В функции 'void setup()': /Users/kiko/Documents/Arduino/ds1307_workingCopy_Mod5/ds1307_workingCopy_Mod5.ino:38:42: предупреждение: неверное преобразование из 'int' в 'void ()()' [-fpermissive] attachInterrupt(pin, rtcTime, RISING); ^ В файле, включенном из sketch/ds1307_workingCopy_Mod5.ino.cpp:1:0: /Users/kiko/Desktop/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:150:6: примечание: инициализация аргумента 2 'void attachInterrupt (uint8_t, void ()(), int)' void attachInterrupt(uint8_t, void (*)(void), int mode); ^~~~~~~~~~~~~~~ /Users/kiko/Documents/Arduino/ds1307_workingCopy_Mod5/ds1307_workingCopy_Mod5.ino: В функции 'void rtcTime()': ds1307_workingCopy_Mod5:60:14: ошибка: 'void rtcTime()' переобъявлен как другой вид символа void rtcTime () { ^ /Users/kiko/Documents/Arduino/ds1307_workingCopy_Mod5/ds1307_workingCopy_Mod5.ino:9:5: примечание: предыдущее объявление 'int rtcTime' int rtcTime = 0; ^~~~~~~ Найдено несколько библиотек для «RTClib.h». Используется: /Users/kiko/Documents/Arduino/libraries/RTClib-1.3.3 Не используется: /Users/kiko/Documents/Arduino/libraries/RTCLib_by_NeiroN Несколько найдены библиотеки для "Wire.h" Используемые: /Users/kiko/Desktop/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/Wire статус выхода 1 'void rtcTime()' переобъявлен как символ другого типа

В этом отчете будет больше информации с параметром "Показать подробный вывод". во время компиляции" включена в Файл -> Настройки.

, 👍-1

Обсуждение

Не рекомендуется использовать rtcTime для всего...., @KIIV

Вы дали одно и то же имя rtcTime переменной и функции. Не могу работать, @chrisl

Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это проблема чистого программирования, очень простая синтаксическая ошибка, не связанная с Arduino., @chrisl

KIIV, у меня нет эмоциональной привязанности к "rtcTime", я просто изменил его на "buttonPressed" и изменил его также в объявлении в начале на "volatile int buttonPressed=0". Никаких изменений в результатах, по-прежнему ошибка «void buttonPressed() переобъявлена как символ другого типа», спасибо за ввод, хотя я чувствовал, что лучше держаться подальше от слов, которые могут быть командами., @pancho22448

@pancho22448 pancho22448 Это не поможет, если вы измените и переменную, и функцию с именем rtcTime на buttonPressed ... После этого изменения это все еще переменная и функция с тем же именем buttonPressed. Небольшая подсказка: замените ОДНУ ИЗ НИХ!, @KIIV


1 ответ


0

Конструктор Arduino не создает предварительные объявления функций для функций, используемых в коде в качестве обратных вызовов. Это как-то связано с появлением имени без обычной формы вызова функции.

Вы можете переместить функцию rtcTime перед setup(), чтобы она была видна для использования в качестве параметра в attachInterrupt, или вы можете создать предварительную декларацию для компилятора. Ваша попытка сделать имя функции допустимым состояла в том, чтобы создать переменную с этим именем. Таким образом, вы создали ошибку повторяющегося имени.

Добавить

void rtcTime();

перед функцией setup() и удалите int rtcTime = 0;

,