

INTRODUCCIÓN
Aquí tenemos un contador de 4 dígitos y aquí están los sensores y a medida que van ingresando las personas el conteo se incrementa y cuando salen el conteo va decrementando. Y lo genial de este proyecto es que puedes ajustar el aforo. Además tiene la comunicación rs485 para integrar a cualquier sistema que tiene esa comunicación, por si fuera poco también cuenta con una sirena que suena cuando pasa el límite de aforo.
DATOS TECNICOS

- Tensión de alimentación……………………….…………12VDC
- Corriente de alimentación………………….……………500mA
- Entradas digitales “sensores” 12VDC………………2
- Pulsadores de configuracion de aforo………………1
- Puerto usb de programación……………………………..1
- Comunicacion Serial…………………………………………….1
- Comunicación I2C…………………………………………………1
- Comunicación ISP…………………………………………………1
- Rs485 Com……………………………………………………………..1
- Salida a alarma 12V externa………………………………….1
- Salida buzzer interno………………………………………………1
- Dimensiones…………………………………….…….………240x100mm
- Empotrable…………………………………………….………Sí
- Entorno de programación………………………..……..Arduino IDE
- Condiciones ambientales min………………………….-10°
- Condiciones ambientales max…………………..…….55°
DISEÑO PCB


LISTA DE COMPONENTES

