Sensor de distância Ultrasonic com LED's

Seguinte galera, to enfrentando um problema com o código, quando usei if else, ele le a distancia certa, e em seguida le 0, e fica algo tipo :
ex-

0
20
0
20
0
21
0
22
0
20

assim, estou tentando usar o switch case, mas estou encontrando o problema___ “tent_ultrassonico_distancia_led:96: error: ‘distancia’ cannot appear in a constant-expression”___

se alguem poder me ajudar!

CÓDIGO:

// Projeto : Sequencial de Leds com potenciometro
// Baseado no projeto sequencial de leds do Livro Arduino Basico - Autor Michael Roberts
// Alterações : Arduino & Cia
#include “Ultrasonic.h”
#define echoPin 3 //Pino 13 recebe o pulso do echo
#define trigPin 2 //Pino 12 envia o pulso para gerar o echo
//iniciando a função e passando os pinos
Ultrasonic ultrasonic(12,13);
byte ledPin={4,5,6,7,8,9,10,11,12,13}; //Cria um array para os pinos dos Leds
int ledDelay; // Intervalo entre as alterações
int direcao = 1; // Direcao do “movimento”
int ledatual = 0;
;

void setup()
{
pinMode(echoPin, INPUT); // define o pino 3 como entrada (recebe)
pinMode(trigPin, OUTPUT); // define o pino 2 como saida (envia)
Serial.begin(9600); // Inicializa a comunicacao serial
for (int x=0; x<10; x++) // Loop que define todos os pinos como saída
{
pinMode(ledPin,OUTPUT);
}

}

void loop()
{

//seta o pino 12 com um pulso baixo “LOW” ou desligado ou ainda 0
digitalWrite(trigPin, LOW);
// delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto “HIGH” ou ligado ou ainda 1
digitalWrite(trigPin, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin, LOW);
// função Ranging, faz a conversão do tempo de
//resposta do echo em centimetros, e armazena
//na variavel distancia
int distancia = (ultrasonic.Ranging(CM));

Serial.print("Distancia em CM: ");
Serial.println(distancia);
delay(1000); //espera 1 segundo para fazer a leitura novamente

switch (distancia) {

case ( distancia <=10 ):

for (int x=0; x<10 ; x++) {
digitalWrite(ledPin, HIGH);
delay(50);
}
break;

case (( distancia >10 ) && (distancia <= 20)):
funcum();
break;

case (( distancia >20 ) && (distancia <= 30)):
funcdois();
break;

case (( distancia >30 ) && (distancia <= 40)):
functres();
break;

case (( distancia >40 ) && (distancia <= 50)):
funcquatro();
break;

case (( distancia >50 ) && (distancia <= 60)):
funccinco();
break;

case (( distancia >60 ) && (distancia <= 70)):
funcseis();
break;

case (( distancia >70 ) && (distancia <= 80)):
funcsete();
break;

case (( distancia >80 ) && (distancia <= 90)):
funcoito();
break;

case (( distancia >90 ) && (distancia <= 100)):
funcnove();
break;

default :
for (int x=0; x<10 ; x++) {
digitalWrite(ledPin, LOW);
delay(50);

}
}
}

void funcum() {
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[4], HIGH);
digitalWrite(ledPin[5], HIGH);
digitalWrite(ledPin[6], HIGH);
digitalWrite(ledPin[7], HIGH);
digitalWrite(ledPin[8], HIGH);
digitalWrite(ledPin[9], LOW);
}

