Hace un tiempo atrás publique un video enseñando a cómo hacer un contador de aforo, y para que pueda funcionar aquel proyecto, los sensores tenía que estar instalados en dos puertas distintas, de entrada y salida. En la sección de comentarios de dicho video muchos de los suscriptores me sugerían que hiciera un contador cuyos sensores estén instalados en una sola puerta, que tenga la capacidad de contar a las personas que ingresan y que descuente a las personas que salen de un local. Y sí efectivamente hoy les enseñaré a cómo hacer este contador de aforo de una sola puerta, para este proyecto usaremos el microcontrolador ESP32 de esa manera tendremos muchas posibilidades de manejo ya sea a través de wifi o de bluetooth.
ESPECIFICACIONES TÉCNICAS
- Tensión de alimentación……………………….…………12VDC
- Corriente de alimentación………………….……………400mA
- Entradas digitales ……………………………………….…………2
- Salidas a transistor……………………………………………1
- Salidas para display de 7seg……………………………3
- Entorno de programación………………………..………..Arduino IDE
- Condiciones ambientales min……………………….….-40°
- Condiciones ambientales max…………………..……….150°
- Dimensiones de la pcb..…………………………………….70x70mm
- Dimensiones carcasa ..…………………………………..….240x140mm
- Empotrable………………………………….……………………Sí
ESQUEMÁTICO ELECTRÓNICO
LISTA DE MATERIALES
Categoría | Cantidad | Referencias | Valor | PCB Package |
Condensadores | 6 | C1,C4,C5,C9,C10,C11 | 100nF | 0603_CAP |
Condensadores | 1 | C2 | 220uF | CAP SMD 6.3X7.7MM ALUMINUM 220UF/16V |
Condensadores | 1 | C6 | 470uF | CAP SMD 10.5X10MM ALUMINUM 470UF/35V |
Condensadores | 1 | C7 | 100nF | 1206_CAP |
Condensadores | 1 | C8 | 1000uF | ELEC-RAD20 |
Resistencias | 2 | R2,R3 | 10k | 1206_RES |
Resistencias | 5 | R4,R5,R7,R9,R10 | 10k | 0603_RES |
Resistencias | 5 | R6,R11,R12,R13,R14 | 1k | 0603_RES |
Resistencias | 1 | R8 | 220 | 0603_RES |
Integrados | 1 | U1 | LD1117S33 | SOT230P700X180-4 |
Integrados | 3 | U2,U3,U5 | TLP127 | SOIC250P670X300-4 |
Integrados | 1 | U4 | 7805 | TO263-3S |
Integrados | 3 | U6,U8,U10 | ULN2803 | SO18W |
Integrados | 3 | U7,U9,U11 | 74HC595 | SO16 |
Integrados | 1 | U12 | ESP-32s | ESP-32S |
Integrados | 1 | U13 | CH340C | SO16 |
Transistores | 2 | Q2,Q3 | PMBT3904,215 | SOT23-3 |
Transistores | 1 | Q8 | MMBTA14G-AE3-R | SOT23-3 |
Miscelánea | 1 | J1 | MICRO USB B | MICRO USB B |
Miscelánea | 1 | J2 | PWR_IN | JACK POWER 12V V3 |
Miscelánea | 1 | J3 | PINREX 733-72-04TB10 | PINREX 733-72-04TB10 |
Miscelánea | 1 | J4 | molex 2 | MOLEX 2 PIN 90 GRADOS |
Miscelánea | 3 | J5,J6,J7 | PINREX 733-72-08TB10 | MOLEX 8 PIN RECTO |
CONEXIONES EXTERNAS
CODIGO
int clockpin = 5; //Cuando ay que leer los bit SH int data = 18; //Envio datos DS int latch = 19; //indica pin de salida en el chip ST // no cambiar el const int const int plus_sen = 34; // pin 2 como entrada para el sensor izquierdo const int less_sen = 35; // pin 3 como entrada para el sensor derecho //VARIABLES PARA EL CONTADOR ASCENDIENTE // estas variables si puede ser cambiado int counter = 1; //variable para poder idenficar si las personas salen o entran int contador = 0; //variable para poder contar la cantidad de las personas que ingresan y salen int contadorU = 0; //variable para el display unidades int contadorD = 0; //variable para el display decenas int contadorC = 0; //variable para el display decenas int state_plus = 0; // estado actual del pulsador int last_state_plus = 0; // estado del pulsado anterior int state_less = 0; // estado del pulsado actual int last_state_less = 0; // estado del pulsado anterior const int NUM[] = { // display B 63, //Numero 0 en binario es : 00111111 6, //Numero 1 en binario es : 00000110 91, //Numero 2 en binario es : 01011011 79, //Numero 3 en binario es : 01001111 102, //Numero 4 en binario es : 01100110 109, //Numero 5 en binario es : 01101101 125, //Numero 6 en binario es : 01111101 7, //Numero 7 en binario es : 00000111 127, //Numero 8 en binario es : 01111111 111, //Numero 9 en binario es : 01101111 63, //Numero 0 en binario es : 00111111 0, //Numero 0 en binario es : 00000000 }; int sir = 17; void setup() { pinMode(sir, OUTPUT); pinMode(plus_sen, INPUT); pinMode(less_sen, INPUT); pinMode(latch, OUTPUT); pinMode(clockpin, OUTPUT); pinMode(data, OUTPUT); digitalWrite(latch, LOW); shiftOut(data, clockpin, MSBFIRST, NUM[12]); // lee el arreglo y pasa cada NUM a lectura binaria shiftOut(data, clockpin, MSBFIRST, NUM[contador]); // lee el arreglo y pasa cada NUM a lectura binaria shiftOut(data, clockpin, MSBFIRST, NUM[contador]); // lee el arreglo y pasa cada NUM a lectura binaria // shiftOut(data, clockpin, MSBFIRST, NUM[contador]); // lee el arreglo y pasa cada NUM a lectura binaria digitalWrite(latch, HIGH); } void loop() { state_plus = digitalRead(plus_sen); state_less = digitalRead(less_sen); if (state_plus != last_state_plus) { if (state_plus == LOW) { if (counter == 3) { // si el counter es =3 entonces que decremente el valor counter counter--; } if (counter == 1) { // si el counter es =1 entonces que incremente el conteo ascedente de U y D if (contador < 999) { if (contadorU >= 10) { contadorU = 0; } if (contadorU >= 9) { contadorD++; } if (contadorD > 9) { contadorC++; contadorD = 0; } contador++; contadorU++; cont (); // lleva los datos a la funcion void(cont) } } if (counter > 0) { // si counter es mayor a 0 que decremente counter counter--; } } } last_state_plus = state_plus; if (state_less != last_state_less ) { if (state_less == LOW) { if (counter < 3) { // si el counter es menor a 3 entonces que incremente el valor counter counter++; } if (contador > 0) { // este es la condicion para que no se pase a numero negativos if (counter == 2) { // si el counter es = a 2 entonces que decremente el conteo contador--; contadorU--; if (contadorU == 0) { contadorU = 10; } if (contadorU == 9) { if (contadorD > 0) { contadorD--; if (contadorD == 0) { contadorD = 10; } } } if (contadorU == 9 && contadorD == 9) { if (contadorC > 0) { contadorC--; } } cont (); // lleva los datos a la funcion void(cont) } } } } last_state_less = state_less; if (contador == 60) { digitalWrite(sir, 1); } else if (contador < 60 ||contador > 60) { digitalWrite(sir, 0); } } void cont() { digitalWrite(latch, LOW); //manda en bajo al pin lach para permitir el envio de datos if (contadorC <= 0) { shiftOut(data, clockpin, MSBFIRST, NUM[12]); } else if (contadorC > 0) { shiftOut(data, clockpin, MSBFIRST, NUM[contadorC]); // manda los bits para mostrar en el display de decenas } shiftOut(data, clockpin, MSBFIRST, NUM[contadorD]); // manda los bits para mostrar en el display de decenas shiftOut(data, clockpin, MSBFIRST, NUM[contadorU]); // manda los bits para mostrar en el display de unidades digitalWrite(latch, HIGH);//manda en alto al pin lach para bloquear el envio de datos }