Se incluye el circuito impreso, el cual ha sido provisto por pcbway.
PCBWay Prototipo rápido de PCB (Sin valor extra para colores) https://www.pcbway.es/
En este tutorial veremos como hacer un circuito medidor de nivel de agua con el integrado uln2803 y módulo wifi esp32.
Se incluye el circuito impreso, se explicará el funcionamiento del mismo.
Este es el segundo tutorial de dos videos. En el primer video, vimos como visualizar el nivel de agua a través de una escala de led.
Ahora vamos a subir estos datos a la nube, con los servicios de ubidots.
Recomiendo ver el anterior artículo donde hay más información del uln2803 –> http://rogerbit.com/wprb/2020/01/como-hacer-un-medidor-de-nivel-de-agua-con-uln2803-primera-parte/
El circuito integrado ULN2803 se emplea como una interface de potencia para circuitos con tecnología CMOS y TTL. Este integrado tiene en su interior 8 transistores NPN en configuración Darlington con diodos de protección, para poder controlar motores, cargas inductivas ,relés, y más. Cada salida puede controlar hasta 500 mA por lo que puede controlar diferentes tipos de cargas. Las salidas pueden conectarse en paralelo cuando es necesario manejar cargas más altas, no obstante conviene no sobrepasar la potencia total del circuito.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
Características:
-
- 8 transistores NPN Darlington en emisor común
- 8 diodos de supresión de voltajes inversos para manejar cargas inductivas, con conexiones de cátodo común
- Salidas de 0.5A (500mA) max.
- Los transistores pueden ser conectados en paralelo para mayor capacidad de corriente
- Voltaje de sostenimiento a la salida: -0.5V a 50V
- Potencia max: 1.47 W
- Resistencia de entrada a la base: 2.7kΩ
- Voltaje de entrada: -0.5V a 30V
- Entradas compatibles TTL y CMOS de 5V
- Encapsulado: DIP 18 pines
Aplicaciones:
- Comando de relés, lámparas, ó displays (LED o de descarga de gas), etc.
- Buffers lógicos
- Drivers de línea
- Entre otras aplicaciones
Funcionamiento
Para activar cada salida de este circuito integrado, el agua, no debe ser pura, en su contenido deberá tener algunas sales, que ayudan a conducir la electricidad, que al alcanzar cada uno de los niveles en el recipiente, cierra el circuito eléctrico de las entradas del ULN2803, que detectan el nivel alto de tensión y enciende el LED correspondiente a cada salida. En cada salida podemos conectar por ejemplo un relay, un buzzer e inclusive la bomba de un motor para volver a llenar un tanque de agua, de ser necesario, hasta cierto nivel y desconectar la bomba de agua al alcanzar el límite deseado.
Caracteristicas del módulo ESP32-T
Conectividad
El módulo ESP32 dispone de todas las variantes del WiFi:
- 802.11 b/g/n/e/i/n
- Wi-Fi Direct (P2P), P2P Discovery, P2P Group Owner mode and P2P Power Management
Esta versión nueva incluye la conectividad mediante Bluethoot de bajo consumo
- Bluetooth v4.2 BR/EDR and BLE
- BLE Beacon
Además, puede comunicarse mediante los protocoles SPI, I2C, UART, MAC Ethernet, Host SD
Prestaciones del microcontrolador
La CPU está formado por un SoC modelo Tensilica LX6 con las siguientes características y memoria
- Doble núcleo de 32 bits con velocidad de 160MHz
- Memoria ROM de 448 kBytes
- Memoria SRAM de 520kBytes
Dispne de 48 Pines
- 18 ADC de 12 bits
- 2 DAC de 8 bits
- 10 pines sensores de contacto
- 16 PWM
- 20 Entradas/salidas digitales
Alimentación y modos de consumo
Para un correcto funcionamiento del ESP32 es necesario subministrar un voltaje de entre 2,8V y 3,6V. La energía que consume depende del modo de funcionamiento. Contiene un modo, el Ultra Low Power Solution (ULP), en que se continúan realizando tareas básicas (ADC, RTC…) en el modo Sleep.
ESP8266 versus ESP32
Pin Out
Materiales
8 resistores de un 2.7K
Pines macho
Un circuito integrado uln2803apg
Un zócalo de 18 pines
Un circuito impreso
Descargar archivo gerber Gerber_circuito medidor de nivel de agua
Diagrama
Código Fuente
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
/**************************************** * Include Libraries ****************************************/ #include <WiFi.h> #include <PubSubClient.h> #define WIFISSID "Tu_Red_Wifi" // Put your WifiSSID here #define PASSWORD "Tu _contraseña_Wifi" // Put your wifi password here #define TOKEN "Tu_Token" // Put your Ubidots' TOKEN #define MQTT_CLIENT_NAME "Mi_nombre_MQTT" // MQTT client Name, please enter your own 8-12 alphanumeric character ASCII string; //it should be a random and unique ascii string and different from all other devices /**************************************** * Define Constants ****************************************/ #define VARIABLE_LABEL "sensor" // Assing the variable label #define DEVICE_LABEL "esp32" // Assig the device label #define GPIO15 15 #define GPIO02 2 #define GPIO00 0 #define GPIO04 4 #define GPIO16 16 #define GPIO17 17 #define GPIO05 5 #define GPIO18 18 #define GPIO19 19 int pin15 = 0; int pin2 = 0; int pin0 = 0; int pin4 = 0; int pin16 = 0; int pin17 = 0; int pin5 = 0; int pin18 = 0; float sensor = 0; char mqttBroker[] = "industrial.api.ubidots.com"; char payload[100]; char topic[150]; // Space to store values to send char str_sensor[10]; /**************************************** * Auxiliar Functions ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); void callback(char* topic, byte* payload, unsigned int length) { char p[length + 1]; memcpy(p, payload, length); p[length] = NULL; String message(p); Serial.write(payload, length); Serial.println(topic); } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attemp to connect if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Connected"); } else { Serial.print("Failed, rc="); Serial.print(client.state()); Serial.println(" try again in 2 seconds"); // Wait 2 seconds before retrying delay(2000); } } } /**************************************** * Main Functions ****************************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, PASSWORD); // Assign the pin as INPUT //pinMode(SENSOR, INPUT); pinMode(GPIO15, INPUT_PULLUP); pinMode(GPIO02, INPUT_PULLUP); pinMode(GPIO00, INPUT_PULLUP); pinMode(GPIO04, INPUT_PULLUP); pinMode(GPIO16, INPUT_PULLUP); pinMode(GPIO17, INPUT_PULLUP); pinMode(GPIO05, INPUT_PULLUP); pinMode(GPIO18, INPUT_PULLUP); pinMode(GPIO19, OUTPUT); Serial.println(); Serial.print("Wait for WiFi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi Connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); client.setServer(mqttBroker, 1883); client.setCallback(callback); } void loop() { //Activamos el el transistor durante un tiempo corto para evitar la electrolisis del agua y ahorrar energía digitalWrite(GPIO19, HIGH); delay(100); //Lectura de la sonda tiene en total 8 niveles pin15 = digitalRead(GPIO15); pin2 = digitalRead(GPIO02); pin0 = digitalRead(GPIO00); pin4 = digitalRead(GPIO04); pin16 = digitalRead(GPIO16); pin17 = digitalRead(GPIO17); pin5 = digitalRead(GPIO05); pin18 = digitalRead(GPIO18); delay(100); //Desactivamos el transistor y con ello el uln2803 digitalWrite(GPIO19, LOW); //Lectura //Comparamos el valor de cada pin y en base ha eso enviaremos el if(pin15 == LOW && pin2 == LOW && pin0 == LOW && pin4 == LOW && pin16 == LOW && pin17 == LOW && pin5 == LOW && pin18 == LOW){ sensor =100; } if(pin15 == HIGH && pin2 == LOW && pin0 == LOW && pin4 == LOW && pin16 == LOW && pin17 == LOW && pin5 == LOW && pin18 == LOW){ sensor =87.5; } if(pin15 == HIGH && pin2 == HIGH && pin0 == LOW && pin4 == LOW && pin16 == LOW && pin17 == LOW && pin5 == LOW && pin18 == LOW){ sensor =75; } if(pin15 == HIGH && pin2 == HIGH && pin0 == HIGH && pin4 == LOW && pin16 == LOW && pin17 == LOW && pin5 == LOW && pin18 == LOW){ sensor =62.5; } if(pin15 == HIGH && pin2 == HIGH && pin0 == HIGH && pin4 == HIGH && pin16 == LOW && pin17 == LOW && pin5 == LOW && pin18 == LOW){ sensor =50; } if(pin15 == HIGH && pin2 == HIGH && pin0 == HIGH && pin4 == HIGH && pin16 == HIGH && pin17 == LOW && pin5 == LOW && pin18 == LOW){ sensor =37.5; } if(pin15 == HIGH && pin2 == HIGH && pin0 == HIGH && pin4 == HIGH && pin16 == HIGH && pin17 == HIGH && pin5 == LOW && pin18 == LOW){ sensor =25; } if(pin15 == HIGH && pin2 == HIGH && pin0 == HIGH && pin4 == HIGH && pin16 == HIGH && pin17 == HIGH && pin5 == HIGH && pin18 == LOW){ sensor =12.5; } if(pin15 == HIGH && pin2 == HIGH && pin0 == HIGH && pin4 == HIGH && pin16 == HIGH && pin17 == HIGH && pin5 == HIGH && pin18 == HIGH){ sensor =0; } if (!client.connected()) { reconnect(); } sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Cleans the payload sprintf(payload, "{\"%s\":", VARIABLE_LABEL); // Adds the variable label //float sensor = random(0,100);//analogRead(SENSOR); Serial.print("Sensor:"); Serial.println(sensor); /* 4 is mininum width, 2 is precision; float value is copied onto str_sensor*/ dtostrf(sensor, 4, 2, str_sensor); sprintf(payload, "%s {\"value\": %s}}", payload, str_sensor); // Adds the value Serial.println("Publishing data to Ubidots Cloud"); client.publish(topic, payload); client.loop(); delay(5000); } |
SUSCRIBETE A NUESTROS BOLETINES, RECIBE EN TU CORREO LAS NOTICIAS MÁS DESTACADAS, SÓLO INGRESANDO TU CORREO ELECTRÓNICO
[wysija_form id=”1″]
VIDEO RECOMENDADO










