06 dezembro 2013

Controle de vagas de estacionamento com o sensor HC-SR04

Esse post surgiu da pergunta de um leitor no post Medidor de distância com o sensor ultrassônico HC-SR04. Ele questionou se era possível controlar 2 sensores HC-SR04 usando a biblioteca Ultrasonic.h, uma das mais comuns para quem usa esse tipo de sensor.

Eu tive o mesmo problema ao montar um projeto de faculdade, que consistia em criar um controle de vagas de estacionamento, como esses utilizados em shopping center, onde uma luz vermelha indica que a vaga está ocupada, e uma luz verde indica vaga livre.

Controle de vagas - Shopping

Claro que a tecnologia utilizada nos shoppings é muito mais complexa, fazendo uso até mesmo de câmeras para controlar as vagas, mas a ideia é a mesma, e não tão difícil de implementar com o Arduino, como vocês poderão ver agora.

Meu (modesto) projeto controla 2 vagas de estacionamento, com os respectivos leds indicando vaga livre/vaga ocupada, e um display LCD que mostra as informações sobre as vagas (total livres/ocupadas).

Em primeiro lugar, eu tentei usar a biblioteca Ultrasonic.h, sem sucesso. Talvez alguma alteração na biblioteca ou algum parâmetro que eu desconheço me ajudassem na tarefa, mas optei por procurar outra versão ou alguma outra biblioteca que fosse mais flexível.

Acabei encontrando a biblioteca NewPing, que torna possível o controle de até 15 sensores HC-SR04. Com essa biblioteca, o meu modesto projeto de apenas 2 vagas pode ser expandido. ;-)

Utilizei um Arduino Mega para poder ligar todos os componentes, já que o LCD utiliza 6 portas, cada HC-SR04 mais 2 portas cada, e os leds bicolores, mais 2 portas cada. Com alguns ajustes, isso pode ser montado tranquilamente com um Arduino Uno.

Para a sinalização das vagas, utilizei no circuito 2 leds bicolores, que podem ser substituídos por 4 leds comuns. A ligação do display 16x2 segue o mesmo esquema deste artigo , que já usei em diversos projetos aqui no Arduino e Cia :

Circuito Controle de vagas sensor ultrasonico HC-SR04
Antes de carregar o programa, não esqueça de baixar a biblioteca NewPing, nesse link. Descompacte e copie a pasta NewPing para dentro da pasta LIBRARIES, dentro da IDE do Arduino.

No início do programa são definidas as variáveis que irão armazenar o número de sensores utilizados (SONAR_NUM), a distância máxima de detecção (MAX_DISTANCE), e o intervalo entre as medições (PING_INTERVAL), que não pode ser muito baixo para que não haja conflito entre os sensores. Para este parâmetro, recomenda-se o valor mínimo de 29 ms.

Para definir os pinos que serão utilizados para cada sensor, utiliza-se o comando NewPing, que tem a seguinte sintaxe :

NewPing(Pino_Trigger, Pino_Echo, Distancia_Maxima)

No meu programa, utilizei apenas 2 sensores, então tenho apenas 2 comandos NewPing. Se você for utilizar mais sensores, inclua mais comandos NewPing e não se esqueça de setar a variável SONAR_NUM, senão os demais sensores não serão detectados.

O loop do programa efetua a leitura de todos os sensores, e atualiza as variáveis referentes às vagas livres e vagas ocupadas, mostrando as informações no LCD. São utilizadas as subrotinas oneSensorCycle, que efetua a varredura nos sensores, e a echoCheck, que calcula a distância até o objeto detectado.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Programa : Controle de vagas de estacionamento com o HC-SR04  
// Autor : Arduino e Cia  
   
//Inicializa as bibliotecas do sensor Ultrasonico e do Display  
#include <NewPing.h>  
#include <LiquidCrystal.h>   
   
#define SONAR_NUM   2 // Define o numero de sensores  
#define MAX_DISTANCE 10 // Distancia maxima  

// Milisegundos de intervalo entre medicoes (29ms e o tempo mínimo para 
// evitar conflito entre os sensores)  
#define PING_INTERVAL 33 
   
