interferenza tra librerie

Salve,
è da un po’ di tempo che non scrivo su questo forum, perchè ho provato a risolvere i problemi sorti con Arduino da solo, e in buona parte ci sono riuscito :grinning: . Adesso però ho bisogno del vostro aiuto. Ho scritto un codice che ha varie funzioni: comprende le librerie:

#include "pitches.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>

Il programma che ho scritto usando queste librerie è corretto (provato 1000 volte) ; adesso però volevo inserire anche la libreria #include <IRremote.h> però dopo che ho aggiunto le varie parti dell’esempio IRrecvDump mi da degli errori che vi posto.

sketch programma con errori:

/*
  Melody

 Plays a melody

 circuit:
 * 8-ohm speaker on digital pin 8

 created 21 Jan 2010
 modified 30 Aug 2011
 by Tom Igoe

This example code is in the public domain.

 http://arduino.cc/en/Tutorial/Tone

 */

#include "pitches.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>
Servo myservo;
int chiuso = 158;
int aperto = 70;

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;
#define ONE_WIRE_BUS 6
#define ventola 23
#define laser 24
#define button A7
#define led_verde 26
#define led_giallo 27
#define buzzer 22
#define fotor A8
#define pin_button A10
boolean stato_button = false;
boolean inserito = false;
int valfotor;
int stato_allarme = 0;
boolean stato_cancello = false;
int pin_buzzer = 34;
int melodia[] = {NOTE_AS5, NOTE_F5};
int tempo[] = {8,4};
int nr = 2;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(13,11,9,7,5,3);
const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne

// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {
 52,50,48,46 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
 44,42,40,38 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
// Creazione della tastiera
char code [4]; 
char i;

void setup() {
   myservo.attach(31);
 myservo.write(chiuso);
  Serial.begin(9600);
  sensors.begin();
    irrecv.enableIRIn();
  lcd.begin(16,2);
  pinMode(ventola,OUTPUT);
  pinMode(laser,OUTPUT);
   pinMode(button,INPUT);
  pinMode(led_verde,OUTPUT);
  pinMode(led_giallo,OUTPUT);
  pinMode(buzzer,OUTPUT);
  Serial.println("Salve e Benvenuto");
  lcd.setCursor(0,0);
  lcd.print("Salve e");
  lcd.setCursor(0,1);
  lcd.print("BENVENUTO! ");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("PROGETTO ESAME");
  lcd.setCursor(0,1);
  lcd.print("DI STATO 2014/15");
  delay(2000);
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("ARDUHOME");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("REALIZZATO DA:");
  lcd.setCursor(0,1);
  lcd.print("TORTA GUGLIELMO");
  delay(2000);
  digitalWrite(led_verde,HIGH);
  } 
  void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) { 
    Serial.print("Decoded PANASONIC - Address: ");
    Serial.print(results->panasonicAddress,HEX);
    Serial.print(" Value: ");
  }
  else if (results->decode_type == LG) {
     Serial.print("Decoded LG: ");
  }
  else if (results->decode_type == JVC) {
     Serial.print("Decoded JVC: ");
  }
  Serial.print(results->value, HEX);
  Serial.print(" (");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    } 
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  } 
  if(analogRead(pin_button) >1022){
for (int numero = 0; numero < nr; numero++) {
  int duratanota = 1000 / tempo[numero];
  tone(pin_buzzer, melodia[numero], duratanota); 
delay(duratanota * 1.30);
noTone(pin_buzzer); }

}
 if(analogRead(button) > 500) {
      stato_button = true;}
      if(stato_button == true){
        inserimento_allarme();
        stato_button = false;}
       if(stato_button ==false){
         temp_ambiente();
         }
          }
          
  void temp_ambiente(){
    valfotor = analogRead(fotor);
    if((valfotor <= 700) && (stato_allarme == 1)){
      digitalWrite(buzzer,HIGH); }
    sensors.requestTemperatures();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temperatura");
  lcd.setCursor(0,1);
  lcd.print("Interna: ");
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print(" C");
     
    if(sensors.getTempCByIndex(0) >19) {
      digitalWrite(ventola,HIGH);}
      
    
  }
