ARDUINO -Problemas com Código
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
Curtidas 0
Respostas
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.
faça um teste utilizando números aleatórios e você verá que o código funciona. por exemplo:
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.
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
19/05/2020
pequena correção:
não reparei que distancia é float.
// para entrar no if o retorno de pulseIn() precisa ser ao menos 1471 (1471/29.4/2=25.017)
GOSTEI 0