22 setembro 2014

Contador de visitantes usando led IR e fototransistor

O projeto do post de hoje foi usado no ano passado em um TCC, onde o aluno precisava criar um sistema que contasse o número de visitantes em uma sala, utilizando led infravermelho e fototransistor.

O sistema deveria contar o número de pessoas que entraram na sala, quantas saíram, calcular o número de pessoas na sala e, caso não houvesse ninguém, apagar a luz.

contador de visitantes ir fototransistor


Essas informações deveriam ser apresentadas em um display LCD 16x2, e com a utilização do Arduino a parte eletrônica ficou bem reduzida, facilitando a instalação do projeto em uma maquete.

No projeto, mostrado na foto acima, foram utilizados os seguintes componentes:

  • 1 led comum (para simular a luz da sala)
  • 2 leds IR 5mm
  • 2 fototransistores 5mm
  • 1 resistor de 220R para o led comum
  • 2 resistores de 220R para os leds IR
  • 2 resistores de 220R para o coletor do fototransistor
  • 2 resistores de 330R para o emissor do fototransistor
  • 1 display LCD 16x2 HD44780
  • 1 potenciômetro de 10 K

O esquema de ligação do display é o mesmo que eu utilizei na maioria dos projetos aqui no site (clique aqui para ver outros posts sobre display LCD aqui no Arduino e Cia). Na porta 7 ligamos o fototransistor que será responsável pela contagem de entrada da sala, e na porta 6 o responsável pela contagem de saída. O led que simula a luz da sala está ligado à porta 10 :


IR fototransistor


No circuito acima, cada fototransistor (em azul) tem a perna mais curta (o coletor) ligada ao positivo junto com um resistor de 220R, e a perna mais comprida (o emissor) ligada à porta do Arduino, com um resistor de 330R fazendo a função de pull-down. O potenciômetro ajusta o contraste do display.

O programa verifica o estado das portas 7 (sensor de entrada da sala) e 6 (sensor de saída da sala), que se encontram em nível alto enquanto estiverem recebendo iluminação dos leds IR (que estão sempre ligados). Quando a iluminação IR é interrompida por algum objeto, o estado da porta vai à nível baixo (0 / LOW), e o contador é então atualizado.

Na parte superior do display, mostramos a quantidade de pessoas na sala, e o total de visitantes. Na parte inferior do display, temos o contador de entrada e de saída, apenas para informação e acompanhamento.


  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
// Programa : Controle de visitantes
// Autor : Arduino e Cia

// Pino de ligacao do sensor IR de entrada
int pinoirent = 7;    
// Pino de ligacao do sensor IR de saida
int pinoirsaida = 6;  
// Variavel que registra o estado do sensor de entrada
int valorirent = 0;   
// Variavel que registra o estado do sensor de saida
int valorirsai = 0;   
// Variavel que registra a quantidade de visitantes que entraram
int content = 0;      
// Variavel que registra a quantidade de visitantes que sairam
int contsai = 0;      
// Variavel que registra a quantidade de pessoas na sala
int contsala = 0;     
// Variavel que registra a quantidade anterior de pessoas na sala
int contanterior = 0; 
// Pino de ligacao do led que representa a luz da sala
int pinoledsala = 10; 


// Configuracao do display LCD
#include <LiquidCrystal.h> 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
 

void setup()
{
  Serial.begin(9600);            
  // Seta o pino do sensor de entrada como ENTRADA
  pinMode(pinoirent, INPUT);     
  // Seta o pino do sensor de saida como ENTRADA
  pinMode(pinoirsaida, INPUT);   
  // Seta o pino do Led indicador de presenca como SAIDA
  pinMode(pinoledsala, OUTPUT);  
  // Informacoes iniciais do display
  lcd.begin(16, 2);
  lcd.setCursor(0,0);            
  lcd.print("Sala:0 ");          
  lcd.setCursor(9,0);
  lcd.print("Tot: 0");
  lcd.setCursor(0,1);
  lcd.print("Ent: 0");
  lcd.setCursor(9,1);
  lcd.print("Sai: 0");
}