// Armazena a quantidade de vezes que a medicao deve ocorrer,para cada sensor  
unsigned long pingTimer[SONAR_NUM]; 

unsigned int cm[SONAR_NUM];     // Armazena o numero de medicoes  
uint8_t currentSensor = 0;     // Armazena o sensor que esta ativo  
   
int Pinoled1Verm = 20;  //Pino led1 - Vermelho  
int Pinoled1Verde = 19; //Pino led1 - Verde  
int Pinoled2Verm = 18;  //Pino led2 - Vermelho  
int Pinoled2Verde = 17; //Pino led2 - Verde  
int vagaslivres = 2;   //Contador de vagas livres  
int vagasocupadas = 0;  //Contador de vagas ocupadas  
int sensor1 = 0;    //Contador de vagas no sensor1  
int sensor2 = 0;     //Contador de vagas no sensor2  
   
//Define os pinos que serao ligados ao LCD  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
   
NewPing sonar[SONAR_NUM] =   
{   
  // Armazena informacoes sobre a pinagem dos sensores  
  // Pino trigger, echo e distancia máxima, para cada sensor  
  NewPing(13, 10, MAX_DISTANCE), 
  NewPing(14, 15, MAX_DISTANCE),  
};  
   
void setup()   
{  
  Serial.begin(9600);  
  lcd.begin(16,2); //Inicializa LCD  
  lcd.clear();   //Limpa o LCD  
  pingTimer[0] = millis() + 75;      //Primeira medicao começa com 75ms  
  //Define o tempo de inicializacao de cada sensor
  for (uint8_t i = 1; i < SONAR_NUM; i++)   
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;  
  pinMode(Pinoled1Verm, OUTPUT);  //Define o Pino vermelho do led1 como saida  
  pinMode(Pinoled1Verde, OUTPUT); //Define o Pino verde do led1 como saida  
  pinMode(Pinoled2Verm, OUTPUT);  //Define o Pino vermelho do led2 como saida  
  pinMode(Pinoled2Verde, OUTPUT); //Define o Pino verde do led2 como saida  
 }  
   
void loop() 
{  
  // Loop entre todos os sensores 
  for (uint8_t i = 0; i < SONAR_NUM; i++) {  
   if (millis() >= pingTimer[i]) {
    //Define o tempo que o proximo sensor sera acionado
    pingTimer[i] += PING_INTERVAL * SONAR_NUM;   
    // Ciclo do sensor completo  
    if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); 
    // Reseta o timer antes de ler o proximo sensor  
    sonar[currentSensor].timer_stop();     
    // Número do sensor sendo acionado
    currentSensor = i;               
    // Se nao houver eco do sensor, seta a distância como zero   
    cm[currentSensor] = 0;           
    sonar[currentSensor].ping_timer(echoCheck);  
   }  
 }  
    
 //Calcula a quantidade de vagas disponiveis e ocupadas, e imprime no display  
 vagasocupadas = sensor1 + sensor2;  
 vagaslivres = 2 - vagasocupadas;  
 lcd.setCursor(0,0);  
 lcd.print("Vagas livres = ");  
 lcd.print(vagaslivres);  
 lcd.setCursor(0,1);  
 lcd.print("Vagas ocup. = ");  
 lcd.print(vagasocupadas);  
}  
   
void echoCheck() { //Se receber um sinal (eco), calcula a distancia  
  if (sonar[currentSensor].check_timer())  
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;  
 }  
   