Quantity | Comment | Designator | Footprint | Value | Manufacturer Part | Manufacturer | Supplier Part | Supplier |
1 | 3kHz | BUZZER1 | BUZ-TH_BD9.0-P5.00-D0.6-FD | 3kHz | HNB09A03 | 华能 | C96102 | LCSC |
15 | 100nF | C1,C3,C6,C7,C8,C9,C11,C12, C13,C14,C15,C16,C17,C18,C19 |
C0603 | 100nF | CC0603KRX7R9BB104 | YAGEO(国巨) | C14663 | LCSC |
1 | 47uF | C2 | C1206 | 47uF | CL31A476MPHNNNE | SAMSUNG(三星) | C96123 | LCSC |
1 | 470uF | C4 | CAP-SMD_BD10.0-L10.3-W10.3-LS11.3-FD | 470uF | VT1V471M1010 | ROQANG(容强) | C310845 | LCSC |
1 | 1uF | C5 | C1206 | 1uF | CL31B105KBHNNNE | SAMSUNG(三星) | C1848 | LCSC |
1 | 220uF | C10 | CAP-SMD_BD6.3-L6.6-W6.6-LS7.2-R-RD | 220uF | RVE1C221M0607 | ROQANG(容强) | C99836 | LCSC |
1 | 10uF | C20 | CAP-SMD_L3.2-W1.6-RD-C7171 | 10uF | TAJA106K016RNJ | Kyocera AVX | C7171 | LCSC |
3 | SS210 | D1,D2,D3 | SMA_L4.3-W2.6-LS5.2-RD | SS210 | MDD | C14996 | LCSC | |
1 | M7 | D4 | SMA_L4.3-W2.6-LS5.2-RD | M7 | MDD | C95872 | LCSC | |
1 | PZ254V-11-02P | H1 | HDR-TH_2P-P2.54-V-M | PZ254V-11-02P | XFCN(兴飞) | C492401 | LCSC | |
2 | 2.54-1*4 | H2,H4 | HDR-TH_4P-P2.54-V-M-1 | 2.54-1*4 | ZHOURI(洲日) | C5116483 | LCSC | |
1 | 2.54-1x6P直针 | H3 | HDR-TH_6P-P2.54-V-M-1 | 2.54-1x6P直针 | BOOMELE(博穆精密) | C37208 | LCSC | |
1 | 68uH | L1 | IND-SMD_L7.1-W6.6-1 | 68uH | PSPMAA0605H-680M-IGF | PROD(谱罗德) | C2983094 | LCSC |
4 | SM412301N | LED1,LED2,LED3,LED4 | LED-SEG-TH_10P-L48.7-W69.7-P2.54-S60.20-BL | SM412301N | ARKLED(方舟) | C164872 | LCSC | |
5 | WJ128V-5.0-2P | P1,P2,P3,P4,P5 | CONN-TH_2P-P5.00_WJ128V-5.0-2P | WJ128V-5.0-2P | KANGNEX(康奈克斯电气) | C8269 | LCSC | |
2 | MMBT3904 | Q1,Q2 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | MMBT3904 | CJ(江苏长电/长晶) | C20526 | LCSC | |
1 | D882 Y档160~320 | Q3 | SOT-89-3_L4.5-W2.5-P1.50-LS4.2-BR | D882 Y档160~320 | CJ(江苏长电/长晶) | C9634 | LCSC | |
2 | 2.2kΩ | R1,R2 | R0805 | 2.2kΩ | 0805W8F2201T5E | UNI-ROYAL(厚声) | C17520 | LCSC |
8 | 10kΩ | R3,R4,R12,R13,R14,R32,R42,R51 | R0603 | 10kΩ | 0603WAF1002T5E | UNI-ROYAL(厚声) | C25804 | LCSC |
28 | 240Ω | R5,R6,R7,R8,R9,R10,R11,R19,R20, R21,R22,R23,R24,R25,R33,R34, R35,R36,R37,R38,R39,R44,R45, R46,R47,R48,R49,R50 |
R1206 | 240Ω | 1206W4F2400T5E | UNI-ROYAL(厚声) | C17961 | LCSC |
6 | 1kΩ | R15,R16,R29,R30,R41,R43 | R0603 | 1kΩ | 0603WAF1001T5E | UNI-ROYAL(厚声) | C21190 | LCSC |
4 | 4.7kΩ | R17,R18,R26,R27 | R0805 | 4.7kΩ | 0805W8F4701T5E | UNI-ROYAL(厚声) | C17673 | LCSC |
1 | 120Ω | R28 | R0603 | 120Ω | 0603WAF1200T5E | UNI-ROYAL(厚声) | C22787 | LCSC |
1 | 1MΩ | R31 | R0603 | 1MΩ | 0603WAF1004T5E | UNI-ROYAL(厚声) | C22935 | LCSC |
1 | 120Ω | R40 | R1206 | 120Ω | 1206W4F1200T5E | UNI-ROYAL(厚声) | C17909 | LCSC |
4 | TS-1187A-B-A-B | SW1,SW2,SW3,SW5 | SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL-2 | TS-1187A-B-A-B | XKB Connectivity(中国星坤) | C318884 | LCSC | |
1 | MST22D18G2 125 | SW4 | SW-SMD_MST22D18G2 | MST22D18G2 125 | SHOU HAN(首韩) | C2906280 | LCSC | |
4 | Test-Point | TP1,TP2,TP3,TP4 | Test-Point-0.5mm | |||||
4 | 74HC595D,118 | U1,U6,U10,U13 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | 74HC595D,118 | Nexperia(安世) | C5947 | LCSC | |
4 | ULN2003ADR | U2,U7,U11,U14 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | ULN2003ADR | TI(德州仪器) | C7512 | LCSC | |
2 | EL357N(C)(TA)-G | U3,U4 | OPTO-SMD-4_L4.4-W4.1-P2.54-LS7.0-TL | EL357N(C)(TA)-G | EVERLIGHT(亿光) | C29981 | LCSC | |
1 | XL1509-5.0E1 | U5 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | XL1509-5.0E1 | XLSEMI(芯龙) | C61063 | LCSC | |
1 | MAX485CSA+T | U8 | SOIC-8_L4.9-W3.9-P1.27-LS6.0-BL | MAX485CSA+T | ADI(亚德诺)/MAXIM(美信) | C9945 | LCSC | |
1 | CH340C | U9 | SOP-16_L10.0-W3.9-P1.27-LS6.0-BL | CH340C | WCH(南京沁恒) | C84681 | LCSC | |
1 | ATMEGA328P-AU | U12 | TQFP-32_L7.0-W7.0-P0.80-LS9.0-BL | ATMEGA328P-AU | MICROCHIP(美国微芯) | C14877 | LCSC | |
1 | USB-TYPE-C-018 | USB1 | USB-C_SMD-TYPE-C-31-M-12 | USB-TYPE-C-018 | DEALON(德艺隆) | C2927038 | LCSC | |
1 | 16MHz | X1 | OSC-SMD_3P-L3.2-W1.3-P0.95-L | 16MHz | CSTCE16M0V53-R0 | muRata(村田) | C32180 | LCSC |
COMO SUBIR BOOTLOADER

