Problema per programare macchina Lego con due sensori

Buongiorno,
grazie per il vostro forum.
Ho problemi programmare un'automobile Lego con due sensori.
I due sensori sono un rilevatore d'ostacoli e un microfono.
La macchina dovrebbe avanzare e poi fermarsi quando incontra un'ostacolo. A quel punto si ferma fa marcia indietro ed aspetta l'indicazione del microfono. Un colpo gira a destra, due colpi gira a sinistra e poi la macchina prosegue in avanti.
Ho creato il codice che fa tutte le funzioni singolarmente ma non riesco a fare tutte le operazioni in serie. Allego il codice e chiedo se cortesemente qualcuno può aiutarmi.

// Definizione dei pin
const int motorIn3 = 10;     // Pin IN3 del ponte H per il motore
const int motorIn4 = 11;     // Pin IN4 del ponte H per il motore
const int soundPin = A2;     // Pin microfono
const int distanceSensor = A0; // Pin sensore di distanza
const int in1 = 8;           // Pin IN1 del ponte H per il servo
const int in2 = 9;           // Pin IN2 del ponte H per il servo

// Soglie e variabili
const int threshold = 200;    // Soglia per rilevamento battiti
const int obstacleThreshold = 200; // Soglia per rilevare l'ostacolo
int battiti = 0;
unsigned long ultimoBattito = 0;
unsigned long battitoDelay = 2000;  // Intervallo per rilevare battiti multipli
bool ostacoloTrovato = false;

void setup() {
 Serial.begin(9600);
 pinMode(motorIn3, OUTPUT);
 pinMode(motorIn4, OUTPUT);
 pinMode(soundPin, INPUT);
 pinMode(in1, OUTPUT);
 pinMode(in2, OUTPUT);
 pinMode(distanceSensor, INPUT);

 // Avvio iniziale del movimento
 moveForward();
}

// Funzioni per il controllo dei motori
void moveForward() {
 digitalWrite(motorIn3, HIGH);
 digitalWrite(motorIn4, LOW);
 Serial.println("Avanti");
}

void moveBackward() {
 digitalWrite(motorIn3, LOW);
 digitalWrite(motorIn4, HIGH);
 Serial.println("Indietro");
}

void stopMotors() {
 digitalWrite(motorIn3, LOW);
 digitalWrite(motorIn4, LOW);
 Serial.println("Motori fermi");
}

// Funzioni per il controllo del servo
void rotateRight() {
 digitalWrite(in1, HIGH);
 digitalWrite(in2, LOW);
 Serial.println("Servo ruota a destra");
 delay(3000);  // Mantiene la rotazione per 3 secondi
 stopServo();
}

void rotateLeft() {
 digitalWrite(in1, LOW);
 digitalWrite(in2, HIGH);
 Serial.println("Servo ruota a sinistra");
 delay(3000);  // Mantiene la rotazione per 3 secondi
 stopServo();
}

void stopServo() {
 digitalWrite(in1, LOW);
 digitalWrite(in2, LOW);
 Serial.println("Servo fermo");
}

// Funzione per rilevare i battiti di mani
void detectClaps() {
 int soundsens = analogRead(soundPin);

 if (soundsens >= threshold) {
   unsigned long tempoCorrente = millis();

   // Se è passato abbastanza tempo dall'ultimo battito
   if (tempoCorrente - ultimoBattito > battitoDelay) {
     battiti = 1;
     ultimoBattito = tempoCorrente;
     Serial.println("Primo battito rilevato");

     delay(500);  // Attesa breve per il secondo battito
     soundsens = analogRead(soundPin);
     if (soundsens >= threshold) {
       battiti = 2;
       Serial.println("Secondo battito rilevato");
     }
   }
 }
}

void loop() {
 detectClaps(); // Rileva i battiti

 int distance = analogRead(distanceSensor); // Lettura del sensore di distanza

 if (distance < obstacleThreshold) {  // Ostacolo rilevato
   stopMotors();
   delay(5000); // Fermati per 5 secondi
   moveBackward(); // Va in retromarcia per 3 secondi
   delay(3000);
   stopMotors();
   ostacoloTrovato = true; // Indica che l'ostacolo è stato rilevato
 }

 if (ostacoloTrovato) {
   if (battiti == 1) {        // Un battito: svolta a destra
     rotateRight();
     moveForward(); // Continua a muoversi in avanti
     ostacoloTrovato = false; // Reset del flag ostacolo
   } else if (battiti == 2) { // Due battiti: svolta a sinistra
     rotateLeft();
     moveForward(); // Continua a muoversi in avanti
     ostacoloTrovato = false; // Reset del flag ostacolo
   } else {
     stopMotors(); // Se nessun battito, rimane fermo
   }
 } else {
   if (battiti == 1) {        // Un battito: svolta a destra
     rotateRight();
   } else if (battiti == 2) { // Due battiti: svolta a sinistra
     rotateLeft();
   } else {
     moveForward(); // Continua ad andare avanti
   }
 }

 battiti = 0;  // Reset del conteggio battiti
 delay(100);   // Ritardo per stabilizzare le letture
}

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink: