¿Me creerían si les digo que este único sensor es capaz de medir el nivel de agua en una represa, un tanque de agua, un tanque de aceite, y muchos otros lugares similares?
Para demostrar su funcionamiento, utilizaremos este tubo con agua de más de dos metros de profundidad. Vamos a sumergirlo poco a poco, y podrán observar en el control cómo se muestra el nivel de agua. Es importante recordar que este sensor mide la profundidad del agua, por lo que el porcentaje no cambia, sin importar la cantidad de litros.
De todas maneras, no se preocupen, a lo largo del video les explicaré esto con mayor claridad. Lo mejor de todo es que este sistema cuenta con tres salidas programables que pueden activarse según el nivel del líquido. Estas salidas se pueden utilizar para controlar una bomba de agua, una electroválvula o incluso una sirena, especialmente cuando el nivel del líquido es bajo.
¿Te gustaría aprender cómo realizar este proyecto desde cero? Incluyendo el diseño del esquemático, la PCB y la carcasa.
DATOS TÉCNICOS

- Tensión de alimentación……………………….…………100-240Vac
- Corriente de alimentación………………….……………330mA
- Entrada analógica“sensor de nivel” ……………………1
- Pulsadores de configuracion de aforo………………Sí
- Puerto programacion ISP……………………………………Sí
- Pantalla displays 4dig……………………………………………….Sí
- Barra de led señalizadores de nivel de agua……….Sí
- Entorno de programación-………………………………………..Arduino IDE
- Condiciones ambientales min………………………….-10°
- Condiciones ambientales max…………………..…….55°
- Salida a triac 5A……………………………………………1
- Salidas RLY…………………………………………………2
-
- Tensión AC…………..……….………………….….……250V
- Corriente AC…………………………………………….5A
- Tensión DC………………………………………………30V
- Corriente DC……………………………………………5A
DISEÑO PCB

LISTA DE MATERIALES

Quantity | Comment | Designator | Footprint | Value | Manufacturer Part | Manufacturer | Supplier Part |
1 | 3kHz | BUZZER1 | BUZ-TH_BD9.0-P5.00-D0.6-FD | 3kHz | HNB09A03 | 华能 | C96102 |
11 | 100nF | C1,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 | C0603 | 100nF | CC0603KRX7R9BB104 | YAGEO(国巨) | C14663 |
1 | 10uF | C2 | CAP-SMD_L3.2-W1.6-RD-C7171 | 10uF | TAJA106K016RNJ | Kyocera AVX | C7171 |
1 | 100nF | C13 | CAP-TH_L12.0-W4.0-P10.00-D0.6 | 100nF | CFC2E104JE1I120B5100 | Dersonic(德尔创) | C2681661 |
2 | 1uF | C14,C17 | C1206 | 1uF | CL31B105KBHNNNE | SAMSUNG(三星) | C1848 |
1 | 100uF | C15 | CAP-SMD_BD6.3-L6.6-W6.6-LS7.6-FD | 100uF | RVT1V101M0607 | ROQANG(容强) | C72478 |
1 | 470uF | C16 | CAP-SMD_BD10.0-L10.3-W10.3-LS11.3-FD | 470uF | VT1V471M1010 | ROQANG(容强) | C310845 |
1 | 220uF | C18 | CAP-SMD_BD6.3-L6.6-W6.6-LS7.2-R-RD | 220uF | RVE1C221M0607 | ROQANG(容强) | C99836 |
4 | WJ2EDGR-5.08-2P | CN1,CN2,CN4,CN5 | CONN-TH_WJ2EDGR-5.08-2P | WJ2EDGR-5.08-2P | KANGNEX(康奈克斯电气) | C8383 | |
1 | WJ2EDGR-5.08-3P | CN3 | CONN-TH_3P-P5.08_WJ2EDGR-5.08-3P | WJ2EDGR-5.08-3P | KANGNEX(康奈克斯电气) | C70914 | |
2 | 1N4148WS | D1,D2 | SOD-323_L1.8-W1.3-LS2.5-RD | 1N4148WS | CJ(江苏长电/长晶) | C2128 | |
1 | BZT52C5V1 | D3 | SOD-123_L2.7-W1.6-LS3.7-RD | BZT52C5V1 | MDD | C173407 | |
4 | SS210 | D4,D5,D6,D7 | SMA_L4.3-W2.6-LS5.2-RD | SS210 | MDD | C14996 | |
1 | 5x20BLX-A型保险丝支架XC-7 | F1 | FUSE-TH_L22.6-W9.0 | 5x20BLX-A型保险丝支架XC-7 | xcfuse(旭程) | C3131 | |
1 | 2.54-1x6P直针 | H1 | HDR-TH_6P-P2.54-V-M-1 | 2.54-1x6P直针 | BOOMELE(博穆精密) | C37208 | |
1 | 15.5*10.5*24 | HS1 | HEATSINK-TH_L15.5-W10.5-XSD1226-005 | 15.5*10.5*24 | XSD(鑫顺达) | C108928 | |
4 | TSA063G60-250 | KEY1,KEY2,KEY3,KEY4 | KEY-SMD_4P-L6.1-W6.1-P4.50-LS9.0 | TSA063G60-250 | BRIGHT(博瑞泰) | C294566 | |
1 | 68uH | L1 | IND-SMD_L7.1-W6.6-1 | 68uH | PSPMAA0605H-680M-IGF | PROD(谱罗德) | C2983094 |
1 | XL-502SURC | LED1 | LED-TH_BD5.9-P2.54-FD-1 | XL-502SURC | XINGLIGHT(成兴光) | C2895484 | |
1 | FJ4401AH | LED2 | LED-SEG-TH_12P-L40.4-W16.0-P2.54-S12.70-BL | FJ4401AH | 志浩 | C28536 | |
1 | barra_leds | LED3 | barra_de_leds | ||||
3 | MMBT3904 | Q1,Q2,Q3 | SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR | MMBT3904 | CJ(江苏长电/长晶) | C20526 | |
1 | BTA16-600CWRG | Q4 | TO-220-3_L10.0-W4.5-P2.54-T | BTA16-600CWRG | ST(意法半导体) | C84597 | |
3 | 120Ω | R1,R41,R43 | R1206 | 120Ω | 1206W4F1200T5E | UNI-ROYAL(厚声) | C17909 |
3 | 1kΩ | R2,R13,R24 | R0603 | 1kΩ | 0603WAF1001T5E | UNI-ROYAL(厚声) | C21190 |
12 | 10kΩ | R3,R4,R5,R6,R7,R8,R12, R14,R23,R27,R38,R42 |
R0603 | 10kΩ | 0603WAF1002T5E | UNI-ROYAL(厚声) | C25804 |
1 | 1MΩ | R9 | R0603 | 1MΩ | 0603WAF1004T5E | UNI-ROYAL(厚声) | C22935 |
13 | 470Ω | R10,R22,R25,R26,R28,R29, R30,R31,R32,R33,R34,R35,R36 |
R0805 | 470Ω | 0805W8F4700T5E | UNI-ROYAL(厚声) | C17710 |
9 | 220Ω | R11,R15,R16,R17,R18,R19, R20,R21,R40 |
R0603 | 220Ω | 0603WAF2200T5E | UNI-ROYAL(厚声) | C22962 |
2 | 4.7kΩ | R37,R39 | R0805 | 4.7kΩ | 0805W8F4701T5E | UNI-ROYAL(厚声) | C17673 |
2 | SRD-24VDC-SL-C | RLY1,RLY2 | RELAY-TH_SRD-XXVDC-XL-C | SRD-24VDC-SL-C | 松乐 | C15840 | |
1 | TS-1187A-B-A-B | SW1 | SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL-2 | TS-1187A-B-A-B | XKB Connectivity(中国星坤) | C318884 | |
2 | Test-Point | TP1,TP2 | Test-Point-0.5mm | ||||
1 | ATMEGA328P-AU | U1 | TQFP-32_L7.0-W7.0-P0.80-LS9.0-BL | ATMEGA328P-AU | MICROCHIP(美国微芯) | C14877 | |
2 | EL357N(C)(TA)-G | U2,U4 | OPTO-SMD-4_L4.4-W4.1-P2.54-LS7.0-TL | EL357N(C)(TA)-G | EVERLIGHT(亿光) | C29981 | |
3 | 74HC595D,118 | U3,U5,U6 | SOIC-16_L9.9-W3.9-P1.27-LS6.0-BL | 74HC595D,118 | Nexperia(安世) | C5947 | |
1 | MOC3083S-TA1 | U7 | SMD-6_L7.3-W6.5-P2.54-LS10.2-BL | MOC3083S-TA1 | LITEON(光宝) | C115474 | |
1 | TAS10-24-NH | U8 | PWRM-TH_TAS10-XX-NH | TAS10-24-NH | TDPOWER(腾达电源) | C570975 | |
1 | LM2594M-5.0 | U9 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | LM2594M-5.0 | UMW(友台半导体) | C2904795 | |
1 | LM358DR2G | U10 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | LM358DR2G | ON(安森美) | C7950 | |
1 | 10D561K | VR1 | RES-TH_L13.0-W6.0-P7.50-D0.9-S6.00 | 10D561K | HEL(鸿志) | C113236 | |
1 | 16MHz | X1 | OSC-SMD_3P-L3.2-W1.3-P0.95-L | 16MHz | CSTCE16M0V53-R0 | muRata(村田) | C32180 |
CODIGO

