Projeto com Sensores Ultrassônico HC-SR04

Pessoal , esse e meu primeiro contato com o forum,
pesquisei muito mais não achei nada que me ajuda-se nesse problema.

decidi fazer um projeto com o Arduíno pois minha esposa teve um AVC (Acidente vascular cerebral), e esta em reabilitação, vi vários projetos no instagram que ajudam na reabilitação e decidi que iria tentar mesmo sem saber nada sobre programação, então se alguém poder ajudar, fico agradecido!

o projeto ao meu ver é simples, estou usando 3 LEDS e três Sensores hc-sr04, a ideia é o LED ligar e quando se aproximar do sensor correspondente o LED desligar e outro ligar automaticamente e aleatoriamente usando o randomSeed.

meu problema é que o comando Break do switch(usado em caso 1, caso 2 e caso 3) não funciona e quando alimento o Arduíno os LEDS ficam piscando aleatoriamente, onde era pra parar e esperar até o sensor reconhecer( nesse caso <20) .

desculpem se o código esta bagunçado, fiz ele apenas com informações que tinha na documentação de referencia aqui da pagina e poucos videos do youtube ( a maioria só ensina blink que não é o meu caso).

#define trig1 7
#define echo1 6
#define trig2 5
#define echo2 4
#define trig3 3
#define echo3 2
#define verde 11
#define amarelo 12
#define vermelho 13
#include<UltraDistSensor.h>
UltraDistSensor sensor1;
UltraDistSensor sensor2;
UltraDistSensor sensor3;
float reading;


void setup()

