Я пытаюсь совместить автоматический дверной замок с 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(); // Получаем следующее значение
  }
}

, 👍-2

Обсуждение

Измените свой вопрос, включив в него [минимальный, полный и проверяемый пример](http://stackoverflow.com/help/mcve) кода, а не только фрагменты. *Минимальный* означает, что вы убрали ненужное, оставив только то, что необходимо, чтобы показать проблему. *Complete* означает, что отображаются все имена библиотек, все объявления переменных и все определения функций, поэтому людям не нужно тратить время на догадки о том, что вы сделали или что имели в виду. *Поддающийся проверке* означает, что его можно скомпилировать и протестировать, позволяя другим людям проверить свои теории о проблеме., @James Waldby - jwpat7

привет!! спасибо за ответ, как вы сказали, я приложил весь свой код к вопросу ... пожалуйста, помогите мне!!, @user33872


2 ответа


0
  1. Нельзя использовать тон и IRremote в одном скетче, поскольку они оба пытаются использовать одно и то же прерывание таймера.

  2. Не используйте почасовую сборку. Это не проверено. Получите последнюю стабильную версию, если вы работаете над своим окончательным проектом. Вам не нужны неизвестные ошибки. Пусть бета-тестеры используют почасовую сборку. Для чего-то вроде окончательного проекта вам нужно, чтобы все работало, поэтому придерживайтесь стабильной версии, а не передовой разработки.

,

Спасибо за ответ !! так что можно что-нибудь сделать, если я хочу использовать и тон, и IRremote sketch как единую программу... Можно ли изменить прерывание, которое используют программы, и назначить ему разные прерывания... можете ли вы мне помочь? для этого. пожалуйста, @user33872


1

Сообщение об ошибке множественное определение __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