void loop()
{
  // Seta a variavel valorirent com o status do sensor de entrada
  valorirent = digitalRead(pinoirent);    
  // Seta a variavel valorirsai com o status do sensor de saida
  valorirsai = digitalRead(pinoirsaida);  

  // Mostra as informacoes dos sensores no serial monitor
  Serial.print("entrada : ");
  Serial.print(valorirent);
  Serial.print(" saida : ");
  Serial.println(valorirsai);

  // Verifica se o estado do sensor de entrada foi alterado
  if(valorirent!=1) 
  {
    // Incrementa o valor do contador de entrada em 1 unidade
    content=content+1; 
    // Verifica se a pessoa/objeto para em frente ao sensor
    while(digitalRead(pinoirent)!=1) 
      { 
        delay(100);  
        Serial.println("Sensor de entrada parado !");
      }
    // Atualiza no LCD o valor do contador de entrada
    lcd.setCursor(5,1); 
    lcd.print(content); 
    // Atualiza no LCD o valor total de visitantes
    lcd.setCursor(14,0); 
    lcd.print(content); 
  }

  // Verifica se o estado do sensor de saida foi alterado
  if(valorirsai!=1) 
  {
    // Incrementa o valor do contador de saida em 1 unidade
    contsai=contsai+1; 
    // Verifica se a pessoa/objeto para em frente ao sensor
    while(digitalRead(pinoirsaida)!=1)
      { 
       delay(100); 
       Serial.println("Sensor de saida parado !");
      }
    // Atualiza no LCD o valor do contador de saida
    lcd.setCursor(14,1);
    lcd.print(contsai);   
  }

  // Calcula o numero de visitantes na sala
  contsala=content-contsai; 
  // Verifica se o numero atual de visitantes na sala foi alterado.
  if (contsala != contanterior)
  {
    lcd.setCursor(5,0); 
    // Imprime 2 posicoes em branco, para limpar o cursor na 
    // coluna 5, linha 0
    lcd.print("  "); 
    lcd.setCursor(5,0);
    // Atualiza no LCD o numero de visitantes na sala
    lcd.print(contsala); 
    // Apos atualizar no LCD, coloca na varivel CONTANTERIOR 
    // o valor atual de visitantes na sala (CONTASALA} 
    contanterior = contsala; 

    // Verifica se o valor do contador de pessoas na sala 
    // e maior do que 0
    if (contsala > 0) 
    {
      //Caso positivo, acende a luz/led
      digitalWrite(pinoledsala,1); 
    }
      else
    { 
      //Caso negativo, apaga a luz/led
      digitalWrite(pinoledsala,0); 
    } 
  }
}

Também para fins de acompanhamento, os valores dos sensores são mostrados no serial monitor. Caso alguma pessoa ou objeto pare em frente ao sensor, essa informação também é mostrada :

Serial Monitor - Dados IR

O funcionamento desse projeto você confere no vídeo abaixo :



