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