9 de abril de 2023

Contador de Passagem com Entrada e Saída

Dois sensores infravermelho trabalhando em conjunto para identificar o sentido da passagem.


O projeto utilizou o sensor reflexivo TCRT5000, que é composto por um LED infravermelho e um fototransitor. E o módulo display TM1637.

A lógica de funcionamento é verificar qual sensor identificou primeiro o objeto e, então, saberemos o sentido da passagem.

Segue o esquema de ligação e o código fonte com comentários para entendimento.


 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
/*---------------------------------------------------------
  Programa : CONTADOR DE PASSAGEM COM ENTRADA E SAÍDA
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 21/03/2023
  ---------------------------------------------------------*/
#include <TM1637Display.h>  //https://github.com/avishorp/TM1637

//Definições dos pinos do módulo display TM1637
#define DISPLAY_CLK 2
#define DISPLAY_DIO 3

TM1637Display display(DISPLAY_CLK, DISPLAY_DIO);  //Inicializa a variável do display
const int sensor[2] = { 14, 15 };                 //Pinos dos sensores (A0, A1)
int avgSensorMax[2] = { 0, 0 };                   //Valor máximo de leitura dos sensores
long millisSensor1 = 0;                           //Controle do tempo da leitura do sensor 1
long millisSensor2 = 0;                           //Controle do tempo da leitura do sensor 2
int number = 0;                                   //Número que será exibido no display

void setup() {
  //Configura o brilho do display (0 a 7)
  display.setBrightness(2);

  //Registra o valores médios dos sensores sem obstáculos, subtraindo um valor como tolerância
  avgSensorMax[0] = AvgSensor(0) - 20;
  avgSensorMax[1] = AvgSensor(1) - 20;
}

void loop() {
  //Identificado no primeiro sensor
  if (AvgSensor(0) < avgSensorMax[0] && millisSensor1 == 0) {
    millisSensor1 = millis();
  }

  //Identificado no segundo sensor
  if (AvgSensor(1) < avgSensorMax[1] && millisSensor2 == 0) {
    millisSensor2 = millis();
  }

  //Identificado valores nos dois sensores
  if (millisSensor1 > 0 && millisSensor2 > 0) {
    if (millisSensor1 <= millisSensor2) {
      entryExit(true);
    } else if (millisSensor1 > millisSensor2) {
      entryExit(false);
    }
  }

  //Exibe o número no display
  display.showNumberDecEx(number);
}

int avgSensor(int sensorNum) {
  //Retorna a média da leitura do sensor
  int times = 100;
  long sum = 0;
  for (int i = 0; i < times; i++) {
    sum += analogRead(sensor[sensorNum]);
  }
  return sum / times;
}

void entryExit(bool entry) {
  if (entry) {
    number++;
  } else {
    number--;
  }
  if (number < 0 || number > 9999) number = 0;
  millisSensor1 = 0;
  millisSensor2 = 0;
  delay(500);
}

Nenhum comentário:

Postar um comentário