ARDUINO -Problemas com Código

C#

C

Lógica de programação

C++

19/05/2020

No Software Arduino, não se contra erros, porém, no Tinkercad, o LED n acende...

const int echoPin = 5; //DEFININDO PINO ECHO
const int trigPin = 4; //DEFININDO PINO TRIGGER
const int Buzzer = 3; //DEFININDO PINO BUZZER
const int Leda = 7; //DEFININDO PINO LED LARANJA
const int Ledb = 6; //DEFININDO PINO LED VERMELHO
float distancia; //VARIÁVEL DO TIPO INTEIRO PARA GUARDAR A DISTANCIA
String result; //VARIÁVEL DO TIPO STRING PARA GUARDAR RESULTADO DO CALCULO
float tempo; 
void setup(){
  pinMode(echoPin, INPUT); //DEFINE O PINO COMO ENTRADA (RECEBE)
  pinMode(trigPin, OUTPUT); //DEFINE O PINO COMO SAIDA (ENVIA)
  Serial.begin(9600); //INICIALIZA A PORTA SERIAL
  pinMode(Buzzer, OUTPUT);//DEFINE O BUZZER COMO SAIDA(ENVIA)
  pinMode (Leda, OUTPUT); //DEFINE LED1 COMO SAIDA
  pinMode (Ledb, OUTPUT); //DEFINE LED2 COMO SAIDA
  }
void loop(){
  CalcDist(); // FAZ A CHAMADA DO MÉTODO PARA CALCULAR A DISTANCIA
  Serial.print("Distancia "); //IMPRIME O TEXTO NO MONITOR SERIAL
  Serial.print(result); ////IMPRIME NO MONITOR SERIAL A DISTÂNCIA MEDIDA
  Serial.println("cm"); //IMPRIME O TEXTO NO MONITOR SERIAL
  if(distancia >25){
    // Aciona o buzzer na frequencia relativa ao Dó em Hz
    tone(Buzzer,261);    
    // Espera um tempo para Desativar
    delay(200);
    //Desativa o buzzer
    noTone(Buzzer); 
    // Aciona o buzzer na frequencia relativa ao Ré em Hz   
    tone(Buzzer,293);             
    delay(200);    
    noTone(Buzzer); 
    // Aciona o buzzer na frequencia relativa ao Mi em Hz
    tone(Buzzer,329);      
    delay(200);
    noTone(Buzzer);     
    // Aciona o buzzer na frequencia relativa ao Fá em Hz
    tone(Buzzer,349);    
    delay(200);    
    noTone(Buzzer); 
    // Aciona o buzzer na frequencia relativa ao Sol em Hz
    tone(Buzzer,392);            
    delay(200);
    noTone(Buzzer); 
    digitalWrite(Leda, LOW);
    delay(100);
    digitalWrite(Ledb,HIGH);
  }else{
    digitalWrite(Leda, HIGH);
    delay(100);
    digitalWrite(Ledb,LOW);
  }
}
//MÉTODO RESPONSÁVEL POR CALCULAR A DISTÂNCIA
void CalcDist(){
    
    digitalWrite(trigPin, HIGH); 
    delay(2); 
    digitalWrite(trigPin, LOW); 
    delay(10); 
    tempo = pulseIn(echoPin, HIGH); 
    digitalWrite(echoPin, LOW); 
    //CONTA PARA DESCOBRIR A DISTANCIA EM CM
    distancia = tempo / 29.4 / 2; //VARIÁVEL GLOBAL RECEBE O VALOR DA DISTÂNCIA MEDIDA
    result = String(distancia); //VARIÁVEL GLOBAL DO TIPO STRING RECEBE A DISTÂNCIA(CONVERTIDO DE INTEIRO PARA STRING)
    delay(100); //INTERVALO DE 500 MILISSEGUNDOS
}
Guilherme Dias

Guilherme Dias

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

19/05/2020

qual led não acende?
nos testes que eu fiz, só acende o Leda.
porque?
porque o valor retornardo por pulseIn(echoPin, HIGH) é muitíssimo baixo.
daí você pega esse retorno e divide por 29.4 e depois divide por 2. sempre será um numero igual a zero ou muito próximo de zero.
desta forma, sempre vai entrar no else.
  // esta condição nunca será atendida, ao menos na simulação do ThinkerCad
  // para entrar no if o retorno de pulseIn() precisa ser ao menos 1535 (1535/29.4/2=26)
  if (distancia >25) { 
    [....]
  }
  } else { // sempre vai entrar aqui, porque o valor retornado por pulseIn() é muito baixo
    digitalWrite(Leda, HIGH);
    delay(100);
    digitalWrite(Ledb,LOW);
  }

