tone() funktioniert nicht

Wenn ich den Fehlercode richtig verstehe, dann wird Tone bereits in einer eingefügten Bibliothek benutzt und deshalb kann ich es nicht benutzen. Hat jemand vielleicht eine Alternative?

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <Keypad.h>
#include <Servo.h>
Servo myServo;
const int RemotePin = 11;
const int greenLed = 12;
const int redLed = 13;
const int piezoPin = 42;
int locked = false;
const String password = "2002"; // change your password here
String input_password;
IRrecv irrecv(RemotePin);
decode_results results;
const byte ROWS = 4; //four rows (Vier Spalten)
const byte COLS = 4; //four columns (Vier Zeilen)
char hexaKeys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Keypad Tastatur = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup() {
 
 myServo.attach(10);
 pinMode(redLed, OUTPUT);
 pinMode(greenLed, OUTPUT);
 Serial.begin(9600);
 digitalWrite(greenLed, HIGH);
 myServo.write(0);
 Serial.println("Das Schloss ist offen!");
 Serial.println("Enabling IRin");
 irrecv.enableIRIn(); // Start the receiver
 Serial.println("Enabled IRin");
}

void loop() {
 char Taste = Tastatur.getKey();
 if (irrecv.decode(&results)){
   Serial.println(results.value, DEC);
   irrecv.resume(); // Receive the next value
 }
 if (locked == false){
   if (results.value == 16753245){
     digitalWrite(greenLed, LOW);
     digitalWrite(redLed, HIGH);
     myServo.write(90);
     delay(200);
     locked = true;
     Serial.println("Der Karton ist verriegelt!");
   }
   if (Taste){
     Serial.println(Taste);
     if (Taste == '*'){
       digitalWrite(greenLed, LOW);
       digitalWrite(redLed, HIGH);
       myServo.write(90);
       delay(200);
       locked = true;
       Serial.println("Der Karton ist verriegelt!");
     }
   }
 }
 if (locked == true) {
   if (results.value == 16724175){
     myServo.write(0);
     locked = false;
     delay(200);
     digitalWrite(greenLed, HIGH);
     digitalWrite(redLed, LOW);
     Serial.println("Der Karton ist entriegelt!");
   }
   
   if (Taste){
   Serial.println(Taste);

     if(Taste == '*') { //start der Eingabe
       input_password = ""; // reset imput password
     } else if(Taste == '#') { //ende der eingabe
       if(password == input_password) {
         Serial.println("password is correct");
         myServo.write(0);
         locked = false;
         delay(200);
         digitalWrite(greenLed, HIGH);
         digitalWrite(redLed, LOW);
         Serial.println("Der Karton ist entriegelt!");
       } else {
         Serial.println("password is incorrect, try again");
         tone(piezoPin, 400, 1000);
         delay(1000);
         noTone(piezoPin);
       }
       input_password = ""; // reset imput password
     } else {
       input_password += Taste; // append new character to input password string
     }
   }
 }
}

Fehlercode:
Tone.cpp.o (symbol from plugin): In function `timer0_pin_port’:

(.text+0x0): multiple definition of `__vector_13’

libraries\IRremote-2.2.3\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here

d:/arduino/hardware/tools/avr/bin/…/lib/gcc/avr/7.3.0/…/…/…/…/avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino Mega or Mega 2560.

Also mein Plan ist, dass der buzzer/piezo für eine Sekunde angeht, wenn das Passwort falsch ist.

Pack den Code bitte in die Codetags </>.

Wenn ich den Fehlercode richtig verstehe, dann wird Tone bereits in einer eingefügten Bibliothek benutzt und deshalb kann ich es nicht benutzen.

Nein!

Die Meldung ist recht eindeutig.

multiple definition of `__vector_13’
Es ist die IRremote Lib welche dir in die Quere kommt

Das Problem:
Tone, als auch IRremote nutzen Timer 2

Die Lösung:
In IRremoteInt.h boarddefs.h einen anderen Timer auswählen.

Alternative: Die Lib TimerOne verwenden, und anstatt mit tone() ein entsprechendes PWM Signal dort erzeugen!

Bibliotheken können Timer benutzten. Wenn Du 2 Bibliotheken benutzen willst, die den gleichen Timer brauchen dann funktionieren diese nicht gemeinsam.
Kontrolliere mal welche Timer die verwendeten Biblotheken benutzen.

Grüße Uwe

combie:
Das Problem:
Tone, als auch IRremote nutzen Timer 2

Die Lösung:
In IRremoteInt.h einen anderen Timer auswählen.

Danke, aber wie mache ich das genau?

Wo klemmts denn?

Editieren von eigenen und fremden Libraries

combie:
Wo klemmts denn?

Editieren von eigenen und fremden Libraries

Wie öffne ich die Bibliothek um sie zu verändern? Wie ändere ich den Timer? Einfach "Timer 2" auf "Timer 1" ändern? Ich glaube ich klinge gerade ziemlich dumm, aber ich habe kein Plan, was ich machen soll.

Hier kann ich dir den Punkt zeigen.
Um Zeile 84 herum, du wirst fündig.

Auf deinem Rechner, musst du die Datei selber finden.
Die "Ausführlichen Ausgaben" helfen dabei.

Ein vernünftiger Texteditor, wie z.B. Notepad++ hilft zusätzlich dabei.

Gruß Tommy