Progetto universitario con Arduino UNO

Ciao a tutti, sto realizzando un progetto con Arduino ma non capisco cosa sto sbagliando.

Il progetto (una sorta di antifurto) prevede questi passaggi:

  • led rgb acceso su rosso
  • clicco bottone e led rgb diventa verde, accompagnato da una musichetta (3 note) tramite buzzer passivo
    (e fin qui tutto bene…ora inizia il problema)
  • a questo punto vorrei che, tramite l’utilizzo del sensore ad ultrasuoni, se qualcosa passa davanti al sensore entro un raggio di 50cm, ci sia l’accensione di un ulteriore led rosso accompagnato da un “allarme” tramite buzzer passivo).
    Quest’ultima parte del programma funziona se fatta girare su Arduino “per conto suo”, mentre se provo ad aggiungerla ai due punti descritti sopra, mi dà un errore, e precisamente:

Arduino:1.8.12 (Windows 10), Scheda:“Arduino Uno”

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

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

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

collect2.exe: error: ld returned 1 exit status

exit status 1
Errore durante la compilazione per la scheda Arduino Uno.

il mio codice (completo) è questo:

#define BLUE 9
#define GREEN 5
#define RED 6
int buttonPin = 2;

bool unavolta = true;

#include <NewPing.h>
#define PIN_TRIGGER 4
#define PIN_ECHO 3
#define MASSIMO 300
NewPing sonar(PIN_TRIGGER, PIN_ECHO, MASSIMO);
int distanza = 50;
int buzzer = 12;




void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  analogWrite(RED, 255);
  analogWrite(BLUE, 0);
  analogWrite(GREEN, 0);
  pinMode(buttonPin,INPUT);
  pinMode(10,OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(8,OUTPUT);
  
}



void loop(){
  if(digitalRead(buttonPin)==HIGH){
    analogWrite(RED, 0);
    analogWrite(BLUE, 0);
    analogWrite(GREEN, 255);

    if(unavolta){
      tone(10,440,200);
      delay(200);
      tone(10,350,200);
      delay(200);
      tone(10,600,200);
      delay(200);
    unavolta = false; 
    }

    int lettura = sonar.ping_cm();
    unsigned char i;
    if(lettura < distanza){ 
      digitalWrite(8,HIGH); 
      for(i=0;i<50;i++){
        digitalWrite(buzzer,HIGH);
        delay(150);//wait for 1ms
        digitalWrite(buzzer,LOW);
        delay(150);//wait for 1ms
    }
  }
    else digitalWrite(8,LOW);

  }
       
}

Non capisco se sia un problema di tabulazione oppure di scelta delle funzioni.

PS: sono un po’ alle prime armi. Ho visto molti video e letto vari topic, ma non riesco a capire cosa sbaglio, abbiate clemenza :smiley:

Ti sta indicando che due librerie cercano di usare, ciascuna per i suoi scopi, lo stesso timer e … questo NON è possibile.

Quindi le due librerie, così come sono, vanno in conflitto tra di loro e NON possono coesistere.

Direi che sono la Tone e la NewPing … ::slight_smile:

Guglielmo

Capito grazie. Ma quindi non c'è modo di farle coesistere? Oppure, se volessi tenere tone (mi sembrava carino associare un suono all'attivazione dell'antifurto), come posso scrivere la seconda parte del programma senza la libreria NewPing?

Probabilmente con un po' di ricerche su Google, si trovano librerie alternative che usano un timer differente ...
... ad esempio, se ben ricordo, ci dovrebbe essere la NewTone che, appunto, usa un timer differente ... ::slight_smile:

Guglielmo

Provo a cercarla.

Intanto ho rimosso il buzzer passivo (per provare almeno a far girare il tutto) ed effettivamente me lo carica, ma non fa quello che voglio, ossia far sì che il sensore ultrasuono si “attivi” solo dopo che ho premuto il pulsante che fa diventare verde il led rgb.

Sto facendo diverse prove ma le alternative per ora sono:

  • sensore ultrasuono sempre attivo (quindi bottone inutile)
  • sensore ultrasuono mai attivo (di questa opzione posto il codice qui sotto)
#define BLUE 9
#define GREEN 5
#define RED 6
int buttonPin = 2;

bool unavolta = true;

#include <NewPing.h>
#define PIN_TRIGGER 4
#define PIN_ECHO 3
#define MASSIMO 300
NewPing sonar(PIN_TRIGGER, PIN_ECHO, MASSIMO);
int distanza = 50;
int buzzer = 12;




void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  analogWrite(RED, 255);
  analogWrite(BLUE, 0);
  analogWrite(GREEN, 0);
  pinMode(buttonPin,INPUT);
  pinMode(10,OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(8,OUTPUT);
  
}



void loop(){
  if(digitalRead(buttonPin)==HIGH){
    analogWrite(RED, 0);
    analogWrite(BLUE, 0);
    analogWrite(GREEN, 255);
  

    int lettura = sonar.ping_cm();
    unsigned char i;
      if(lettura < distanza){ 
         digitalWrite(8,HIGH); 
         for(i=0;i<50;i++){
           digitalWrite(buzzer,HIGH);
           delay(150);//wait for 1ms
           digitalWrite(buzzer,LOW);
           delay(150);//wait for 1ms
          }
        }
       else digitalWrite(8,LOW);

  }
}

Sbaglio qualcosa nell’incolonnamento? Oppure nelle parentesi graffe che comprendono/non comprendono cose sbagliate?

Se mantieni premuto il pulsante il codice funziona? In effetti dovrebbe, così hai modo di testare se il valore della lettura è congruo per lo scopo che ti proponi.

Ciao, Ale.

Si, ho provato ed effettivamente se mantengo premuto il bottone, poi funziona anche il sensore ultrasuono.
Come potrei fare per fare in modo che non debba tenere premuto il pulsante?
Stavo pensando di usare magari una stringa come variabile che quando è "acceso" si attivi anche il sensore antifurto..ma non so se sia una grande idea...

intanto grazie :slight_smile:

ok credo di aver risolto, ho impostato una variabile:
int antifurto = 0
Dopo aver premuto il bottone, diventa antifurto=1.
A questo punto nel loop ho impostato un
if (antifurto > 0){
e poi viene attivato il sensore ad ultrasuono.

Così sta funzionando.

Bene! La soluzione era infatti quella, ma come vedi ci sei arrivato da solo. Ora pensa anche alla disattivazione, e rimetti antifurto a 0.

Ciao, Ale.