void oneSensorCycle() { // Ciclo de leitura do sensor  
  for (uint8_t i = 0; i < SONAR_NUM; i++) {  
   //Se for detectado objeto entre 0 e 50 cm do sensor1, acende o led1 vermelho
   if (cm[0] > 1 && cm[0] < 50)   
   {  
     digitalWrite(Pinoled1Verm, 1);  
     digitalWrite(Pinoled1Verde, 0);  
     sensor1 = 1; //Incrementa o número de vagas ocupadas na vaga1  
   }  
   else //Se não for detectado objeto no sensor 1, mantém o led1 verde aceso  
   {  
     digitalWrite(Pinoled1Verm, 0);  
     digitalWrite(Pinoled1Verde, 1);  
     sensor1 = 0; //Marca a vaga 1 como livre  
   }   
   
   //Se for detectado objeto entre 0 e 50 cm do sensor2, acende o led2 vermelho  
   if (cm[1] > 1 && cm[1] < 50) 
   {  
     digitalWrite(Pinoled2Verm, 1);  
     digitalWrite(Pinoled2Verde, 0);  
     sensor2 = 1; //Incrementa o número de vagas ocupadas na vaga2  
   }  
   else //Se não for detectado objeto no sensor 2, mantém o led2 verde aceso  
   {  
     digitalWrite(Pinoled2Verm, 0);  
     digitalWrite(Pinoled2Verde, 1);  
     sensor2 = 0; //Marca a vaga 2 como livre  
   }   

   //Imprime os valores lidos no monitor serial, para fins de acompanhamento  
   Serial.print("Sensor : "); 
   Serial.print(i);   
   Serial.print(" = ");  
   Serial.print(cm[i]);  
   Serial.print(" cm - ");  
  }  
  Serial.println();  
}  

A biblioteca NewPing tem vários recursos e é relativamente fácil de usar. Consulte a documentação nesse link (em inglês) para obter maiores informações.

Por enquanto é isso. Espero que tenham gostado, e em breve vou publicar um vídeo com este experimento. Até lá !


Atualizado : Veja também como montar um pequeno sensor de estacionamento/ré usando o sensor HC-SR04 no post Sensor de estacionamento/ré com o Arduino e sensor HC-SR04.


