Ir ao conteúdo
  • Cadastre-se

Arduino Controle Rele por Sensor Ultrassônico


MicSG

Posts recomendados

  • Membro VIP

Olá.

Estou fazendo uns testes com um módulo rele e um sensor ultrassônico HC-SR04.

O rele só é acionado se a distância entre o sensor ultrassônico e o obstáculo for menor que 10 centímetros. Neste caso, o relé é acionado por 2 segundos(eu utilizei a função delay).

Veja o código:

 /*
   Controle Rele por Sensor Ultrassônico
   
   Criado por Michel Galvão
   em 17/09/2020
  
  */
//Carrega a biblioteca do sensor ultrassonico
#include <Ultrasonic.h>
 
//Define os pinos para o trigger e echo
#define pino_trigger 4
#define pino_echo 5

//Define o pino para o Rele
#define pin_rele 7

//Distância de referência para acionamento do rele
float valor_ref_rele = 10.0;

//Inicializa o sensor nos pinos definidos acima
Ultrasonic ultrasonic(pino_trigger, pino_echo);
 
void setup()
{
  //Inicializa Cmunicação Serial
  Serial.begin(9600);
  //Escreve mensagem no Monitor Serial
  Serial.println("Lendo dados do sensor...");

  //Define pino do Rele
  pinMode(pin_rele, OUTPUT);

  //Deixa o pino do Rele ligado
  digitalWrite(pin_rele, HIGH);//com estado HIGH,o rele é desativado.
}
 
void loop()
{
  
  //Le as informações do sensor em cm
  float cmMsec;

  long microsec = ultrasonic.timing();
  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);

  //Se distancia lida do sensor Ultrassônico for MENOR que o valor de referencia do rele(definido no inicio do código)
  if(cmMsec<valor_ref_rele){
    //Ativa o rele
    digitalWrite(pin_rele, LOW);

    //Tempo para manter o rele ativado
  delay(2000);
    }
    //Se não
  else{
    //Desativa o Rele
    digitalWrite(pin_rele, HIGH);
  }
  
  //Exibe informações no serial monitor
  Serial.print("Distancia em cm: ");
  Serial.print(cmMsec);
  
  }
  

Deu certo.

Agora, eu quero tirar o delay, para o resto do código continuar a 'andar' sem pausas, ainda mantendo a tempo de acionamento do rele por 2 segundos.

 

Desde já agradeço.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@MicSG ,

 

A melhor maneira é habilitar a interrupção do Timer1, e criar um contador dentro dela, e quando atingir a contagem equivalente a 2 segundos, sinalizar um flag no programa principal.

por exemplo uma interrupção a cada 10 milisegundos a contagem tem de atingir 200 ...

 

Infelizmente não sei fazer nessa linguagem .... aguarde alguma dica !

 

Paulo

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Corroboro Paulão. O legal é você vai ser introduzido ao conceito de interrupção quando literalmente o mc interrompe o que está fazendo pra fazer outra tarefinha e depois volta onde estava. A interrupt a grosso modo é como se fosse outro mc. A dica prática é que nunca faça tarefas demoradas na interrupt pra não comprometer o andamento ou temporizações do loop principal e eventualmente outras interrupts.

 

Penso que com poucos cliques em timer interrupt arduino você pode dar grandes saltos e na sequencia, ensinar Paulão kk. Depois aprenda e ensine DMA pra mim.😁

  • Curtir 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

52 minutos atrás, if. disse:

 

O legal é você vai ser introduzido 

 

Penso que com poucos cliques em timer interrupt arduino você pode dar grandes saltos e na sequencia, ensinar Paulão kk. Depois aprenda e ensine DMA pra mim.😁

 

Reparei que você adora usar as palavras  Introdução e Ser Introduzido... presumo que deve ser alguma coisa que lhe deixou marcas profundas .....

 

Sobre DMA, eu estudei isso em 1986 pois as memórias do IBM-PC eram dinâmicas e o refresh dos dados era feito por DMA ... e confesso que depois disso nunca precisei usar isso até hoje kkkkk


Mas sei que a nova geração de Attinys possuem DMA acionado por periféricos,

como o conversor A/D e até os Timers, embora também não faço a mínima ideia de como utilizar isso de modo prático .... e se tem nos novos Attinys, com certeza tem nos novos Pics também ...

 

Será que vamos usar isso algum dia ?


Quanto a me ensinar a programar em C ou coisa parecida .... esquece que meu QI não consegue entender isso .... prefiro 1000 vezes fazer em Assembly e 100.000 vezes em Basic !

Cachorro velho não aprende truque novo kkkkk !

 

Estamos ficando obsoletos, minha cara colega de Fórum ....

 

Paulo

  • Curtir 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Paulão você decide o lance da introdução, afinal já passou por isso kk.

 

Num post que publiquei "agora há pouco" ...

sugeri a leitura do artigo https://www.artekit.eu/vga-output-using-a-36-pin-stm32/

onde o autor mostra uma utilidade prática curiosa do bicho dma. Algo como o periférico (spi) acessa o conteúdo da memória sem a cpu saber e nem se importar. A ela cabe apenas escrever ou desenhar os bytes na ram que o spi se vira pra serializar coerentemente.

Como disse lá, tenho a quasiséria intenção de fazer um trem daquele só que o fonte do cara ta chato de entender - não é nada minimalista: minha filosofia -  e pretendo usar outro compilador e outro mc. Pra isso tenho que entender direitin o que se passa na cabeça do mc - ou do sistema - a cada momento. Mas 1º... vou ter que piscar um led via dma

10 horas atrás, aphawk disse:

Cachorro velho não aprende truque novo

de fato kk.. estou a dias tentando entender java e poo. Não captei o poo ainda mas já fiz um programinha em java e deu certo!! Em breve, caso apareça no contexto de algum tópico, posso compartilhar. Programinha bacaninha e 100% original que criei nos anos 80 ... em basic! 😁

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

hahahahha, forum está bem humorado hj
Sobre a dúvida. Eu resolveria com uma variável global controlando. Tem 2 formas. Quando o evento é ativo, tu coloca o valor da função milis nela e desliga quando o milis atual for 2000 > milis. A segunda é quando o evento for ativo pela 1ª vez atribui 0 a esta varíavel, e a cada ciclo vai incrementando. Quando chegar a 2000 tu desliga.
O legal dessa segunda, é que caso você prefira, pode fazer que esses 2 segundos possam ser resetados enquanto o evento estiver ativo. (tipo, o relé irá desligar 2 segundo, depois que você tirar a mão de perto do sensor ultrasônico.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...