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.
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 aquipara 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 :
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 :
O funcionamento desse projeto você confere no vídeo abaixo :