PASO 1 : SUBIR PROGRAMA BOOTLOADER A UN ARDUINO UNO
Primero subimos este código BOOTLOADER a un arduino UNO como normalmente subimos cualquier programa a nuestra placa arduino UNO.
PASO 2 : CABLEADO PARA SUBIR GESTOR DE ARRANQUE (BOOTLOADER)
Despues de haber subido el programa anterior, ahora vamos aquemar el gestor de arranque al nuevo microcontrolador que tiene nuestro plc.
Recuerden que para poder usar un microcontrolador nuevo (atmega328P-AU), es necesario subir un gestor de arranque como también llamado “BOOTLOADER”, esto nos facilitará subir programas en futuras ocasiones. Especialmente cuando se quiere programar desde el IDE de arduino.
finalmente para quemar el bootloader se tendrá que realizar a través de los pines ISP, que prácticamente serían los pines [(MOSI=PIN 11) (MISO = PIN 12) (SCK=PIN 13) (Slave=PIN 10)]. Para subir y quemar el gestor de arranque necesitaremos un arduino UNO ó MEGA y realizar las siguientes conexiones (ARDUINO UNO – Contador). OJO que este paso solo se hace una sola vez.
CODIGO ARDUINO

#include <EEPROM.h> int clockpin = 12; //Cuando ay que leer los bit SH int data = 7; //Envio datos DS int latch = 11; //indica pin de salida en el chip ST // no cambiar el const int const int senIN = 2; // pin 2 como entrada para el sensor de entrada de personas const int senOUT = 3; // pin 3 como entrada para el sensor de salida de personas const int minus = 4; // para descontar la capacidad const int ok = 5; const int add = 6; int last_ok = 0; byte stateOk = 0; bool stateConfigAforo = false; int last_state_senIN = 0; // estado del pulsado anterior int last_state_senOUT = 0; // estado del pulsado anterior unsigned int contador = 0; bool stateIN = false; bool stateOUT = false; int aforo = 50; int direc_aforo = 0; const int buzzer = 9; const int sir = 10; byte contadorDisplay[4] = { 0, 0, 0, 0 }; const int NUM[] = { 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 64, //Numero 0 en binario es : 01000000 0, //Numero 0 en binario es : 00000000 }; void setup() { Serial.begin(9600); pinMode(latch, OUTPUT); pinMode(clockpin, OUTPUT); pinMode(data, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(sir, OUTPUT); pinMode(senIN, INPUT); pinMode(senOUT, INPUT); pinMode(minus, INPUT); pinMode(ok, INPUT); pinMode(add, INPUT); EEPROM.get(direc_aforo, aforo); } void loop() { //Serial.println(aforo); if (digitalRead(ok) != last_ok) { if (digitalRead(ok) == LOW) { stateOk++; delay(250); } } last_ok = digitalRead(ok); switch (stateOk) { case 1: stateConfigAforo = true; break; case 2: stateConfigAforo = false; stateOk = 0; break; } if (stateConfigAforo == false) { if (digitalRead(senIN) != last_state_senIN) { if (digitalRead(senIN) == LOW) { if (stateOUT == true) { if (contador > 0) { contador--; } stateOUT = false; } else stateIN = true; } } last_state_senIN = digitalRead(senIN); if (digitalRead(senOUT) != last_state_senOUT) { if (digitalRead(senOUT) == LOW) { if (stateIN == true) { if (contador < 9999) { contador++; } stateIN = false; } else stateOUT = true; } } last_state_senOUT = digitalRead(senOUT); if (contador >= aforo) { tone(buzzer, 5000); // Pin 9, frecuencia digitalWrite(sir, 1); } else { noTone(buzzer); digitalWrite(sir, 0); } convert(); } if (stateConfigAforo == true) { configAforo(); noTone(buzzer); digitalWrite(sir, 0); } } void configAforo() { if (digitalRead(add) == 1) { if (aforo < 9999) { aforo++; } delay(150); } else if (digitalRead(minus) == 1) { if (aforo > 0) { aforo--; } delay(150); } EEPROM.put(direc_aforo, aforo); convert(); } void convert() { if (stateConfigAforo == false) { contadorDisplay[0] = contador % 10; //unidades contadorDisplay[1] = (contador / 10) % 10; //decenas contadorDisplay[2] = (contador / 100) % 10; //centenas contadorDisplay[3] = (contador / 1000); //millar } if (stateConfigAforo == true) { contadorDisplay[0] = aforo % 10; //unidades contadorDisplay[1] = (aforo / 10) % 10; //decenas contadorDisplay[2] = (aforo / 100) % 10; //centenas contadorDisplay[3] = (aforo / 1000); //millar } cont(); } void cont() { digitalWrite(latch, LOW); shiftOut(data, clockpin, MSBFIRST, NUM[contadorDisplay[0]]); //und shiftOut(data, clockpin, MSBFIRST, NUM[contadorDisplay[1]]); // dec shiftOut(data, clockpin, MSBFIRST, NUM[contadorDisplay[2]]); //und shiftOut(data, clockpin, MSBFIRST, NUM[contadorDisplay[3]]); // dec digitalWrite(latch, HIGH); }