faça um teste utilizando números aleatórios e você verá que o código funciona. por exemplo:
const int echoPin = 5; //DEFININDO PINO ECHO
const int trigPin = 4; //DEFININDO PINO TRIGGER
const int Buzzer = 3; //DEFININDO PINO BUZZER
const int Leda = 7; //DEFININDO PINO LED LARANJA
const int Ledb = 6; //DEFININDO PINO LED VERMELHO
float distancia; //VARIÁVEL DO TIPO INTEIRO PARA GUARDAR A DISTANCIA
String result; //VARIÁVEL DO TIPO STRING PARA GUARDAR RESULTADO DO CALCULO
float tempo;
long randNumber; // VARIÁVEL QUE VAI RECEBER UM NÚMERO ALEATÓRIO

void setup(){
  pinMode(echoPin, INPUT); //DEFINE O PINO COMO ENTRADA (RECEBE)
  pinMode(trigPin, OUTPUT); //DEFINE O PINO COMO SAIDA (ENVIA)
  Serial.begin(9600); //INICIALIZA A PORTA SERIAL
  pinMode(Buzzer, OUTPUT);//DEFINE O BUZZER COMO SAIDA(ENVIA)
  pinMode (Leda, OUTPUT); //DEFINE LED1 COMO SAIDA
  pinMode (Ledb, OUTPUT); //DEFINE LED2 COMO SAIDA
  randomSeed(analogRead(0)); // INICIALIZA O GERADOR DE NÚMEROS PSEUDO-ALEATÓRIOS
}

void loop(){
  CalcDist(); // FAZ A CHAMADA DO MÉTODO PARA CALCULAR A DISTANCIA
  Serial.print("Distancia "); //IMPRIME O TEXTO NO MONITOR SERIAL
  Serial.print(result); ////IMPRIME NO MONITOR SERIAL A DISTÂNCIA MEDIDA
  Serial.println("cm"); //IMPRIME O TEXTO NO MONITOR SERIAL
  if (distancia > 25) {
    // Aciona o buzzer na frequencia relativa ao Dó em Hz
    tone(Buzzer,261);    
    // Espera um tempo para Desativar
    delay(200);
    //Desativa o buzzer
    noTone(Buzzer); 
    // Aciona o buzzer na frequencia relativa ao Ré em Hz   
    tone(Buzzer,293);             
    delay(200);    
    noTone(Buzzer); 
    // Aciona o buzzer na frequencia relativa ao Mi em Hz
    tone(Buzzer,329);      
    delay(200);
    noTone(Buzzer);     
    // Aciona o buzzer na frequencia relativa ao Fá em Hz
    tone(Buzzer,349);    
    delay(200);    
    noTone(Buzzer); 
    // Aciona o buzzer na frequencia relativa ao Sol em Hz
    tone(Buzzer,392);            
    delay(200);
    noTone(Buzzer); 
    digitalWrite(Leda, LOW);
    delay(100);
    digitalWrite(Ledb,HIGH);
  } else {
    digitalWrite(Leda, HIGH);
    delay(100);
    digitalWrite(Ledb,LOW);
  }
}
//MÉTODO RESPONSÁVEL POR CALCULAR A DISTÂNCIA
void CalcDist(){
    digitalWrite(trigPin, HIGH); 
    delay(2); 
    digitalWrite(trigPin, LOW); 
    delay(10); 
    tempo = pulseIn(echoPin, HIGH); 
    randNumber = random(2000); // OBTÉM UM NÚMERO ALEATÓRIO DE 0 A 2000.
    digitalWrite(echoPin, LOW); 
    //CONTA PARA DESCOBRIR A DISTANCIA EM CM
    distancia = randNumber / 29.4 / 2; //VARIÁVEL GLOBAL RECEBE O VALOR DA DISTÂNCIA MEDIDA - UTILIZA randNumber NO LUGAR DE tempo
    result = String(distancia); //VARIÁVEL GLOBAL DO TIPO STRING RECEBE A DISTÂNCIA(CONVERTIDO DE INTEIRO PARA STRING)
    delay(100); //INTERVALO DE 100 MILISSEGUNDOS
}

note que a tua rotina está praticamente intacta.
somente fiz o tratamento do número aleatório e alterei o cálculo da distância, de modo a usar o conteúdo de randNumber.

OBS: isso tudo supondo que as conexões estejam corretas no ThinkerCad.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/05/2020

pequena correção:
// para entrar no if o retorno de pulseIn() precisa ser ao menos 1471 (1471/29.4/2=25.017)
não reparei que distancia é float.
GOSTEI 0
POSTAR