void inserimento_allarme(){
  if(stato_cancello == false){
    Serial.println("Cancello Chiuso");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Cancello");
    lcd.setCursor(0,1);
    lcd.print("Chiuso");
    delay(1500);
    }
    if(stato_cancello == true){
      Serial.println("Cancello Aperto");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Cancello");
    lcd.setCursor(0,1);
    lcd.print("Aperto");
    delay(1500);
    }
  if(inserito == false){
    lcd.clear();
    delay(500);
    Serial.println("ALLARME DISINSERITO");
    lcd.setCursor(0,0);
    lcd.print("ALLARME");
    lcd.setCursor(0,1);
    lcd.print("DISINSERITO");
    delay(2000);
    Serial.println("Per inserire allarme, chiudere o aprire il cancello...");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Per Inserire");
    lcd.setCursor(0,1);
    lcd.print("Allarme...");
    delay(1000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Chiudere/Aprire");
    lcd.setCursor(0,1);
    lcd.print("il cancello...");
    delay(1500);
    }
    else if(inserito == true){
    lcd.clear();
    delay(500);
    Serial.println("ALLARME INSERITO");
    lcd.setCursor(0,0);
    lcd.print("ALLARME");
    lcd.setCursor(0,1);
    lcd.print("INSERITO");
    delay(2000);
    Serial.println("Per disinserire Allarme, chiudere o aprire il cancello...");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Per Disinserire");
    lcd.setCursor(0,1);
    lcd.print("Allarme...");
    delay(1500);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Chiudere/Aprire");
    lcd.setCursor(0,1);
    lcd.print("il cancello...");
    delay(1500);
    }
    Serial.print("...DIGITA CODICE");
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("...DIGITA CODICE:");
   for (i=0; i<4; i++) {
code[i] = keypad.waitForKey();
 lcd.setCursor(0,1);
  lcd.print("*");
  Serial.print("Tasto numero:");
 Serial.println("*");
}
       if((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
       lcd.clear();
 lcd.setCursor(0,0);
lcd.print("CODICE ESATTO!");
Serial.println("CODICE ESATTO!");
delay(3000);
lcd.clear();
lcd.setCursor(0,0);
       lcd.print("ALLARME");
       lcd.setCursor(0,1);
       lcd.print("INSERITO");
       Serial.println("ALLARME INSERITO");
       stato_allarme = 1;
       digitalWrite(led_verde,LOW);
       digitalWrite(led_giallo,HIGH);
       digitalWrite(laser,HIGH);
       delay(2000);
       inserito = true;
       if(stato_allarme == 1){
        controllo_allarme();
          }
     
        }
       if((code[0] == '7') && (code[1] == '9') && (code[2] == '3') && (code[3] == 'B')) {
         digitalWrite(buzzer,LOW);
      lcd.clear();
      lcd.setCursor(0,0);
 lcd.print("ALLARME");
 lcd.setCursor(0,1);
 lcd.print("DISINSERITO");
 Serial.println("ALLARME DISINSERITO");
 digitalWrite(led_giallo,LOW);
 digitalWrite(led_verde,HIGH);
 digitalWrite(laser,LOW);
 delay(2000);
 inserito = false;
 stato_allarme = 0;
 ritorno_temp();
 }
 if((code[0] == '2') && (code[1] == '2') && (code[2] == '2') && (code[3] == '2')) {
 myservo.write(aperto);
 stato_cancello = true;
}
if((code[0] == '1') && (code[1] == '1') && (code[2] == '1') && (code[3] == '1')) {
myservo.write(chiuso);
stato_cancello = false;
}
}
      void controllo_allarme(){
        valfotor = analogRead(fotor);
        if(valfotor <= 700){
          digitalWrite(buzzer,HIGH);
          }
         
          }
      
      void ritorno_temp(){
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Ritorno a ");
        lcd.setCursor(0,1);
        lcd.print("controllo TEMP.");
        Serial.println("Ritorno a controllo temperatura!");
        delay(5000);
        }

toneMelody.ino:27:11: error: variable or field ‘dump’ declared void
toneMelody.ino:27:11: error: ‘decode_results’ was not declared in this scope
toneMelody.ino:27:27: error: ‘results’ was not declared in this scope
Errore durante la compilazione

La mia domanda è: la libreria <IRremote.h> puo’ interferire con le precedenti librerie citate?
Come potrei risolvere? Grazie dell’aiuto in anticipo!!

guglielmotorta:
toneMelody.ino:27:11: error: variable or field ‘dump’ declared void
toneMelody.ino:27:11: error: ‘decode_results’ was not declared in this scope
toneMelody.ino:27:27: error: ‘results’ was not declared in this scope
Errore durante la compilazione

Non è che le die librerie abbiano qualche pin in comune???

La mia domanda è: la libreria <IRremote.h> puo’ interferire con le precedenti librerie citate?
Come potrei risolvere? Grazie dell’aiuto in anticipo!!

  1. che IDE usi ?
  2. hai provato la IRremote da sola ?

Non è che le die librerie abbiano qualche pin in comune???

Ho controllato, non hanno pin in comune.

  1. che IDE usi ?
  2. hai provato la IRremote da sola ?

Uso l'IDE 1.6.0

ho provato la libreria IR remote da sola e funziona normalmente.

Cosa potrebbe essere?

Primo, sposta la “#include <IRremote.h>” in testa alle include, secondo … su che Arduino sei ? Immagino su una Mega2560 visto l’uso di A8 e A10 :wink:

Guglielmo

Edit: Occhio comunque che la Tone, la Servo e la IRremote … vanno probabilmente in conflitto, specie nell’uso dei timers … ::slight_smile:

Primo, sposta la “#include <IRremote.h>” in testa alle include, secondo … su che Arduino sei ? Immagino su una Mega2560 visto l’uso di A8 e A10 :wink:

Guglielmo

Si esatto, sto utilizzando un Arduino Mega 2560.
Ho spostato la libreria <IRremote.h> in testa alle altre e adesso mi da altri errori:

C:\Users\Sala\AppData\Local\Temp\build75905652932791766.tmp/core.a(Tone.cpp.o): In function `__vector_13':
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Tone.cpp:536: multiple definition of `__vector_13'
Arduino-IRremote-master\IRremote.cpp.o:C:\Program Files (x86)\Arduino\libraries\Arduino-IRremote-master/IRremote.cpp:339: first defined here
/Arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.8.1/../../../../avr/bin/ld: Disabling relaxation: it will not work with multiple definitions
collect2: error: ld returned 1 exit status
Errore durante la compilazione

... lo so, avevo provato e per questo ti ho detto : "Occhio comunque che la Tone, la Servo e la IRremote ... vanno probabilmente in conflitto, specie nell'uso dei timers ..."

Devi guardarti i sorgenti e vedere i timers che usano ... a volta è possibile cambiarli (... nel senso che è già previsto nella libreria) a volte ... purtroppo, non puoi usare le librerie assieme ...

Guglielmo

Scusa, gpb01 vorrei farti una domanda, adesso non posso provare perché non ho sotto mano l’arduino : la <IRremote.h> potrebbe interferire anche con la <Softserial.h> ? (Altro sketch di Arduino Uno)

Si, potrebbe, ma non per l'uso di timers, ma per l'uso di interrupt (la SoftwareSerial usa la pinChangeInt ... coma da commento in testa alla libreria : "Pin change interrupt macros by Paul Stoffregen (http://www.pjrc.com)**") ...

... occorrerebbe andare a guardare quali usano le due librerie ::slight_smile:

Guglielmo

Dove devo controllare gli interrupt? Cioè devo controllare nelle librerie?

In TUTTI i casi devi controllare/studiare dentro come sono fatte le librerie ...

... stai usando librerie che usano gli interrupt
... stai usando librerie che usano i timers

... come minimo dovrai accertarti TU che le varie librerie non vadano in conflitto tra loro non ti pare ? L'autore di ogni libreria di certo no può sapere assieme a cosa tu le userai. ::slight_smile:

Alcuni cercano di renderti la vita più facile ... ad esempio, l'autore della IRremote è stato bravo ed ha già inserito alcune diverse possibilità per i timer ... basta andare a guardare il file IRremoteInt.h per vederlo. Ma non tutte le librerie sono fatte per poter essere semplicemente modificate toccando una #define ... in tal caso, occorre vedere SE e come è possibile adattarle hai propri scopi.

Guglielmo

Grazie gpb01 per l'aiuto, cercherò di studiarle e di venirne fuori. Se riesco ci faccio sapere :smiley: