#define ULTRASONIC_TRIG_PIN 11 // pin TRIG è D11
#define ULTRASONIC_ECHO_PIN 12 // pin ECHO è D12
#define BUZZER_PIN 9 // Pin collegato al buzzer
volatile float distance = 100;
volatile uint16_t soundIntensity = 1000;
volatile bool soundState = false;
void setup() {
// Inizializza la comunicazione seriale
Serial.begin(9600);
// Imposta il pin TRIG come output e il pin ECHO come input
pinMode(ULTRASONIC_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
// Imposta il pin del buzzer come output
pinMode(BUZZER_PIN, OUTPUT);
// Configura Timer1
cli(); // Disabilita gli interrupt globali
// Configura il Timer1 per il normal mode, prescaler a 1024
TCCR1A = 0; // Nessuna configurazione speciale per il registro A
TCCR1B = 0; // Nessuna configurazione speciale per il registro B
TCCR1B |= (1 << CS12) | (1 << CS10); // Imposta prescaler a 1024
TIMSK1 |= (1 << TOIE1); // Abilita l'interrupt del Timer1 per overflow
sei(); // Abilita gli interrupt globali
}
ISR(TIMER1_OVF_vect) {
if(distance > 200) {
soundState = false;
digitalWrite(BUZZER_PIN, LOW); // Assicurati che il buzzer sia spento
}
if(distance > 10 && distance < 20) {
soundIntensity = 1000;
soundState = true;
}
if(distance > 6 && distance < 10) {
soundIntensity = 100;
soundState = true;
}
if(distance < 5) {
soundIntensity = 10;
soundState = true;
}
if(soundState) {
digitalWrite(BUZZER_PIN, HIGH);
delayMicroseconds(soundIntensity * 10); // Imposta un piccolo delay per generare un suono intermittente
digitalWrite(BUZZER_PIN, LOW);
}
}
void loop() {
// Pulisci il pin TRIG impostandolo a LOW
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
delayMicroseconds(2);
// Imposta il pin TRIG su HIGH per 10 microsecondi per inviare l'impulso ultrasonico
digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
// Legge il tempo in cui l'eco viene ricevuto
long duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
// Calcola la distanza
distance = (duration / 2.0) * 0.0343;
// Stampa la distanza sul Serial Monitor
Serial.print("Distanza: ");
Serial.print(distance);
Serial.println(" cm");
// Piccola pausa prima della prossima misurazione
delay(100);
}