

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
}