59 comentários:

  1. Bom dia.
    Trabalho para uma empresa que administra shoppings centers e eles estão modernizando um dos shoppings e esperam colocar o sistema de sinalização de vagas. Você teria capacidade de gerir um projeto com 1500 vagas? Entre em contato comigo atraves de dudu@welab.me Ate logo

    ResponderExcluir
  2. Pessoal gostei muito desse projeto e estou montando para meu TCC, só que esta havendo um erro quando eu alterei o código para aumentar o numero de sensores, no meu caso seriam sete sensores, gostaria de saber se teria como contar com a ajuda de Vocês para resolver esse problema? e-mail para contato: jonataslopesdeandrade@gmail.com

    ResponderExcluir
    Respostas
    1. Boa noite Jonatas,

      Qual erro está aparecendo ?


      Abraço.

      Excluir
  3. Ola !
    Meu Tcc e um estacionamento com 2 sensores um na entrada e um na saida que indica o numero de vagas livres To precisando muito de ajuda !Como Faço para Mostrar em C# em um label as vagas livres ?sendo que este msm label tem q ser atualizado todo segundo para mostrar com precisao as vagas livres .Obrigado!

    ResponderExcluir
    Respostas
    1. Boa tarde Henrique,

      Que tipo de sensor você vai utilizar para controlar a entrada e saída ?

      Abraço.

      Excluir
    2. Usei 2 sensores tcrt5000
      O codigo ficou assim

      #include



      int vagaslivres = 10;
      int pinosensorentrada = 7;
      int pinosensorsaida=8;//Ligado ao pino "coletor" do sensor óptico
      int leitura; //Armazena informações sobre a leitura do sensor



      LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

      void setup()
      {
      //Inicializa LCD

      pinMode(pinosensorentrada, INPUT);
      pinMode(pinosensorsaida,INPUT); //Define o pino do sensor como entrada
      Serial.begin(9600);
      lcd.begin(16,2);
      lcd.setCursor(3,0);
      lcd.print("Bem Vindo");
      lcd.setCursor(2,1);
      lcd.print("Play Parking");


      }

      void loop()
      {
      //Le as informações do pino do sensor
      leitura = digitalRead(pinosensorentrada);
      if (leitura != 1) //Verifica se o objeto foi detectado
      {
      vagaslivres=vagaslivres-1;


      while(digitalRead(pinosensorentrada) != 1)
      {
      Serial.println(vagaslivres);
      delay(1000);
      lcd.begin(16,2);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Vagas Livres: ");
      lcd.setCursor(13,0);
      lcd.print(vagaslivres);


      }
      }


      leitura = digitalRead(pinosensorsaida);
      if (leitura != 1)
      {
      vagaslivres=vagaslivres+1;



      while(digitalRead(pinosensorsaida) != 1)
      {
      Serial.println(vagaslivres);
      delay(1000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Vagas Livres: ");
      lcd.setCursor(13,0);
      lcd.print(vagaslivres);




      }
      }
      if(vagaslivres <=0){
      Serial.println("Estacionamento Lotado");
      delay(1000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Estacionamento");
      lcd.setCursor(0,1);
      lcd.print("Lotado");

      delay(1000);


      }
      }


      Esta tudo Ok com a parte da programação arduino so que quero mandar o valor da vaga livre para um label no c# ,ate consegui mandar o valor mais o label nao atualiza sozinho ,precisava muito disto ,meus professores tambem nao estao conseguindo ,Se vcs puderem me ajudar !!Muito Obrigado !!

      Excluir
  4. Olá,
    Estou fazendo um projeto com 10 vagas, logo terei 10 sensores HC-SR04 e 10 leds bicolores e uma tela de LDC. Que arduino usar, uno, mega? Qual arduino suporta todos esses componentes, em questao de portas. Um arduino nao tem portas suficientes né?
    Agradeço pela ajuda!

    ResponderExcluir
    Respostas
    1. Boa tarde Wellington,

      Nesse caso, vai ter que ser o Mega, é muita coisa. E digo por experiência que você sempre vai querer colocar um sensor a mais, algum outro led... é melhor um Mega, assim sobra espaço pra mais um monte de coisas.

      Abraço !

      Excluir
    2. Olá, estou com o mesmo problema em meu projeto.
      também estou fazendo um estacionamento, porém quero expandir o numero de vagas.
      Pesquisei sobre o protocolo I2C, e parece ser uma solução.
      porém ainda estou com muitas dúvidas...
      Protocolo I2C faz comunicação direta entre Sensor ultrassonico e arduino? ou precisarei de um PIC?
      Como irei realizar a comunicação dos LED's com o Arduino utilizando esse protocolo?
      Pesso sua ajuda caso tenha alguma resposta, muito obrigado!

      Excluir
  5. Boa noite Wellington,
    Estou montando esse trabalho com o arduino uno, teria como você me mandar o codigo do programa adaptado para o arduino uno e o ckt.
    segue meu email: carlosfreitas_96@hotmail.com
    Abraço!

    ResponderExcluir
  6. Qual biblioteca uso para programar com sensores LDR?

    ResponderExcluir
    Respostas
    1. Boa tarde André,

      Para o LDR você não precisa de biblioteca, como ele é apenas uma resistência (que varia de acordo com a luz), você pode simplesmente ler os valores das portas digitais ou analógicas com os comandos DigitalRead(pino_sensor) e AnalogRead(pino_sensor).

      Para maiores informações, nesse post aqui eu falo sobre LDR :

      http://www.arduinoecia.com.br/2013/09/controle-de-luz-utilizando-ldr.html

      Abraço !

      Excluir
    2. Verdade, vi isso depois. Obrigado pela resposta.

      É que sou novo na parte de arduino e nao muito bom em programação. Estou montando um projeto de estacionamento com 10 vagas e usei um outro projeto como base, eles usavam LDR, um servomotor para uma cancela e o display 16x2, mas usaram 2 arduinos uno para montar tudo. Cheguei pensar se um arduino mega seria uma melhor opção (ja que tem pinos digitais e analogicos de sobra para esse projeto), o microcontrolador tambem tem mais memoria só que com mesma frequencia. Acha viável? O processador suporta?

      Excluir
    3. Oi André,

      Eu acho que vale mais a pena fazer tudo em um Arduino só, no caso o Mega, pq aí vc tem portas sobrando não só pra colocar mais componentes mas também se precisar expandir o número de vagas fica mais fácil. Tem também a questão de programar uma única placa, melhor do que ficar emendando as coisas depois. rs

      O processador suporta tranquilamente. Esse projeto de controle de vagas não exige um grande poder de processamento e nem de velocidade.

      Precisando de ajuda, estamos ai. Abraço !

      Excluir
    4. Obrigado pelo suporte cara, esta sendo de grande ajuda!
      Só queria perguntar mais uma coisa, por parte de hardware. Como faço os calculos para saber o resistor a ser usado junto aos leds? Nao tenho muita certeza de como ligar na protoboard os componentes em si.

      Excluir
    5. Oi André,

      Eu geralmente uso uma calculadora como essa :

      http://www.robotizando.com.br/calculadora_leds.php

      Mas eu sinceramente não me preocupo muito com esses valores de resistência, principalmente quando estou apenas testando os meus circuitos. Nesse caso coloco uma resistencia de valor alto pq tenho certeza que serve para qualquer led, e se o brilho estiver fraco vou diminuindo o valor aos poucos.

      Abraço !

      Excluir
    6. Eu posto uma duvida aqui e um pouco depois acho a resposta kkkkk mas obrigado pela atenção! Ja calculei os valores dos resistores, mas qria saber para que é usado o potenciometro. Tambem vi em um lugar dizendo que a soma das correntes dos bornes do arduino nao podem ultrapassar os 200mA. Isso que cada borne fornece até 40mA. Vou usar 20 leds com media de 25mA caca, como resolvo isso?

      Excluir
    7. Boa noite André,

      O potenciômetro serve apenas para regular o contraste do display. Você pode trocá-lo por uma resistência fixa.

      Quanto aos leds, sinceramente não sei, ainda não montei nada parecido. rs

      Abraço !

      Excluir
  7. iae cara, sou novo nessa área, tou precisando fazer um trabalho com arduino, e pensei em fazer algo parecido com esse, um controle de estacionamento, so que tou tentando entrar como fazer a cancela de um estacionamento, mais nao consigo encontrar em nenhum lugar como fazer, o que comprar, por onde começar, queria saber se voce podia me ajudar cara

    ResponderExcluir
    Respostas
    1. Boa noite,

      Utilize o formulário de contato no lado direito da página, assim conversamos melhor.

      Abraço !

      Excluir
  8. Boa noite !
    Obrigado pelo tutorial e pela divulgação do projeto.
    Achei o projeto bastante interessante e como tinha o material em casa o construí.
    Consegui fazer pequenas alterações na distancia e ficou ótimo para um estacionamento de brinquedo em escala, mas gostaria de adcionar algumas frases pequenas em rolagem após a leitura do sensor, é possível fazer isto ? Teria um exemplo de como adicionar as frases ?
    Obrigado

    ResponderExcluir
    Respostas
    1. Bom dia,

      Se for usar um display LCD 16x2, você pode usar as informações desse post, creio que tenha o que você precisa :

      http://www.arduinoecia.com.br/2014/03/arduino-como-realizar-um-scroll-no-lcd.html

      Abraço !

      Excluir
  9. Não era bem o que eu estava pensando mas já dá um norte, é uma opção interessante também.
    Obrigado

    ResponderExcluir
  10. Boa tarde, realizei um projeto com a mesma finalidade, porém utilizei microcontroladores PIC e um display de 7 segmentos. O problema no meu protótipo é que está dando interferência entre um sensor e outro devido à escala, estou ativando meus leds atraves de um relé, mas quando ligo um sensor perto do outro a uma distancia de 7 cm, ao ativar um sensor os leds de ambos circuitos ficam com o vermelho aceso. Já passou por algum problema assim relacionado ao HC SR-04? Agradeço a atenção!

    abraço!

    ResponderExcluir
    Respostas
    1. Boa tarde Philip,

      Não passei por isso, o meu funcionou com os sensores bem próximos. Você tentou aumentar a distância entre eles para ver se o problema não é outro ?

      Abraço.

      Excluir
  11. Boa noite
    Meu nome é Fernando Ribeiro e sou síndico de um prédio no Rio de Janeiro, que conta com 70 vagas de garagem. Gostaria de uma indicação de uma empresa que instale esse sistema de controle de vagas.
    Obrigado

    ResponderExcluir
  12. Boa Noite

    gostaria de uma ajuda para um tex se possível!

    pretendo instalar (3 sensores) fixo ligado no mesmo Arduíno que corresponde individualmente
    em cada sinal sonoro (3 buzzer) é possível? exemplo um carro que informa se o obstaculo está na direita esquerda ou frente com tons diferentes em cada saída como se fosse um sensor de estacionamento so que com tons para direita diferente da esquerda

    AGRADECIDO

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Dê uma olhada neste artigo, creio que tenha o que você precisa. Falta apenas adaptar para a quantidade de sensores que você tem :

      http://www.arduinoecia.com.br/2014/04/sensor-de-estacionamento-re-com-arduino.html

      Abraço !

      Excluir
  13. Boa tarde, seria possível utilizar em conjunto o xbee, para receber os dados dos sensores remotamente? A ideia seria cada modulo Arduíno, gerenciar um setor, com uma quantidade de vagas/sensores, e os dados destes sensores, serem enviados via xbee a outro Arduíno, também com xbee. E este Arduíno (concentrador) gerenciar quantas vagas estariam livres.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      É possível sim, apenas acho que encarece bastante o projeto.

      Abraço.

      Excluir
    2. Boa tarde, segui o seu tutorial, e funcionou perfeitamente. A única diferença, é que estou utilizando o Arduino Uno R3 e o display I2C, sem o trimpot, mas está rodando certinho.
      Rodei o programa deste link http://blog.filipeflop.com/wireless/tutorial-wireless-arduino-xbee-shield.html em separado, e também funcionou ok, apagando e ligando o led para testar a comunicação dos 2 xbees.
      Gostaria de que a informação de vaga ocupada ou vaga livre, fosse enviada pelo xbee, para monitorar remotamente via XCTU. O que eu teria que acrescentar ou alterar no programa do estacionamento, para realizar esta tarefa? Valeu!! ;- )

      Excluir
  14. Arduino e Cia, boa tarde.

    Não estou conseguindo aumentar a distancia do sensor, preciso que ele detecte algo em torno de 1,20m ou mais é possível?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      É sim, altere o IF da linha 94, por exemplo:

      if (cm[0] > 1 && cm[0] < 50)

      Troque o 50 por 120, lembrando que a distancia é em centímetros.

      Abraço !

      Excluir
  15. Olá, gostaria que ao invés de verificar a distância do objeto, fosse enviado via serial monitor, a informação de vaga livre / vaga ocupada. Alterei no serial.print, mas ele fica enviando esses dados constantemente. O que eu precisaria alterar para que fosse mostrado no serial monitor, apenas quando houvesse mudança do estado de vaga ocupada e vaga livre?

    ResponderExcluir
  16. Boa tarde Adriana,

    Faça um "IF" para testar se a condição da vaga foi alterada. Exemplo:

    Estado_atual_vaga_1 = 0 //Livre
    Estado anterior_vaga_1 = 1 //Ocupada
    IF (Estado_atual_vaga_1 != Estado anterior_vaga_1)
    {
    Serial.print("Vaga alterada. Novo valor : ");
    Serial.println(Estado_atual_vaga_1);
    Estado anterior_vaga_1 = Estado_atual_vaga_1;
    }

    Basicamente é isso que vc precisa adaptar no programa.

    Abraço.

    ResponderExcluir
  17. Olá, rd bem? Eu sou o Matheus, um estudante de eletrônica, e estamos no nosso último ano, (escola técnica). Aos poucos, percebo que a cada dia mais gosto de programação, e pela coincidência, meu TCC terá dois sensores ultrasonicos HC-SR04. E pra mim ir desenvolvendo mais minhas habilidades em C e em Arduíno, peguei pra estudar a biblioteca do New Ping. Confesso que não achei nenhuma instrução que me diz que eu possa trabalhar até com 15 sensores, apesar de saber que posso.
    Minha pergunta é, você pode me apontar onde está essa instrução, pois ela me será útil na confecção da minha própria biblioteca. Desde já Agradeço ;-)

    ResponderExcluir
    Respostas
    1. Boa noite Matheus,

      Eu usei essa biblioteca com no máximo 2 sensores, mas creio que não seja complicado de fazer. No início do programa, você tem que setar a variável com o número de sensores (SONAR_NUM, na linha 8).

      Depois, você vai no array onde estão definidos os pinos dos sensores (entre as linhas 33 e 39). Ali você adiciona os outros sensores. Exemplo:

      SONAR_NUM = 4

      NewPing sonar[SONAR_NUM] =
      {
      // Armazena informacoes sobre a pinagem dos sensores
      // Pino trigger, echo e distancia máxima, para cada sensor
      NewPing(13, 10, MAX_DISTANCE), //Sensor1
      NewPing(14, 15, MAX_DISTANCE), //Sensor2
      NewPing(4, 5, MAX_DISTANCE), //Sensor3
      NewPing(6, 7, MAX_DISTANCE), //Sensor4
      };

      Basicamente é isso. Espero que ajude. Abraço !

      Excluir
    2. Boa noite, só estudando de engenharia estou fazendo meu tcc. Fiz a seguinte alteração acima que você falo para aumentar a quantidade de sensor sonico ele liga o led verde, Mais não faz a alteração quando aproximo do sensor. Sabe me informar se isso pode ser a biblioteca ou alguma coisa da programação que tem que ser alterada? Conto com sua ajuda ótimo trabalho.

      Excluir
  18. Bom dia.

    Alem de acrescentar os sensores e ledes no inicio do código, com os pinos correspondentes, também tem que incluir os leds verde e vermelhos no final do código no ultimo FOR.

    Minha pergunta é a seguinte: aproveitando esse for, mudando a sequencia de LEDS e sensores que começam em 1, para começarem em 0, e melhorando o código, posso deixar o código dessa forma?


    for (uint8_t i = 0; i < SONAR_NUM; i++) {
    //Se for detectado objeto entre 0 e 50 cm do sensor1, acende o led1 vermelho
    if (cm[i] > 1 && cm[i] < 50)
    {
    digitalWrite(Pinoled[i]Verm, 1);
    digitalWrite(Pinoled[i]Verde, 0);
    sensor[i] = 1; //Incrementa o número de vagas ocupadas na vaga[i]
    }
    else //Se não for detectado objeto no sensor i, mantém o led1 verde aceso
    {
    digitalWrite(Pinoled[i]Verm, 0);
    digitalWrite(Pinoled[i]Verde, 1);
    sensor[i] = 0; //Marca uma vaga como livre
    }

    ResponderExcluir
  19. Boa noite, queria saber se existe algum software que eu poderia consultar em meu computador onde qual a posição tem vaga livre no estacionamento.

    ResponderExcluir
  20. Boa noite, sou estudante de engenharia, primeiramente, parabéns pelo projeto e agradeço por disponibilizar, está me ajudando muitíssimo, precisar utilizar 5 sensores e mandar informaçoes para um display, até ai blz, minha dúvida é o seguinte, preciso também enviar essas informaçoes para um aplicativo android, sera que teria como um aplicativo mostrar quais vagas estão disponiveis ou ocupadas no momento? por ex: o aplicativo serviria somente para mostrar talvez em bolinha verde ' vaga livre' e bolinha vermelha ' vaga ocupada' , se atualizar constantemente, e talvez mostrar em setores ... o condutor do veiculo só se conectaria ao aplicativo para saber instantaneamente onde há vagas. se puder me dar uma luz te agradeceria muitooo, obrigado desde já,.

    ResponderExcluir
    Respostas
    1. Bom dia Igor,

      É possível, mas acho que você vai esbarrar na velocidade de atualização... teria que ser alguma coisa via wifi, que atualize rápido o aplicativo, senão não faria sentido. Para um protótipo, acho que funciona bem.

      Abraço!

      Excluir
  21. Boa tarde, sou estudante de Eletrónica e Telecomunicações e estou a fazer um parque de estacionamento automatizado, e queria fazer parecido com o seu código, mas em vez de dois lugares por 10, eu compilei e apareceu-me o seguinte erro: 'lcd' was not declared in this scope; 'class HardwareSerial' has no member named 'println'

    Cumprimentos, e espero que me possa ajudar-me!!

    ResponderExcluir
  22. Boa tarde, sou estudante de Eletrónica e Telecomunicações e estou a fazer um parque de estacionamento automatizado, e queria fazer parecido com o seu código, mas em vez de dois lugares por 10, eu compilei e apareceu-me o seguinte erro: 'lcd' was not declared in this scope; 'class HardwareSerial' has no member named 'println'

    Cumprimentos, e espero que me possa ajudar-me!!

    ResponderExcluir
  23. Boa tarde, estou montando meu TCC com arduino e e´um estacionamento, e estou com um problema, pode ser simples, mas como não conheço muito de arduino estou com dificuldade, quando aciono o botão de entrada do estacionamento, ele faz a leitura e me disponibiliza a vaga livre mais próxima da entrada do estabelecimento, abre a cancela, o carro entra e baixa a cancela, porem se tiver outro veiculo logo atrás, e pressionar o botão solicitando vaga, e o primeiro veiculo ainda não tenha chegado na vaga que foi disponibilizada, o sistema disponibiliza a mesma vaga. se puder me ajudar ficarei muito agradecido.

    fico no aguardo.


    Edílson Queiroz
    email: edqueisantos@hotmail.com

    ResponderExcluir
    Respostas
    1. Bom dia Edilson,

      Você tem que implementar algum contador que "reserve" a vaga, não disponibilizando enquanto o carro não estacionar.

      Se não conseguir, entre em contato utilizando o formulário de contato no lado direito da página.

      Abraço!

      Excluir
  24. Boa noite, estou com um problema na programação dos sensores ultrassônicos(Newping). quando eu coloco mais de um sensor ultra e acrescendo algum código, os sensores entram em conflito e acaba bugando o código todo.

    Será que você poderia me ajudar?

    email: Lcunha1999@gmail.com

    ResponderExcluir
  25. Boa noite
    Gostaria de saber se as distâncias cm[0] e cm[1] correspondem, respectivamente, aos sensores 1 e 2, e se isso é determinado pela ordem das I/O's.
    Por exemplo:
    NewPing(13, 10, MAX_DISTANCE),
    NewPing(14, 15, MAX_DISTANCE),

    O sensor 1 corresponde ao NewPing que tem as I/O's mais antecessoras. É assim?

    Se possível, por gentileza, responda para meu email (leal.vitor@rocketmail.com).
    Desde já, agradeço.

    ResponderExcluir
  26. estou com um problema, tudo funciona menos o lcd que nao liga, o sensor funciona e acende os leds..

    ResponderExcluir
  27. Boa Noite,
    Faço curso técnico de eletroeletrônica, estou na ultima matéria que é projetos. Preciso fazer um projeto e gostei bastante deste seu. Vou fazê-lo, só que quero acrescentar uma cancela. Gostaria de saber se não têm como você me ajudar me dando algumas ideias para acrescentar esta cancela? Fazendo favor.
    Desde já agradeço.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Por favor entre em contato utilizando o formulário de contato no lado direito da página.

      Abraço!

      Excluir
  28. Bom dia!
    teria como substituir os sesores por reed switch? e como ficaria o código?
    Obrigado!

    ResponderExcluir
  29. me ajude que tipo de ajustes que eu devo fazer para colocar em uma arduino uno r3

    ResponderExcluir
  30. Boa tarde, teria como você me mandar o esquema e circuito desse projeto usando ldr?

    ResponderExcluir
  31. Boa tarde teria como você me manda o esquema e o circuito usando ldr e utilizando 2 arduinos uno ao invés do mega?

    ResponderExcluir
  32. Bom dia,

    Estou com dificuldades de adicionar um terceiro sensor.
    Adiciono as programações, mais o segundo sensor fica indicando com duas vagas ocupadas ao mesmo tempo.
    Poderia me ajudar!

    Att,

    Emanuel Malerba

    ResponderExcluir
  33. Bom dia, estou com problema nessa linha de código if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(), está falando que não está declarado no escopo!
    O que faço?

    ResponderExcluir
    Respostas
    1. Oi Sandro,

      Me parece que você não está usando a biblioteca correta. Siga os links do post, por favor. :)

      Abraço!

      Excluir