#include <EEPROM.h> // para los displays int clockpin = 12; //Cuando ay que leer los bit SH int data = 17; //Envio datos DS int latch = 18; //indica pin de salida en el chip ST // para los leds de nivel int clockpinLeds = 9; //Cuando ay que leer los bit SH int dataLeds = 10; //Envio datos DS int latchLeds = 11; //indica pin de salida en el chip ST #define led9 6 //led del 90% #define led10 7 // led del 100% int valorAnalogicodisplays = 0; unsigned int contadorSegments = 0; byte segmentsDisplays[4] = { 0, 0, 0, 0 }; const int SEG[] = { 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 }; byte digitsDisplays[4] = { 0, 0, 0, 0 }; const int DIG[] = { 255, //Numero 0 en binario es : 11111111 254, //Numero 0 en binario es : 11111110 253, //Numero 1 en binario es : 11111101 251, //Numero 2 en binario es : 11111011 247, //Numero 3 en binario es : 11110111 }; byte contadorLeds = 0; const int leds[] = { 0, //Numero 1 en binario es : 00000000 1, //Numero 1 en binario es : 00000001 3, //Numero 1 en binario es : 00000011 7, //Numero 2 en binario es : 00000111 15, //Numero 3 en binario es : 00001111 31, //Numero 4 en binario es : 00011111 63, //Numero 5 en binario es : 00111111 127, //Numero 6 en binario es : 01111111 255, //Numero 7 en binario es : 11111111 }; #define programLed 8 //led del limite de programacion #define buzzer 13 // buzzer #define rly1 14 // relay1 #define rly2 15 // relay2 #define Triac 16 // triac const int entradaAnalogica = A5; const int botonSet = 2; const int botonArriba = 3; const int botonAbajo = 4; const int botonBack = 5; // Variables para almacenar el estado de los pulsadores bool setPresionado = false; bool arribaPresionado = false; bool abajoPresionado = false; bool backPresionado = false; int ledActivo = 0; int sumaLecturas = 0; int numeroLecturas = 0; unsigned long ultimaLecturaMillis = 0; // Tiempo de la última lectura const unsigned long intervaloLectura = 5; // Intervalo de 10 ms entre lecturas int setSuperior = 50; int direc_Superior = 0; int setInferior = 50; int direc_Inferior = 0; bool Mem_Set = false; int last_Set = 0; unsigned int cont_Set = 0; bool act_Set = false; int contador = 0; // CONTADOR PARA EL DESPLAZAMIENTO ENTRE LOS MENUS bool btnpress = false; void setup() { // Configuración de pines como entrada pinMode(botonSet, INPUT); pinMode(botonArriba, INPUT); pinMode(botonAbajo, INPUT); pinMode(botonBack, INPUT); // Iniciar comunicación serial Serial.begin(9600); pinMode(latch, OUTPUT); pinMode(clockpin, OUTPUT); pinMode(data, OUTPUT); pinMode(latchLeds, OUTPUT); pinMode(clockpinLeds, OUTPUT); pinMode(dataLeds, OUTPUT); pinMode(programLed, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(rly1, OUTPUT); pinMode(rly2, OUTPUT); pinMode(Triac, OUTPUT); pinMode(led9, OUTPUT); pinMode(led10, OUTPUT); EEPROM.get(direc_Superior, setSuperior); EEPROM.get(direc_Inferior, setInferior); } void loop() { setSuperior = 850; setInferior = 100; EEPROM.put(direc_Superior, setSuperior); EEPROM.put(direc_Inferior, setInferior); // if (millis() - ultimaLecturaMillis >= intervaloLectura) { // lectura analogica a5 // ultimaLecturaMillis = millis(); // Actualizar el tiempo de la última lectura int valorAnalogico = analogRead(entradaAnalogica); valorAnalogicodisplays = map(valorAnalogico, 0, 1023, 0, 1000); // Leer el valor analógico y acumularlo sumaLecturas += valorAnalogicodisplays; numeroLecturas++; // Si se han realizado 20 lecturas, calcular el promedio if (numeroLecturas == 10) { valorAnalogicodisplays = sumaLecturas / numeroLecturas; sumaLecturas = 0; numeroLecturas = 0; } // } ledActivo = valorAnalogicodisplays / 100; // para las salidas de los leds de nivel segmentsDisplays[0] = valorAnalogicodisplays % 10; //unidades segmentsDisplays[1] = (valorAnalogicodisplays / 10) % 10; //decenas segmentsDisplays[2] = (valorAnalogicodisplays / 100) % 10; //centenas segmentsDisplays[3] = (valorAnalogicodisplays / 1000) % 10; //centenas cont(); if (valorAnalogicodisplays >= setSuperior) Mem_Set = true; if (valorAnalogicodisplays <= setInferior) Mem_Set = false; if (Mem_Set == true) { digitalWrite(Triac, 0); digitalWrite(programLed, 0); } else { digitalWrite(Triac, 1); digitalWrite(programLed, 1); } } void cont() { if (ledActivo < 9) { digitalWrite(latchLeds, LOW); shiftOut(dataLeds, clockpinLeds, LSBFIRST, leds[ledActivo]); // dec digitalWrite(latchLeds, HIGH); digitalWrite(led9, 0); } else if (ledActivo >= 9) { digitalWrite(latchLeds, LOW); shiftOut(dataLeds, clockpinLeds, LSBFIRST, leds[8]); // dec digitalWrite(latchLeds, HIGH); if (ledActivo >= 9) digitalWrite(led9, 1); else digitalWrite(led9, 0); if (ledActivo >= 10) digitalWrite(led10, 1); else digitalWrite(led10, 0); } digitalWrite(latch, LOW); if (valorAnalogicodisplays >= 1000) shiftOut(data, clockpin, MSBFIRST, DIG[1]); else shiftOut(data, clockpin, MSBFIRST, DIG[0]); shiftOut(data, clockpin, MSBFIRST, SEG[segmentsDisplays[3]]); // digitalWrite(latch, HIGH); delay(5); digitalWrite(latch, LOW); if (valorAnalogicodisplays >= 100) shiftOut(data, clockpin, MSBFIRST, DIG[2]); else shiftOut(data, clockpin, MSBFIRST, DIG[0]); shiftOut(data, clockpin, MSBFIRST, SEG[segmentsDisplays[2]]); // dec digitalWrite(latch, HIGH); delay(5); digitalWrite(latch, LOW); if (valorAnalogicodisplays >= 10) shiftOut(data, clockpin, MSBFIRST, DIG[3]); else shiftOut(data, clockpin, MSBFIRST, DIG[0]); shiftOut(data, clockpin, MSBFIRST, SEG[segmentsDisplays[1]]); // dec digitalWrite(latch, HIGH); delay(5); digitalWrite(latch, LOW); if (valorAnalogicodisplays >= 1) shiftOut(data, clockpin, MSBFIRST, DIG[4]); else shiftOut(data, clockpin, MSBFIRST, DIG[0]); shiftOut(data, clockpin, MSBFIRST, SEG[segmentsDisplays[0]]); // dec digitalWrite(latch, HIGH); delay(5); }
1 comentario. Dejar nuevo
Excelente trabajo amigo, se nota el no profesionalismo y el empeño dedicados en todos tus proyectos.