Я пытаюсь совместить автоматический дверной замок с RFID MFRC522 с программой IR REMOTE.
Я получаю эту ошибку.
Arduino: 1.8.2 Hourly Build 2017/02/17 11:33 (Windows 8.1), Board: "Arduino/Genuino Uno"
Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':
(.text+0x0): multiple definition of `__vector_7'
libraries\REMOTE\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Uno.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Вот весь код:
#include <RFID.h>
#include <Wire.h> // Библиотека соединений i2C
#include <LiquidCrystal_I2C.h> //ЖК-библиотека Memanggil i2C
LiquidCrystal_I2C lcd(0x3F, 16, 2);
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN,RST_PIN);
const int buzzer = 7; // Пассивный зуммер на контакте D7 и GND
const int doorLock = 8; //Дверной замок соленоида водителя/вход реле ke pin D8
int serNum[5]; //Переменная буферная карта сканирования
int cards[][5] = { //ID Kartu yang diperbolehkan masuk
{120, 181, 196 ,101, 14}
};
bool access = false;
int alarm = 0;
uint8_t alarmStat = 0;
uint8_t maxError = 5;
void setup(){
Serial.begin(9600);
lcd.begin();
SPI.begin();
rfid.init();
pinMode(doorLock, OUTPUT);
digitalWrite(doorLock, HIGH);
tone (buzzer,1200);
lcd.setCursor (0,0);
lcd.print(F(" RFID System "));
lcd.setCursor (0,1);
lcd.print(F(" Control Access "));
delay (2000);
lcd.clear();
noTone (buzzer);
}
void loop(){
if (alarm >= maxError){
alarmStat = 1; }
if (alarmStat == 0){
lcd.setCursor (0,0);
lcd.print(F(" -System Ready- "));
lcd.setCursor (0,1);
lcd.print(F(" Scan Your Card "));
if(rfid.isCard()){
if(rfid.readCardSerial()){
Serial.print(rfid.serNum[0]);
Serial.print(" ");
Serial.print(rfid.serNum[1]);
Serial.print(" ");
Serial.print(rfid.serNum[2]);
Serial.print(" ");
Serial.print(rfid.serNum[3]);
Serial.print(" ");
Serial.print(rfid.serNum[4]);
Serial.println("");
for(int x = 0; x < sizeof(cards); x++){
for(int i = 0; i < sizeof(rfid.serNum); i++ ){
if(rfid.serNum[i] != cards[x][i]) {
access = false;
break;
} else {
access = true;
}
}
if(access) break;
}
}
if(access){
Serial.println("Welcome!");
lcd.setCursor (0,0);
lcd.print(F(" DOOR UNLOCKED!! :)"));
lcd.setCursor (0,1);
lcd.print("ID:");
lcd.print(rfid.serNum[0]); lcd.print(rfid.serNum[1]);
lcd.print(rfid.serNum[2]); lcd.print(rfid.serNum[3]);
lcd.print(rfid.serNum[4]);
digitalWrite(doorLock, LOW);
tone (buzzer,900);
delay(100);
tone (buzzer,1200);
delay(100);
tone (buzzer,1800);
delay(200);
noTone(buzzer);
delay(600);
lcd.setCursor (0,0);
lcd.print(F("WELCOME"));
lcd.setCursor (0,1);
lcd.print(F("AutoLock after "));
for(int i=5; i>0; i--){
lcd.setCursor (15,1); lcd.print(i);
delay (1000);
}
digitalWrite(doorLock, HIGH);
lcd.clear();
} else {
alarm = alarm+1;
Serial.println("Not allowed!");
lcd.setCursor (0,0);
lcd.print(F(" ACCESS DENIED!! "));
lcd.setCursor (0,1);
lcd.print("ID:");
lcd.print(rfid.serNum[0]); lcd.print(rfid.serNum[1]);
lcd.print(rfid.serNum[2]); lcd.print(rfid.serNum[3]);
lcd.print(rfid.serNum[4]);
tone (buzzer,900);
delay(200);
noTone(buzzer);
delay(200);
tone (buzzer,900);
delay(200);
noTone (buzzer);
delay(500);
lcd.clear();
}
}
rfid.halt();
}
else {
lcd.setCursor (0,0);
lcd.print(F("-System LOCKED- "));
lcd.setCursor (0,1);
lcd.print(F(" Please Wait "));
for(int i=5; i>0; i--){
tone (buzzer,4000);
lcd.setCursor (13,1); lcd.print(i);
lcd.print(F(" "));delay (1000);}
noTone (buzzer);
alarmStat = 0;
alarm = 0;
}
}
//код ИК-ПУЛЬТА
#include <IRremote.h>
int RECV_PIN = 2; // контакт, к которому вы подключаете выходной контакт TSOP4838
int lock =13 ;
int itsONled[] = {};
/* the initial state of LEDs is OFF (zero)
the first zero must remain zero but you can
change the others to 1's if you want a certain
led to light when the board is powered */
#define code1 26775 // код, полученный от кнопки 1
IRrecv irrecv(RECV_PIN);
decode_results results;
void remote()
{
Serial.begin(9600); // вы можете прокомментировать эту строку
irrecv.enableIRIn(); // Запускаем приемник0
pinMode(lock, OUTPUT);
}
void loop_1() {
if (irrecv.decode(&results)) {
unsigned int value = results.value;
switch(value) {
case code1:
if(itsONled[1] == 1) { // если горит первый светодиод, то
digitalWrite(lock, LOW); // выключаем при нажатии кнопки
itsONled[1] = 0; // и устанавливаем его состояние как выключенное
Serial.println("ledl OFF");
} else { // иначе, если первый светодиод не горит
digitalWrite(lock, HIGH); // включаем при нажатии кнопки
Serial.println("led 1 ON");
itsONled[1] = 1; // и устанавливаем его состояние как на
}
break;
}
Serial.println(value); // вы можете прокомментировать эту строку
irrecv.resume(); // Получаем следующее значение
}
}
@user33872, 👍-2
Обсуждение2 ответа
Нельзя использовать тон и IRremote в одном скетче, поскольку они оба пытаются использовать одно и то же прерывание таймера.
Не используйте почасовую сборку. Это не проверено. Получите последнюю стабильную версию, если вы работаете над своим окончательным проектом. Вам не нужны неизвестные ошибки. Пусть бета-тестеры используют почасовую сборку. Для чего-то вроде окончательного проекта вам нужно, чтобы все работало, поэтому придерживайтесь стабильной версии, а не передовой разработки.
Спасибо за ответ !! так что можно что-нибудь сделать, если я хочу использовать и тон, и IRremote sketch как единую программу... Можно ли изменить прерывание, которое используют программы, и назначить ему разные прерывания... можете ли вы мне помочь? для этого. пожалуйста, @user33872
Сообщение об ошибке множественное определение __vector_7
означает, что для прерывания с вектором прерывания 7 определено более одного обработчика прерывания.
Хотя в техническом описании ATmega328x в таблице под названием Векторы прерываний в ATmega328 и ATmega328P вектор прерывания 7 упоминается как прерывание по тайм-ауту сторожевого таймера, это, вероятно, вводит в заблуждение, поскольку могут быть определены только следующие ISR. в Tone.cpp
:
ISR(TIMER0_COMPA_vect)
ISR(TIMER1_COMPA_vect)
ISR(TIMER2_COMPA_vect)
ISR(TIMER3_COMPA_vect)
ISR(TIMER4_COMPA_vect)
ISR(TIMER5_COMPA_vect)
(Они могут быть определены, но, как правило, большинство из них не определены. Все они зависят от того, какой MCU выбран.)
Статья множественное определение '__vector_7' на arduino.cc приписывает проблему последнему из этих ISR, ISR(TIMER5_COMPA_vect)
. Короче говоря, вам может понадобиться проверить, для какой платы или MCU вы компилируете, или найти замену одной из Tone
или IRremote
, библиотек, которые оба определяют ISR, у которого есть конфликт.
Редактировать 1: Статья TimerFreeTone Library v1.5: воспроизведение мелодий без таймеров и поэтому нет конфликтов на сайте arduino.cc описана библиотека TimerFreeTone v1.5, которая генерирует тоны без использования таймеров. Возможно, вы сможете использовать эту библиотеку вместо библиотеки Tone
, в которой есть конфликт.
Спасибо за ценный ответ ... Я понял проблему ... Можем ли мы назначить другое прерывание для обеих программ, моя основная идея состоит в том, чтобы управлять дверным замком с помощью системы RFID, а также с помощью ИК-ПУЛЬТА ДИСТАНЦИОННОГО УПРАВЛЕНИЯ, по отдельности обе программы с вывод работает нормально .. я хотел объединить оба, чтобы я мог сбросить в одну программу для доступа к обеим функциям ... Пожалуйста, помогите мне с этим., @user33872
@ user33872, см. редактирование 1, @James Waldby - jwpat7
Большое спасибо!! Успешно скомпилирован с обеими программами, я прокомментировал все библиотеки тонов и добавил в свой скетч библиотеку TimerFreeTone v1.5 вместе с программой, которую вы прикрепили (получена в статье TimerFreeTone Library v1.5: Воспроизведение тонов без таймеров и, следовательно, без них). конфликты на arduino.cc). Я пойду с практическим оборудованием и вернусь к вам! Ваши ответы были ОЧЕНЬ ПОЛЕЗНЫ :) Спасибо!!, @user33872
Привет, доброе утро. Комбинированный эскиз RFID и IRremote в реальном времени работает абсолютно нормально. Большое спасибо за помощь мне в этом .... и я столкнулся с другой проблемой, я хотел, чтобы звуковой сигнал зуммера каждый раз, когда я сканирую действующую карту и недействительную карту. И после 5-кратного сканирования недействительной карты вся система блокируется на некоторое время (в программе длительность 5 секунд).. Для всех этих операций мне нужен звуковой сигнал.. как мне это сделать?, @user33872
Я не знаю, из-за того, что не понимаю часть программы и часть того, что вы хотите сделать. Кстати, вы прочитали и поняли пример Blink Without Delay? ¶ Обратите внимание, что в for(int x = 0; x < sizeof(cards); x++)
, sizeofcards – это количество байтов в карточках, то есть количество записей, умноженное на размер каждой записи. Вместо этого попробуйте x < sizeofcards / sizeofcards[0];
. (Скобки не нужны после оператора sizeof
, если только аргумент не является именем типа данных, а не именем переменной.), @James Waldby - jwpat7
- rfid_default_keys проверить с помощью RC522
- Отправка данных из ESP8266 в PHP
- Как сделать динамическое меню с подменю ( Arduino mega или Arduino Uno)
- Цикл чтения RFID-карты кажется остановленным
- Автопарковка на arduino
- Сколько датчиков может поддерживать ARDUINO UNO?
- Создание активного заднего крыла на радиоуправляемой машине
- Печать string and integer LCD
Измените свой вопрос, включив в него [минимальный, полный и проверяемый пример](http://stackoverflow.com/help/mcve) кода, а не только фрагменты. *Минимальный* означает, что вы убрали ненужное, оставив только то, что необходимо, чтобы показать проблему. *Complete* означает, что отображаются все имена библиотек, все объявления переменных и все определения функций, поэтому людям не нужно тратить время на догадки о том, что вы сделали или что имели в виду. *Поддающийся проверке* означает, что его можно скомпилировать и протестировать, позволяя другим людям проверить свои теории о проблеме., @James Waldby - jwpat7
привет!! спасибо за ответ, как вы сказали, я приложил весь свой код к вопросу ... пожалуйста, помогите мне!!, @user33872