{ Serial.begin (9600);
  sensor1.attach(7, 6); //Trigger pin , Echo pin
  sensor2.attach(5, 4); //Trigger pin , Echo pin
  sensor3.attach(3, 2); //Trigger pin , Echo pin


  pinMode(trig1, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(trig2, OUTPUT);
  pinMode(echo2, INPUT);
  pinMode(trig3, OUTPUT);
  pinMode(echo3, INPUT);
  pinMode(verde, OUTPUT);
  pinMode(amarelo, OUTPUT); 
  pinMode(vermelho, OUTPUT);

  randomSeed(analogRead(A0));
}

void loop() {
  long duration, distance;
  int numero = random(30);
  int output;
  switch (numero) {
    case 1:

      digitalWrite(verde, HIGH);
      digitalWrite(amarelo, LOW);
      digitalWrite(vermelho, LOW);
      break;

      { long duration, distance;
        digitalWrite(trig1, LOW);
        delayMicroseconds(2);
        digitalWrite(trig1, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig1, LOW);
        duration = pulseIn(echo1, HIGH);
        distance = (duration / 2) / 29.1;
        if (distance < 20)
        { digitalWrite(verde, LOW);


        }
      }

    case 2:

      digitalWrite(verde, LOW);
      digitalWrite(amarelo, HIGH);
      digitalWrite(vermelho, LOW);
      break;

      { long duration, distance;
        digitalWrite(trig2, LOW);
        delayMicroseconds(2);
        digitalWrite(trig2, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig2, LOW);
        duration = pulseIn(echo2, HIGH);
        distance = (duration / 2) / 29.1;
        if (distance < 20)
        { digitalWrite(amarelo, LOW);

        }
      }
    case 3:
      { long duration, distance;

        digitalWrite(verde, LOW);
        digitalWrite(amarelo, LOW);
        digitalWrite(vermelho, HIGH);
        break;

        digitalWrite(trig3, LOW);
        delayMicroseconds(2);
        digitalWrite(trig3, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig3, LOW);
        duration = pulseIn(echo3, HIGH);
        distance = (duration / 2) / 29.1;
        if (distance < 20)
        { digitalWrite(vermelho, LOW);

        }

      }
  }
  reading = sensor1.distanceInCm();
  Serial.print("Sensor 1 Reading :");
  Serial.print(reading);
  Serial.println("Cm");
  reading = sensor2.distanceInCm();
  Serial.print("Sensor 2 Reading :");
  Serial.print(reading);
  Serial.println("Cm");
  reading = sensor3.distanceInCm();
  Serial.print("Sensor 3 Reading :");
  Serial.print(reading);
  Serial.println("Cm");

}

Sabes o que é que a instrução “break” faz??

infelizmente, pensei que sabia ...
imaginava que ele era usado pra sair do loop do switch/case.
como disse, nunca fiz programação alguma.

estou só tentando realizar o projeto pra ajudar na reabilitação neuro cognitiva da minha esposa
(o LED acender aleatório e ela ir com a mão para apagar) .
mesmo lendo a documentação de referencia é muito difícil entender.

Exemplo aleatório de como se usar o break.

switch (var) {
  case condicao1:
     _print_ "Condição 1";
    break;
  case condicao2:   
    break;
    _print_ "Condição 2" ;
  condicao3:
    _print_ "Condição 3";
  condicao4:
    _print_ "Condição 4";
    break;
}

Condicao1 e Condicao4 estão corretos.
Mas a 2 e a 3 possuem erros.
condicao2 nunca vai imprimir a frase.
condicao3 ira imprimir a frase da condicao3 e condicao4.

Não irei discorrer sobre o fato de existirem instâncias que estão {} sem um motivo aparente.

OBS.: print e um comando qualquer. Não e de fato um código compilável.

A tua definição de break está correcta, mas aplicaste de forma incorrecta.

Este código que tens:

switch (numero) {
    case 1:

      digitalWrite(verde, HIGH);
      digitalWrite(amarelo, LOW);
      digitalWrite(vermelho, LOW);
      break;

      { long duration, distance;
        digitalWrite(trig1, LOW);
        delayMicroseconds(2);
        digitalWrite(trig1, HIGH);
        delayMicroseconds(10);
        digitalWrite(trig1, LOW);
        duration = pulseIn(echo1, HIGH);
        distance = (duration / 2) / 29.1;
        if (distance < 20)
        { digitalWrite(verde, LOW);


        }
      }

Deveria ser escrito desta forma:

long duration, distance;

switch (numero) {
    case 1:

      digitalWrite(verde, HIGH);
      digitalWrite(amarelo, LOW);
      digitalWrite(vermelho, LOW);
      digitalWrite(trig1, LOW);
      delayMicroseconds(2);
      digitalWrite(trig1, HIGH);
      delayMicroseconds(10);
      digitalWrite(trig1, LOW);
      duration = pulseIn(echo1, HIGH);
      distance = (duration / 2) / 29.1;
      if (distance < 20)
        { digitalWrite(verde, LOW);}

fiz da forma como foi citado acima, mais quando carrego os LEDs continuam a piscar todos de uma vez,
meu desafio é encontrar uma forma de 1 LED acender por vez, sem a necessidade de 1 botão, pois me parece que o comando Switch precisa de um acionador pra funcionar, tentei utilizar o próprio sensor para acionar, mais mesmo assim os LEDS piscam sem parar assim que o Arduíno é alimentado.

muito obrigado pela ajuda ! continuo tentando

void loop() {

int numero = random(30);
  
        (digitalRead(trig1)<50);
         switch(numero){
     
    case 1:

Acho que se calhar tens de dividir um pouco o que pretendes fazer para ser mais simples de ver o que pode estar a correr mal.

Então eu sugeriria criares algumas funções que vão ser necessárias:

Esta função vai acender o LED que escolheres.

#define VERMELHO   0
#define AMARELO     2
#define VERDE         1
char estado[3] = {0,0,0}; 
char pinos[3] = {13, 11, 12};

void acendeLED(int LED) {
  if (LED == VERMELHO) estado[0] = 1; 
  if (LED == VERDE) estado[1] = 1; 
  if (LED == AMARELO) estado[2] = 1; 

  for (int i = 0; i < 3; i++) {
     digitalWrite(pinos[i], estado[i]);
     }
}

Para acender o LED fazes:

acendeLED(VERMELHO); 
acendeLED(AMARELO);
acendeLED(VERDE);

Como quando ligas um tens de desligar o outro, não precisas de mais nada.

Depois necessitas duma função para detectar se a mão está num certo sítio.
Eu aconselharia a tentares a biblioteca NewPing (dá para instalar directamente da IDE do Arduino).

Quando instalares precisas de fazer isto:

//definir isto fora de todas as funções

#define SONAR_NUM 3      // Number of sensors.
#define MAX_DISTANCE 20 // Maximum distance (in cm) to ping.

NewPing sonar[SONAR_NUM] = {   // Sensor object array.
  NewPing(7, 6, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping. 
  NewPing(5, 4, MAX_DISTANCE), 
  NewPing(3, 2, MAX_DISTANCE)
};

Para saberes a distância a que algo está do sonar, fazes isto:

sonar[VERMELHO].ping_cm();
sonar[VERDE].ping_cm();
sonar[AMARELO].ping_cm();

Depois para juntares tudo…

#include <NewPing.h>

//defines necessários

#define SONAR_NUM    3      // Number of sensors.
#define MAX_DISTANCE 20 // Maximum distance (in cm) to ping.
#define VERMELHO     0
#define AMARELO      2
#define VERDE        1

#define trig1 7
#define echo1 6
#define trig2 5
#define echo2 4
#define trig3 3
#define echo3 2

//variáveis necessárias. 

char estado[3] = {0,0,0};
char pinos[3] = {13, 11, 12};
int distancias[3] = {0,0,0};

//definição dos teus sonares. 
NewPing sonar[SONAR_NUM] = {   // Sensor object array.
NewPing(trig1, echo1, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
NewPing(trig2, echo2, MAX_DISTANCE),
NewPing(trig3, echo3, MAX_DISTANCE)};



void acendeLED(int LED) {
  if (LED == VERMELHO) estado[0] = 1;
  if (LED == VERDE) estado[1] = 1;
  if (LED == AMARELO) estado[2] = 1;

  for (int i = 0; i < 3; i++) {
    digitalWrite(pinos[i], estado[i]);
    }
}

void setup() {
  Serial.begin(19200); 
  pinMode(trig1, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(trig2, OUTPUT);
  pinMode(echo2, INPUT);
  pinMode(trig3, OUTPUT);
  pinMode(echo3, INPUT);
  pinMode(pinos[VERDE], OUTPUT);
  pinMode(pinos[AMARELO], OUTPUT);
  pinMode(pinos[VERMELHO], OUTPUT);

  randomSeed(analogRead(A0));
//começar o exercício com o Vermelho
  acendeLED(VERMELHO); 
}

void loop(){
  unsigned char novo = 4; 
//saber as distâncias de todos os sensores. 
for (int j = 0; j < 3; j++) {
   distancias[j] = sonar[j].ping_cm();
}
//comparar a distância recebida com o LED aceso. 
for (int c = 0; c < 3; c++) {
  //se o LED estiver aceso e a distância for menor que 5 cm
  if (estado[c] == 1 && distancias[c] < 5) {
    Serial.println("estado mudou"); 
    //acende um novo LED aleatório entre 0 e 2
    acendeLED(random(0,2)); 
    break; //escusamos de completar o teste. 
    }
  }
}//end loop

o código compila, mas pode e provavelmente tem erros mas em termos de lógica deve estar muito próximo.