Возникла проблема с переобъявлением символа другого типа
Боролся с этим в течение нескольких дней, и я подозреваю, что у меня есть несколько проблем, но я не могу их найти.
Проект: нужен последовательный счет, который считает от 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()' переобъявлен как символ другого типа
В этом отчете будет больше информации с параметром "Показать подробный вывод". во время компиляции" включена в Файл -> Настройки.
@pancho22448, 👍-1
Обсуждение1 ответ
Конструктор Arduino не создает предварительные объявления функций для функций, используемых в коде в качестве обратных вызовов. Это как-то связано с появлением имени без обычной формы вызова функции.
Вы можете переместить функцию rtcTime перед setup(), чтобы она была видна для использования в качестве параметра в attachInterrupt, или вы можете создать предварительную декларацию для компилятора. Ваша попытка сделать имя функции допустимым состояла в том, чтобы создать переменную с этим именем. Таким образом, вы создали ошибку повторяющегося имени.
Добавить
void rtcTime();
перед функцией setup() и удалите int rtcTime = 0;
- DS3231 с Arduino Nano для точной синхронизации
- Устранение дребезга кнопки с помощью прерывания
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Как прервать функцию цикла и перезапустить ее?
- Несколько кнопок на одном прерывании, как устранить дребезг?
- Наилучший метод проектирования схемы с 20 кнопками
- Прерывание при нажатии кнопки + устранение дребезга
- Захват прерывания на обоих фронтах, когда он установлен на RISING или FALLING
Не рекомендуется использовать
rtcTime
для всего...., @KIIVВы дали одно и то же имя rtcTime переменной и функции. Не могу работать, @chrisl
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это проблема чистого программирования, очень простая синтаксическая ошибка, не связанная с Arduino., @chrisl
KIIV, у меня нет эмоциональной привязанности к "rtcTime", я просто изменил его на "buttonPressed" и изменил его также в объявлении в начале на "volatile int buttonPressed=0". Никаких изменений в результатах, по-прежнему ошибка «void buttonPressed() переобъявлена как символ другого типа», спасибо за ввод, хотя я чувствовал, что лучше держаться подальше от слов, которые могут быть командами., @pancho22448
@pancho22448 pancho22448 Это не поможет, если вы измените и переменную, и функцию с именем
rtcTime
наbuttonPressed
... После этого изменения это все еще переменная и функция с тем же именемbuttonPressed
. Небольшая подсказка: замените ОДНУ ИЗ НИХ!, @KIIV