HC -SR04

Ciao a tutti, sto usando un sensore ad ultrasuoni HC-SR04 insieme ad un buzzer per creare un theremin.
Lo scopo del progetto è quello di utilizzare il sensore per stabilire l'altezza delle note e far uscire il suono ovviamente dal buzzer.
Vorrei sapere come posso stabilire il range del sensore per fare in modo che prima e dopo determinati centimetri misurati il buzzer non emetta alcun suono.

per esempio così

limiteMax = 80;    // imposto i cm massimi
void loop() {
....
....
   if (centimetri >= limiteMax) {
      noTone(pinBuzzer);
   }
}

oppure usi switch

Questo è tutto il codice, solo che il buzzer fa un casino, non cambia nota e non smette mai di suonare.
Sapreste dirmi cosa ho sbagliato?

int triggerPort = 7; //porta trigger al pin 7
int echoPort = 6; //porta echo al pin 6
long durata;
long distanza;
int buzzer = 8; //buzzer al pin 8
int portata = 80; //cm più alti con suono
int sensibilita = 6; //cm più bassi con suono

//frequenza note
int do3 = 131;
int re3 = 147;
int mi3 = 165;
int fa3 = 175;
int sol3 = 196;
int la3 = 220;
int si3 = 247;
int do4 = 262;
int re4 = 294;
int mi4 = 330;
int fa4 = 349;
int sol4 = 392;
int la4 = 440;
int si4 = 494;
int do5 = 523;

void setup() {
pinMode(triggerPort, OUTPUT);  //il trigger è un output
pinMode(echoPort, INPUT);  //l'echo è un input
pinMode(buzzer,OUTPUT); //il pin del buzzer è un output
Serial.begin(9600);
}

void loop() {
  //misurazione distanza
digitalWrite(triggerPort, LOW); //spengi il pin trigger
digitalWrite(triggerPort, HIGH); //accendi il pin trigger
delayMicroseconds(10);
digitalWrite(triggerPort, LOW); //spegni il pin trigger
durata = pulseIn( echoPort, HIGH ); //la durata è uguale alla misura effettuata dalla porta echo
distanza = 0.034*durata/2; //la distanza è uguale alla durata * la costante 0.034 /2 perchè altrimenti si misura sia l'andata che il ritorno

suono(); //dopo aver misurato la distanza passa al metodo suono()

 //stampare distanza sul monitor seriale
Serial.print("Distanza misurata: ");
Serial.print(distanza); 
Serial.println("cm");
delay(1000);
}


//metodo buzzer
void suono(){
  
  if (distanza < sensibilita) //se la distanza è minore di 5 il buzzer non emette alcun suono
    noTone(buzzer);

  if (distanza > portata) //se la distanza è maggiore di 80 il buzzer non emette alcun suono
    noTone(buzzer);

  //sezione 3
  if ((distanza >=6) ^ (distanza <= 40)) //se la distanza si trova tra 6 e 40
  {
    if ((distanza >=6) ^ (distanza <= 10)) //do3
      tone(buzzer,do3);

    if ((distanza >=11) ^ (distanza <= 15)) //re3
      tone(buzzer,re3);

    if ((distanza >=16) ^ (distanza <= 20)) //mi3
      tone(buzzer, mi3);

    if ((distanza >=21) ^ (distanza <= 25)) //fa3
      tone(buzzer,fa3);

    if ((distanza >=26) ^ (distanza <= 30)) //sol3
      tone(buzzer,sol3);

    if ((distanza >=31) ^ (distanza <= 35)) //la3
      tone(buzzer,la3);

    if ((distanza >=36) ^ (distanza <= 40)) //si3
      tone(buzzer,si3);
  }

  //sezione 4
  if ((distanza >=41) ^ (distanza <= 75)) //se la distanza si trova tra 41 e 75
  {
    if ((distanza >=41) ^ (distanza <= 45)) //do4
      tone(buzzer,do4);

    if ((distanza >=46) ^ (distanza <= 50)) //re4
      tone(buzzer,re4);

    if ((distanza >=51) ^ (distanza <= 55)) //mi4
      tone(buzzer, mi4);

    if ((distanza >=56) ^ (distanza <= 60)) //fa4
      tone(buzzer,fa4);

    if ((distanza >=61) ^ (distanza <= 65)) //sol4
      tone(buzzer,sol4);

    if ((distanza >=66) ^ (distanza <= 70)) //la4
      tone(buzzer,la4);

    if ((distanza >=71) ^ (distanza <= 75)) //si4
      tone(buzzer,si4);
  }

  //sezione 5
  if ((distanza >=76) ^ (distanza <= 80)) //do5
    tone(buzzer,do5);
}

umbertozinfollino:
Questo è tutto il codice, solo che il buzzer fa un casino, non cambia nota e non smette mai di suonare.
Sapreste dirmi cosa ho sbagliato?

Direi questo:

if ((distanza >=6) ^ (distanza <= 40))

L’operatore “^” non è mica l’operatore giusto, quello è un operatore XOR bitwise (ossia opera sui singoli bit degli operandi)!
L’operatore booleano (logico, quindi solo vero/falso) OR è “||” ma nel tuo caso ti serve un AND (come hai anche scritto nel commento “se la distanza si trova tra 6 e 40”) ossia “&&”.
Devi cambiare quei “^” con “&&”:

if ((distanza >=6) && (distanza <= 40))

PS: comunque io gli HC-SR04 non li uso più da anni, sono molto spesso fallati (es. iniziano a dare distanza zero quando non ci sono ostacoli, e restano a zero fino a che non li resetti!).
Se ti capita, prendi gli SRF05.

Si, giusto!
Il progetto ora funziona, grazie mille :slight_smile: