I11 - Contador de visitantes com leds infravermelhos e Arduino

Intermediário - Projeto 11

Contador de acessos utilizando leds infravermelhos e Arduino

Objetivo

O objetivo deste projeto é criar um sistema de contagem de visitantes que entram e saem de uma sala. O sistema usará o Arduino e leds infravermelhos (receptores e emissores) para a contagem, e os dados serão exibidos em um display de LCD. Quando a sala ultrapassa o limite permitido de visitantes, o alarme é acionado.

Definições

Led Emissor Infravermelho (IR): Led que emite um sinal IR (infrared ou infravermelho) que pode ser reconhecido por um componente receptor IR. Projetado para emitir sinais infravermelhos em dispositivos remotos e se conectarem em uma placa microcontroladora. A faixa de luz emitida pelo led emissor, cujo comprimento de onda é de aproximadamente 940nm, não é perceptível ao olho humano.

Led Receptor (IR) - Fototransistor: Componente eletrônico que atua como um fotodiodo, permitindo a passagem de corrente elétrica somente com a presença de luz. O fototransistor é parecido com um transistor tradicional, possuindo 2 terminais sendo um o coletor e o outro o emissor, entretanto, a sua base base é ativada pela incidência de radiação infravermelha e não por um sinal digital.


Aplicação

Para fins didáticos e projetos de alarmes, interruptores, detecção de presença, detecção de obstáculos, contagem de elementos em uma esteira transportadora, controle remoto e sistemas robóticos.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 400 pontos

Jumpers Kit cabos ligação macho / macho 1  
Led emissor IR

Led emissor IR 3mm ou 5mm

1

–Tensão de operação: 1,2 a 1,4VDC
–Corrente de operação: 20mA
–Comprimento da onda: 940nm

Fototransistor

Fototransistor 3mm ou 5mm

1

– Tensão de operação: 1,1 a 1,4VDC
– Corrente de operação: 10mA
– Potência máxima: 60mW
– Comprimento da onda: 940nm

Display LCD Display LCD 16X2 1

LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)

O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)

Módulo I2C para display LCD

Módulo I2C com CI PCF8574

(opcional)

1 Módulo I2C display LCD Arduino

O módulo I2C poderá vir separado ou já soldado no display LCD

(datasheet)

Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador.

Led 5mm Led 5mm 2

2 LEDs alto brilho ou difuso, sendo um verde e um vermelho

Você poderá utilizar também LEDs de 3 ou 5 mm na cor que desejar.

Resistor Resistor 150Ω 4

Resistores de 150Ω ou superior

(usar nos leds emissores e nos leds comuns)

Resistor Resistor 10KΩ 2

2 Resistor de 4,7KΩ a 10KΩ

(usar no fototransistor)

 

Buzzer Buzzer ativo 5V 12mm 1

Utilize buzzer, módulo buzzer, auto falante ou um disco piezoelétrico

Arduino UNO Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.

Atenção

1. Neste projeto vamos utilizar um display LCD 16x2 com controlador HD44780, que se adapta aos mais diversos projetos com vários modelos de placas e microcontroladores. Este display possui 16 colunas por 2 linhas com backlight (luz de fundo) verde, azul ou vermelha e tem 16 pinos para a conexão. Atenção: Utilize um display LCD com os pinos soldados.

2. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 / 20X4:

Módulo I2C - Detalhes

2.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo com onde temos as principais placas Arduino e suas conexões com o I2C.

2.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.

2.3. A seleção de endereço do adaptador I2C para display LCD, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x27. Se você não sabe qual endereço que o seu módulo I2C e/ou módulo RTC DS3231 está configurado, baixe o seguinte "sketch":

DOWNLOAD - I2C_scanner.ino

2.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C e o módulo RTC DS3231 está configurado:

2.3.1.1 Nos casos em que módulo I2C estiver configurado com uma faixa de endereços diferente do endereço 0X27 altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.

2.4. Para saber mais sobre a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.

3. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

3.1. Portanto, faça a conexão do Arduino no terminal positivo do led (anodo) e o GND no terminal negativo (catodo).

3.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.

4. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Leds ligados em série e em paralelo.

4.1. Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω

5. O buzzer tem polaridade. Portando, cuidado para não ligar o buzzer invertido. Se você retirar o adesivo superior do buzzzer poderá ver um sinal de positivo (+). Este sinal mostra onde está o pino positivo do componente que deverá estar conectado ao Arduino:

6. Agora monte os leds infravermelhos conforme orientações abaixo:

6.1. É importante salientar que o led emissor tem polaridade. Portanto, conecte o terminal positivo (anodo) no Vcc (5V) e o terminal negativo (catodo) no GND.

6.1.1. Para evitar danos ao led emissor, é necessário incluir um resistor igual ou superior a 100Ω. No nosso exemplo utilizamos resistores de 150Ω.

6.1.2. O resistor funciona como um limitador de corrente do circuito e poderá portanto, estar conectado em qualquer terminal do led, seja positivo ou negativo.

6.2. O Fototransistor funciona de forma similar que um transistor NPN, ou seja, é constituído de Base, Coletor e Emissor. Ao receber luz infravermelha, o fototransistor é ativado após saturação, enviando um sinal de baixo nível (LOW) para o Arduino.

6.2.1. Antes da montagem, observe com atenção a posição dos terminais do led fototransistor:

- Coletor: terminal mais curto (C);
- Emissor: terminal mais comprido (E);

6.2.2. Para a montagem do fototransistor, conecte o terminal maior (E - emissor) no GND e o terminal menor ou o lado com chanfro (C - coletor) em um pino analógico do Arduino. No nosso exemplo utilizamos as portas analógicas A1 e A2.

6.2.3. Para que haja estabilidade na recepção dos sinais será necessário a inclusão de um resistor entre 4,7KΩ e 10KΩ conectado no terminal do coletor do fototransistor (terminal mais curto) e no VCC (5V). Veja a imagem abaixo:

6.2.4. Conexão com o pino analógico do Arduino: o fototransistor envia um sinal analógico para o Arduino que será convertido em sinal digital através do ADC (Conversor Analógico Digital). Entretanto, podemos fazer a leitura digital do pino analógico através da função digitalRead(), onde será enviado um sinal de baixo ou de alto nível, dependendo se o fototransistor está recebendo ou não a luz infravermelha. Veja as condições abaixo:

6.2.4.1. Quando o fototransistor é bloqueado, ou seja, não recebe luz infravermelha, o valor enviado será 1 (HIGH). Entretanto, como a luz ambiente também emite radiação infravermelha, o fototransistor pode receber esta radiação e não acusar o bloqueio, mesmo com o filtro de luz que existe no componente. Portanto, o monitoramento da luz ambiente poderá ser necessário.

 6.2.4.2. Quando o fototransistor volta a receber luz infravermelha ele é ativado e envia um sinal de baixo nível 0 (LOW) para o Arduino.

6.3. Veja o esquema elétrico abaixo para a conexão de um sensor no Arduino. No nosso exemplo utilizamos R1 = 150Ω e R2 = 10KΩ

Sensor de Proximidade Simples

6. A montagem do nosso projeto foi realizada em um protoboard de 400 pontos e 2 mini-protoboards. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas.

Incluindo biblioteca LiquidCrystal_I2C

Atenção: Caso você opte pela utilização do display de LCD sem o módulo I2C, siga os procedimentos do Projeto 38 - Controlando um display LCD (instalação e comandos básicos) e não instale a biblioteca abaixo.

Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação. Veja a tabela Coletânea de bibliotecas para módulos.

Download dos arquivos da biblioteca LiquidCrystal_I2C

 DOWNLOAD - NewliquidCrystal_1.3.4.zip

Para saber detalhes desta biblioteca clique aqui.

Instalando a biblioteca pelo IDE do Arduino

Após fazer o download do arquivo NewliquidCrystal_1.3.4.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.

Utilizando a biblioteca LiquidCrystal_I2C

Para instalação e utilização da biblioteca para o módulo I2C como comunicação para um display LCD siga o tutorial: Projeto 48 - Como controlar um display LCD com o módulo I2C

Código do Projeto (Sketch)

1) Faça o dowload e abra o arquivo projetoI11.ino no IDE do Arduino:  DOWNLOAD - projetoI11.ino

Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto. - Veja o tutorial Projeto 48 - Como controlar um display LCD com o módulo I2C

Obs. 2: Se estiver utilizando um display de LCD 20 X 4, altere o comando da linha 36 para lcd.begin (20,4);

Obs. 3: Se não possuir o módulo I2C utilize apenas o display LCD conforme Projeto 38 - Controlando um display LCD (instalação e comandos básicos).

Ou se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto I11 - Controle de visitantes - Arduino
*    Data: 11/03/2021
*    Autor: Angelo Luis Ferreira
*            http://squids.com.br/arduino
*
*******************************************************************************/
#include //Carrega a biblioteca lcd com I2C

//Define os pinos que serão utilizados para ligação ao display
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

// hardware - conexões
const byte pinoFotoEntradaSala = A1; // Pino analógico conectado ao fototransistor
const byte pinoFotoSaidaSala = A2; // Pino analógico conectado ao fototransistor
const byte pinoLedVerde = 12; // led verde
const byte pinoLedVermelho = 11; // led vermelho
const byte pinoBuzzer = 7; // buzzer
const byte pinoButton = 3; // push button

// variáveis
int toneVal = 0;
int toneAdjustment = 2000;
float sinVal;

int entrada = 0;
int saida = 0;

int contaSala = 0;
int limite = 10;

byte e = 0; // controle entrada
byte s = 0; // controle saíd

// =====================================================================================
// configuração inicial
void setup(){
  Serial.begin(9600); //Inicialização do monitor serial
  lcd.begin(16, 2); // Define o display com 16 colunas e 2 linhas
  lcd.clear();
  pinMode(pinoFotoEntradaSala, INPUT); //Define o pino como entrada no Arduino
  pinMode(pinoFotoSaidaSala, INPUT); //Define o pino como entrada no Arduino
  pinMode(pinoLedVerde, OUTPUT); // Define o pino como saída do Arduino
  pinMode(pinoLedVermelho, OUTPUT); // Define o pino como saída do Arduino
  pinMode(pinoButton, INPUT_PULLUP); // Defino o pino de entrada Arduino com pullup interno

  noTone(pinoBuzzer); // interrompe o tom 

  // acende led verde
  acendeLed();

  // mostra no lcd
  lcd.clear();
  show();
}

// =====================================================================================
// loop infinito
void loop(){

  entra(); // verifica acesso a entrada
  sai(); // verificar acesso a saída
  
  if (e == 2) {
    entrada++;
    show();
  }
  if (s == 2) {
    saida++;
    show();
  }

  // verifica se número de visitantes é maior que o limite
  if (contaSala > limite) sirene();

  // verifica se os dois sensores foram ativados
  if (s == 1 || e == 1) { // apenas um sensor foi ativoado
    ajustaSensores();
  } else zera(); // zera tudo se pressionar o botão
}

// FUNÇÕES ======================================================================================

// ajusta sensores
void ajustaSensores() {
   apagaLeds();
   
  if (!digitalRead(pinoButton)) {
    e = 0;
    s = 0;
    acendeLed();
    while (!digitalRead(pinoButton)) {}
    delay(50);
    monitora();
  }
}

// acessa sensor de entrada (primeiro sensor ao entrar)
void entra() {
   // verifica sensor de entrada
  if (digitalRead(pinoFotoEntradaSala)) {
    while (digitalRead(pinoFotoEntradaSala)) {} // aguarda passar pelo sensor   
     delay(50);          
     if (e == 0 && s == 0) {
      e = 1;
     } else if (e == 0 && s == 1) {
      s = 2;
     } else {
      e = 1;
      s = 0;
     }
    monitora(); 
 }
}

// acessa sensor de saída (primeiro sensor ao sair)
void sai() {
  // verifica sensor de saida
  if (digitalRead(pinoFotoSaidaSala)) {
    while (digitalRead(pinoFotoSaidaSala)) {} // aguarda passar pelo sensor
    delay(50);       
    
    if (s == 0 && e == 0) {
      s = 1;
     } else if (s == 0  && e == 1) {
      e = 2;
     } else {
      e = 0;
      s = 1;
     }
   monitora(); 
  } 
}

// zera tudo ao pressionar o botão
void zera() {
  if (!digitalRead(pinoButton)) {
    e = 0;
    s = 0;
    entrada = 0;
    saida = 0;
    contaSala = 0;
    show();
    while (!digitalRead(pinoButton)) {}
    delay(50);
    monitora();
  }
}

// mostra no lcd
void show() {
  calcula();
  tone(pinoBuzzer, 500);
  lcd.clear();
  // mostra número de pessoas dentro da sala
  lcd.setCursor(0,0);
  lcd.print("Na Sala: ");
  lcd.setCursor(9,0);
  lcd.print(contaSala);
  if (contaSala >= limite) {
    lcd.setCursor(13,0);
    lcd.print("LOT");
    if (contaSala > limite) sirene();
  } else {
    lcd.setCursor(12,0);
    lcd.print("L:");
    lcd.setCursor(14,0);
    lcd.print(limite - contaSala);    
  }
  noTone(pinoBuzzer); // interrompe o tom   
  // mostra número de pessoas que entraram
  lcd.setCursor(0,1);
  lcd.print("Ent: ");
  lcd.setCursor(5,1);
  lcd.print(entrada);
  // mostra número de pessoas que sairam
  lcd.setCursor(9,1);
  lcd.print("Sai: ");
  lcd.setCursor(14,1);
  lcd.print(saida);
  apagaLeds();
  delay(500);
  acendeLed();
  e = 0;
  s = 0;   
}

// calucla o número de visitantes na sala
void calcula() {
  // calcula o número de visitantes dentro da sala
  contaSala = entrada - saida;
  if (contaSala < 0) {
    contaSala = 0;
    saida = entrada;    
  }
}

// acende led Verde ou vermelho
void acendeLed() {
  if (contaSala >= limite) {
    digitalWrite(pinoLedVermelho, 1);
  } else {
    digitalWrite(pinoLedVerde, 1);
  }  
}

// apaga leds
void apagaLeds() {
  digitalWrite(pinoLedVerde, LOW);
  digitalWrite(pinoLedVermelho, LOW);
}

 // função sirene
void sirene(){
  //tocar
   tone(pinoBuzzer, 100); 
   delay(0);   
   noTone(pinoBuzzer); // interrompe o tom        
  }

// monitora "s" e "e"
void monitora() {
    Serial.print(e);
    Serial.print(" | ");
    Serial.println(s);
}

Vídeo

 

Como o projeto deve funcionar

1. Ao iniciar o programa, aparecerá na tela do display LCD os valores zerados para:  visitantes dentro da sala (Na Sala), visitantes que entraram na sala (Ent) e visitantes que saíram da sala (Sai). Mostra também quantos visitantes poderão entrar na sala, que no caso são 10 visitantes livres (L).

2. Ao passar no sentido de entrada (na figura abaixo - entra), o programa irá incrementar em 1 o número de visitantes que entram na sala e ao passar no sentido de saída (na figura abaixo - sai), os sensores irão incrementar em 1 os visitantes que saem da sala. Também serão exibidos no display LCD o total de pessoas que estão na sala (Na Sala) e o número de visitantes que ainda podem entrar (L).

2.2.1. Os visitantes somente podem entrar ou sair da sala quando o led verde estiver aceso.

 3. Quando a sala atingir o limite de visitantes, o led vermelho ficará aceso. Isto significa que visitantes não podem mais entrar na sala, somente podem sair.

 

4. Caso entre visitantes com o led vermelho aceso, um alarme irá ser disparado pelo buzzer.  Para desarmar o alarme, visitantes devem sair da sala para atingir o limite permitido.

5. ATENÇÃO: Para que o projeto funcione corretamente, é necessário que haja um alinhamento entre os emissores e os receptores. Poderá haver também uma interferência pela luz ambiente. Neste caso, procure reduzir a iluminação externa aos sensores.

5.1. Para monitorar se os sensores estão funcionando corretamente, abra o Monitor Serial. O número a esquerda representa o sensor de entrada, que pode ser 0 (não acionado), 1 (acionado 1 vez), 2 (quando os dois sensores forem acionados, porém, o sensor de entrada foi acionado primeiro). Já o número da direita representa o sensor de saída, que pode ser 0 (não acionado), 1 (acionado 1 vez), 2 (quando os dois sensores forem acionados, porém, o sensor de saída foi acionado primeiro).

 

 5.2. Sensor de entrada e sensor de saída

 

6. Reset: Para zerar todos valores, clique no botão (push button).

7. Correção: Podem ocorrer falhas quando o programa faz a leitura de apenas um sensor, por exemplo. Neste caso, se houver falha, os dois leds ficarão apagados. Para corrigir, clique no botão (push button) e espere o led verde ou vermelho acender para dar continuidade.

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores