¿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.