void funcdois() {
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[4], HIGH);
digitalWrite(ledPin[5], HIGH);
digitalWrite(ledPin[6], HIGH);
digitalWrite(ledPin[7], HIGH);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void functres(){
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[4], HIGH);
digitalWrite(ledPin[5], HIGH);
digitalWrite(ledPin[6], HIGH);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void funcquatro(){
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[4], HIGH);
digitalWrite(ledPin[5], HIGH);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void funccinco(){
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[4], HIGH);
digitalWrite(ledPin[5], LOW);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void funcseis(){
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], HIGH);
digitalWrite(ledPin[4], LOW);
digitalWrite(ledPin[5], LOW);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void funcsete(){
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], HIGH);
digitalWrite(ledPin[3], LOW);
digitalWrite(ledPin[4], LOW);
digitalWrite(ledPin[5], LOW);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void funcoito(){
digitalWrite(ledPin[0], HIGH) ;
digitalWrite(ledPin[1], HIGH);
digitalWrite(ledPin[2], LOW);
digitalWrite(ledPin[3], LOW);
digitalWrite(ledPin[4], LOW);
digitalWrite(ledPin[5], LOW);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

void funcnove(){
digitalWrite(ledPin[0], HIGH);
digitalWrite(ledPin[1], LOW);
digitalWrite(ledPin[2], LOW);
digitalWrite(ledPin[3], LOW);
digitalWrite(ledPin[4], LOW);
digitalWrite(ledPin[5], LOW);
digitalWrite(ledPin[6], LOW);
digitalWrite(ledPin[7], LOW);
digitalWrite(ledPin[8], LOW);
digitalWrite(ledPin[9], LOW);
}

assim, estou tentando usar o switch case, mas estou encontrando o problema___ “tent_ultrassonico_distancia_led:96: error: ‘distancia’ cannot appear in a constant-expression”___

Porque estas a implementar mal o switch
tu tens:

switch (distancia) {

case ( distancia <=10 ):

for (int x=0; x<10 ; x++) {
digitalWrite(ledPin

, HIGH);

delay(50);
}
break;

O correcto é:

switch (distancia) { 

  case (1 ):
{
   for (int x=0; x<10 ; x++)
    {
   digitalWrite(ledPin , HIGH);
   delay(50);
   }
}
  case (2):
{
   for (int x=0; x<10 ; x++)
    {
   digitalWrite(ledPin , HIGH);
   delay(50);
   }
}
  break;

mas como o arduino vai saber o que é o case 1 ou 2?

mas como o arduino vai saber o que é o case 1 ou 2?

Quando o teu switch é corrido é avaliado o que esta dentro da variavel, no teu caso a variavel distancia.Ai dependendo do valor ira ser executado o case correspondente a esse valor.
Olhando ao tu codigo da forma que o tens devias trocar o switch por if's

eu fiz com if, mas não obtenho uma leitura legal, fica oscilando demais os valores.

eu fiz com if, mas não obtenho uma leitura legal, fica oscilando demais os valores.

Entao isso quer dizer que a tua distancia esta a oscilar demais.A culpa nao esta no if
Ja tentaste fazer apenas um serial.println(distancia); para veres os valores ao longo do tempo?

Eu tive alguns problemas com oscilação também. E meu problema foi fazer leituras do sensor seguidamente. Resolvi o problema colocando um código para esperar algo em torno de 100ms entre cada leitura. Assim os valores ficaram estabilizados.

Outra boa tática que estou usando, é efetuar 3 leituras, para tirar a distancia média entre os valores. Assim, o sistema fica praticamente sem falhas.

Abraços,

HugoPT:

switch (distancia) { 

case (1 ):
{
   for (int x=0; x<10 ; x++)
    {
   digitalWrite(ledPin , HIGH);
   delay(50);
   }
break; // nao te faltou isto??? :stuck_out_tongue: lol
}
  case (2):
{
   for (int x=0; x<10 ; x++)
    {
   digitalWrite(ledPin , HIGH);
   delay(50);
   }
}
  break;

que possiveis motivos podem ser do sensor utrassonico ficar captando 0cm de distancia sempre?

switch (distancia) {

case (1 ):
{
for (int x=0; x<10 ; x++)
{
digitalWrite(ledPin , HIGH);
delay(50);
}
break; // nao te faltou isto??? :stuck_out_tongue: lol
}

Sim faltou :grin: :grin:

O facto de usares os mesmos pinos como sensor ultrasonico e saida para LEDS pode ter algo a ver…

Ultrasonic ultrasonic([b]12,13[/b]);
byte ledPin[]={4,5,6,7,8,9,10,11,[b]12,13[/b]}; //Cria um array para os pinos dos Leds

essa dos pinos eu ja havia corrigido, deixe no 2 e 3.

E verificaste para ver se o codigo bate certo com o esquema?

Importas-te de colocar aqui a ultima versao do codigo?
Eu vi que tu definiste os pinos 2 e 3... mas nunca disseste ao Ultrasonic que estavas a usar os pinos 2 e 3...