61 comentários:

  1. O display não aparece nada escrito e os leds ficam intermitentes, entrada e saida direto. Pq?

    ResponderExcluir
  2. Bom dia !

    Com relação ao display, você usou o potenciômetro para ajuste do contraste ? Sem ele, vc não verá nada na tela.

    Recomendo que comece por esse componente para verificarmos qual é o problema. Se possível, faça uma ligação básica do display utilizando o post deste link:

    http://www.arduinoecia.com.br/2013/12/lcd-16-x-2-backlight-azul-hd44780.html

    Abraço !

    ResponderExcluir
  3. olá, tentei fazer funcionar mas acho q a programação n deu certo aqui. aparece tudo mas não conta quando coloco obstaculo no sensor, so conta quando tiro o fio das portas 6 e 7 da protoboard.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Por favor verifique se o fototransistor não está invertido.

      Abraço!

      Excluir
  4. Ótimo tutorial!
    Vou utilizar bastante deste projeto para criar um Placar Eletronico para meu Pimbolim (Totó para alguns).
    Dúvida:
    É possivel utilizar um segundo Display que exibira as mesmas informações conectando-o pela solda do primeiro LCD?

    Obrigado!

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Nunca fiz isso, mas não recomendo. :-)

      Uma solução é vc utilizar outras portas do Arduino, se você tiver portas disponíveis, ou até mesmo usar 2 displays com 2 módulos I2C. Tenho alguns artigos aqui no blog falando sober esse tipo de módulo.

      Abraço !

      Excluir
    2. Como fue lo de las 2 pantallas si pudiste?

      Excluir
    3. Boa noite amigo, a porta arduino não terá pulso o suficiente para os dois LCD. Recomendo utilizar um arduino com mais pinos, já que só as duas LCD ocuparão 10 pinos. Fiz esse mesmo projeto, numa mesa de toto tb, e utilizei 2 arduinos, mais não a placa convencional, utilizei o arduino mini que é uma placa identica a arduino uno, mas é compacta e propria para projeto final, e inclusive, muito mais barata, vale a pena comprar duas para seu projeto !

      Excluir
  5. bom dia , eu tentei executar o projeto , mas não tenho tido sorte , quando eu remover o fio da conta de placa de ensaio ... mas só uma vez ... e eu me virei para IR , mas nada ... você vai ter algo mais detalhado que poderia ajudar a avançar ... Eu sou novo no Arduino e eu fiz todas as suas formas de diagramas e de vídeo, mas não tenho tido sorte ...

    Obrigado pela ajuda .

    ResponderExcluir
  6. Ele tem trabalhado muito bem , tive alguns problemas com resistências 220 que você colocar na sua lista , a mudança por muita resistência até que uma me ... agora tem funcionado muito bem ... só que eu tenho uma pergunta , como poderia dar mais longe a intensidade da luz ? para se comunicar com mais de um metro de distância, Greetings from Mexico

    ResponderExcluir
    Respostas
    1. Buenas tardes,

      Trate de usar este sensor, que tiene un alcance de hasta 80 cm: http://www.arduinoecia.com.br/2014/07/contador-sensor-de-proximidade-ir.html

      Saludos y gracias por visitar Arduino e Cia!

      Excluir
  7. Bom dia. Tem ideia de como fazer para contar apenas em um sentido, por exemplo em uma porta só contar no sentido em que as pessoas/objetos entrem!
    ótimo projeto, parabéns!

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Você pode utilizar esse mesmo circuito, usando apenas o sensor de entrada, e depois usar a variável "content" (contador de entrada).

      Abraço!

      Excluir
  8. Caso fosse implementar esse sistema num ambiente real não iria funcionar,pois não tem como uma pessoa entrar no ambiente sem excitar os dois sensores,certo?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Sim, o circuito funciona normalmente, mas como foi montado em uma protoboard, tive que deixar os dois sensores juntos para testar e fazer a demonstração no vídeo.

      Num ambiente real, você deve utilizar, por exemplo, um sensor em cada porta.

      Abraço!

      Excluir
    2. Me refiro a uma sala de aula, por exemplo, com apenas uma porta. Estou tentando usar os 2 sensores e a sequencia que ambos são excitados definirá se a pessoa entrou ou saiu.

      Excluir
    3. Boa noite,

      Entendi. Já fiz isso com sensores ultrassônicos para contar carros em um local com apenas um portão de entrada... Dá um certo trabalho pra programar, mas é possível. :)

      Abraço!

      Excluir
    4. Bom dia amigo , estou interessado no projeto de contar as pessoas na mesma porta se ela entrou e saiu usando o sensor ultrassonico. tem como me passar o codigo usado no arduino desse projeto ? Grato
      skype: cristiano.box

      Excluir
  9. Amigo, caso eu só tenha uma porta (relativamente grande uns 4 metros) tanto para entrar quanto para sair... Seria aconselhável usar esse sistema?
    Abraço!
    Léo

    ResponderExcluir
    Respostas
    1. Boa noite,

      Você vai ter que fazer alguns ajustes no programa, talvez colocar os dois sensores um perto do outro e mexer na lógica.. mas é possível sim.

      Quanto ao sensor, talvez um sensor LDR com diodo laser seja o mais indicado, já que a distância é grande.

      Abraço!

      Excluir
  10. Este comentário foi removido pelo autor.

    ResponderExcluir
  11. Olá boa tarde, quando um objeto fica parado em frente o sensor ele conta infinitamente, como poderia corrigir este erro? porque mesmo criando variáveis de verificação do sensor a contagem é da mesma maneira.
    Exemplo :
    int verifica;
    int sensor;



    void loop(){

    if ( sensor == 0 ){

    if ( verifica )
    cont++;

    verifica = 0;

    }else{

    verifica = 1;
    }

    }

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Estranho. O programa já tem uma função para verificar se alguém parou em frente ao sensor (linhas 69 à 73).

      Abraço!

      Excluir
  12. Este comentário foi removido pelo autor.

    ResponderExcluir
    Respostas
    1. Boa tarde Bruno,

      Eu usei os 5V do Arduino mesmo. Se você está começando, tem muito conteúdo online, até aqui no blog mesmo.

      Se você prefere um livro, recomendo este link: http://www.arduinoecia.com.br/2013/09/livro-arduino-basico-michael-mcroberts.html

      Abraço!

      Excluir
  13. Eu queria usar esse projeto porém queria acrescentar um buzzer e dois leds, a ideia era de, fazer isso como um sensor de elevador. Caso entrassem 10 pessoas o led amarelo acenderia e o buzzer daria uma apitada suave. Caso o limite de 10 pessoas fora ultrapassado o led vermelho acenderia e o buzzer apitaria constantemente até voltar ao limite de 10 pessoas. Tem alguma ideia de como fazer a montagem e o programa?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Tenho sim, entre em contato utilizando o formulário de contato no lado direito da página.

      Abraço!

      Excluir
  14. Parece até meio vergonhoso, mas sempre que tento ligar apenas a parte sensorial utilizando o infravermelho e o fototransistor, não obtenho nenhum resultado, e como gosto de fazer as coisas por partes, não consigo prosseguir, se tiver alguma dica pra um novato, agradeço.
    Aliás, liguei a uns dias o LCD e regulei com o potenciômetro, melhora o contraste mas não vejo as informações (saída, entrada e etc), aqueles quadradinhos brancos ocupam a tela toda, o que poderia ser?

    ResponderExcluir
    Respostas
    1. Bom dia Bruno!

      Vergonhoso é não tentar... ;)

      Olha, eu recomendo que você faça um teste simples, primeiro com o LCD. Use as informações desse post:

      http://www.arduinoecia.com.br/2013/12/lcd-16-x-2-backlight-azul-hd44780.html

      Depois vá testando os outros dispositivos.

      Abraço!

      Excluir
  15. Bom dia, parabéns!
    Bom trabalho, obrigado!
    Saudaçoes do Mexico.

    ResponderExcluir
  16. As resistências devem ser obrigatoriamente 330 e 220? Estou com uma de 440 e uma de 220, não estou conseguindo captar o sinal... seria por este motivo?

    ResponderExcluir
    Respostas
    1. Bom dia Mauricio,

      Você já tentou outros valores ? Maiores do que esses, por exemplo ?

      Abraço!

      Excluir
  17. a quien le salio este proyecto que me pueda ayudar lo necesito para aprobar una asignatura se lo agradecere toda la vida

    ResponderExcluir
  18. Boa Tarde!
    Eu conseguiria adaptar este programa para um evento (exemplo uma feira ou festival) onde há um maior fluxo de pessoas? Pois se 4 pessoas passassem ao mesmo tempo, só iria contar como 1 pessoa o programa.

    Melhores Cumprimentos, João Reis

    ResponderExcluir
    Respostas
    1. Oi João,

      Pois é. Realmente nesse caso fica difícil. Uma solução que eu vejo é fazer algo por câmeras, usando Raspberry, mas seria algo um pouco mais complicado e sofisticado de fazer (mas possível).

      Abraço!

      Excluir
    2. tengo un problema ya lo hice igual pero no funciona

      Excluir
    3. hola tengo un porblema no me cuenta

      Excluir
  19. Olá amigo!
    Os Leds IR e os Fototransistores podem ser aproveitados de um Sensor Optico Reflexivo TCRT5000? (é o mesmo?) Obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Não são os mesmos componentes, mas o princípio de funcionamento é o mesmo. Você pode desmontar o TCRT5000 e usar o led IR e o fototransistor com o circuito deste post.

      Abraço!

      Excluir
  20. Ola achei muito interessante o código mas gostaria de saber como eu poderia alterar o código para usa-lo em uma esteira selecionadora de pecas (por altura) montei uma esteira e estou usando dois sensores ir so que estou me batendo para identificar somente pecas altas ou somente pecas baixas. pensei em usar uma logica assim: quando passar uma peca alta os dois sensores vao sensibilizar e então conta peca alta quando sensibilizar somente um então conta peca pequena. so que ta f... não to conseguindo fazer isso funcionar. Você pode me ajudar? Grato e parabéns pelo execente post!

    ResponderExcluir
    Respostas
    1. Bom dia Lindolfo,

      Legal o projeto, eu gostaria de dar uma olhada nessa esteira e nas peças. Você consegue me mandar fotos disso ? Utilize o formulário de contato no lado direito da página, por favor.

      Abraço!

      Excluir
  21. mano se você poder me responder, responda um "ok" por favor, preciso muito da sua ajuda.
    Agradeço desde já.

    ResponderExcluir
    Respostas
    1. Oi Mayke,

      Vamos ver se consigo te ajudar. Diz aí ! :)

      Abraço

      Excluir
    2. Man,
      Guando o contador esta zerado, passamos pela "saída e o contador mostra números negativos, eu tentei modificar o código e n obtive sucesso.
      Você tem alguma luz para mim em relação a isso ? Pq irei usar ele como projeto do curso e o professor pediu para arrumar isso k

      Agradeço desde já !

      Excluir
  22. ola, preciso de ajuda com esse código, no caso se os dois sensores acionarem na sequencia ele vai contar uma entrada e uma saída?? como faco para que quando eles aciones em sequencia eu identifique o sentido da passagem??

    ResponderExcluir
    Respostas
    1. Oi Claudio,

      Exato, vai contar uma entrada e uma saída. Para identificar o sentido, crie uma lógica mais ou menos assim:

      Se Sensor 1 acionou antes do sensor 2
      =pessoa entrando

      se sensor 2 acionou antes do sensor 1
      = pessoa saindo

      E coloque um tempo minimo para isso, por exemplo, 1/2 segundo entre acionar o sensor 1 e 2.

      Abraço!

      Excluir
  23. Olá k,
    Eu estou realizando esse projeto para o meu projeto no curso de eletrônica.
    Consegui montar tudo certinho, mas tem o porém. O se passar muitas vezes pelo sensor de saída ele começa a mostrar números negativos,EX: -1, -2. Eu olhei o código e não consegui encontrar algo para mudar isso.
    Vocês poderiam me ajudar com isso ?
    E outra pergunta, queria uma dica de onde esse projeto pode ser utilizado?
    Agradeço desde já k!

    ResponderExcluir
    Respostas
    1. Oi Mayke,

      O sensor de saída serve para contar as pessoas que saíram da sala. Se elas entraram, passaram pelo sensor de entrada, então teoricamente você não vai ter um valor negativo....

      De qualquer forma, você pode colocar um "if" para verificar se o contador é menor do que 0. Se for, ele continua em 0, exemplo:

      if (contagem_de_saida <= 0)
      { contagem_de_saida = 0; }

      Abraço!

      Excluir
  24. Olá , bom projeto ! gostaria de saber se : Instalado em uma porta, se a pessoa passar entrar pela porta, vai contar como entrada certo ? mas o de saida, que se encontra em paralelo vai contar como saída e vai voltar a 0 no contador? ou o primeiro que ativar vai anular o outro ? Aguardo resposta, muito obrigado !

    ResponderExcluir
    Respostas
    1. Boa noite,

      Pois é. Esse sistema que eu montei é para ser utilizado em ambientes que tem uma porta de entrada e outra de saída... No caso de uma porta só, você vai ter que montar uma lógica para ver qual sensor foi acionado primeiro, e assim aumentar ou diminuir o contador...

      Abraço!

      Excluir
  25. Olá, qual a distancia maxima que o led pode ficar do fototransistor?

    ResponderExcluir
  26. Qual a distancia maxima do led pro fototransistor?

    ResponderExcluir
    Respostas
    1. Boa noite Lucas,

      Com esse sensor do post especificamente ele chega somente a alguns centímetros, já que foi feito para ser usado em uma maquete.

      Mas existem outros sensores IR com alcance maior, como esse, também infravermelho, que alcança até 80cm: http://www.arduinoecia.com.br/2014/07/contador-sensor-de-proximidade-ir.html

      Abraço!

      Excluir
  27. ayuda... tengo montado el proyecto en arduino uno, pero no me lee las entradas y salidas, lo ir funcionan bien, tambien la pantalla, pero no se que pasa con los foto transistores...

    Saludos desde Colombia

    ResponderExcluir
    Respostas
    1. Buenas! :)

      Se ha intentado modificar los valores de la resistencia? O comprobar si la conexión de las resistencias es correcta?

      Saludos!

      Excluir
  28. Respostas
    1. Oi Isaias,

      Foi utilizado um Arduino Uno.

      Abraço!

      Excluir