3D Printing Device to Level Monitoring System for Reservoirs

by fcodiegomoreira in Circuits > Arduino

79 Views, 2 Favorites, 0 Comments

3D Printing Device to Level Monitoring System for Reservoirs

WhatsApp Image 2024-06-29 at 00.31.27 (1).jpeg

You'll learn how to create a system to monitor level of a reservoirs using ESP8266 and create an enclosuring for the printed circuit board.

Supplies

Introduction

Nowadays, the efficient management of water resources is of paramount importance, especially in contexts where water scarcity and the need for constant monitoring are challenging. One of the biggest problems faced by resource managers is the difficulty of monitoring water levels in reservoirs in real time. This article presents an innovative design of a device based on the ESP8266, capable of monitoring the level of a water tank and sending automatic alerts to a Telegram group made up of maintenance professionals.

The objective of this project is to provide an affordable and efficient solution for monitoring water levels, to ensure a continuous supply and allow the team to quickly call a water truck to fill the reservoir. Choosing the ESP8266 is due to its internet connectivity capabilities and its compatibility with different platforms, allowing direct integration with instant messaging applications such as Telegram.

This device offers a series of benefits, from monitoring automation to real-time communication with a maintenance group, facilitating quick decision-making. Applicable in various sectors, such as industries, farms and homes, this solution was designed to meet the specific needs of maintenance professionals, ensuring greater efficiency and safety in reservoir management.

In this article, we will explore the development of the device prototype, its 3D printed housing structure, the tests carried out, the results obtained and the conclusions about its effectiveness. If you want to discover how this project can transform water resources management and provide a practical and innovative solution to a common problem, continue reading our article and discover all the solutions for you to apply in your projects.

Below we have the 3D printed housing structure to house the project’s printed circuit board.

Next, we will begin the construction process of the 3D model and presentation of the project's electronic system.

Electronic System Development

The device system is made up of two important parts:

  • Electronic board for monitoring and connecting to sensors
  • Electronic housing to house the printed circuit board.

See each of them shown in the image below.

The heart of this electronic board is the ESP8266 CHIP. He will be responsible for connecting to the internet, analyzing the reservoir level and sending alert messages to a maintenance team via Telegram.

Next, we will cover the complete system functionality of the ESP8266 and the code developed to control the system.

Control System With ESP8266

The ESP8266 is a very versatile CHIP, with an affordable price and widely used in electronic projects that involve data exchange over the internet. Its ability to connect to WiFi networks offers you great capacity to create countless applications for monitoring processes and controlling devices over the internet.

In this application, the ESP8266 is intended to monitor the level of a water reservoir and transmit the level status based on the reading status data from each sensor.

The project requirements are presented below:

  • Send alert messages to Telegram every 2 minutes when the water level is at or below the minimum level.
  • Send a message about the current level of the reservoir to the Telegram group, every 1 hour, when the water level is at or above the average level.

To perform level monitoring, the system has 3 inputs for float level sensors. From the reading of these sensors, the system will process the information and make a decision based on the state of each sensor. Below we have the structure of the float level sensor used in this project.

Next, we will present the operation of the electronic board control system.

Control System for Level Monitoring

The control system for level monitoring was developed with the ability to connect to any WiFi network, dynamically. This result was obtained through a feature that allows you to scan WiFi networks close to the device and present them so that the user can make a connection.

Device registration system on WiFi network

Below we have the result of the page that was developed to allow the device to connect to any WiFi network.

The ESP8266 has been configured to create a network that allows us to connect to it. When energizing the device, a WiFi network will be created with the name “WiFi Tank”. Access the WiFi network with the password “wifitanque99” and this page can be accessed via IP 192.168.1.4

The code that presents the result of this page is shown below.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Registro - WiFi</title>
<style>
body {color: #434343; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 14px; background-color: #eeeeee; margin-top: 100px;}
.container {margin: 0 auto; max-width: 400px; padding: 30px; box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); background-color: #ffffff; border-radius: 10px;}
h2 {text-align: center; margin-bottom: 20px; margin-top: 0px; color: #0ee6b1; font-size: 35px;}
#titleGreen {color: #00bcd4;}
#titleBlack {color: #000000;}
h3 {text-align: center; margin-bottom: 40px; margin-top: 0px; color: #0E0E0E; font-size: 35px;}
form .field-group {box-sizing: border-box; clear: both; padding: 4px 0; position: relative; margin: 1px 0; width: 100%;}
.text-field {font-size: 15px; margin-bottom: 4%; -webkit-appearance: none; display: block; background: #fafafa; color: #636363; width: 100%; padding: 15px 0px 15px 0px; text-indent: 10px; border-radius: 5px; border: 1px solid #e6e6e6; background-color: transparent;}
.text-field:focus {border-color: #00bcd4; outline: 0;}
.button-container {box-sizing: border-box; clear: both; margin: 1px 0 0; padding: 4px 0; position: relative; width: 100%;}
.button {background: #00BCD4; border: none; border-radius: 5px; color: #0e0e0e; cursor: pointer; display: block; font-weight: bold; font-size: 16px; padding: 15px 0; text-align: center; text-transform: uppercase; width: 100%; -webkit-transition: background 250ms ease; -moz-transition: background 250ms ease; -o-transition: background 250ms ease; transition: background 250ms ease;}
p {text-align: center; text-decoration: none; color: #0444444; font-size: 18px;}
a {text-decoration: none; color: #ffffff; margin-top: 0%;}
#status {text-align: center; text-decoration: none; color: #336859; font-size: 14px;}
</style>
<script>
function validateForm() {
var ssid = document.forms["myForm"]["ssid"].value;
var password = document.forms["myForm"]["password"].value;
var status = document.getElementById("statusDiv");
if (ssid == "" && password == "") {
status.innerHTML = "<p id='status' style='color:red;'>Insira SSID e senha.</p>";
return false;
}
else if (ssid == "") {
status.innerHTML = "<p id='status' style='color:red;'>Insira SSID.</p>";
return false;
}
else if (password == "") {
status.innerHTML = "<p id='status' style='color:red;'>Insira senha.</p>";
return false;
}
else {
status.innerHTML = "<p id='status'>Conectando...</p>";
return true;
}
}
</script>
</head>
<body>
<div class="container">
<h2><span id="titleGreen">IOT</span><span id="titleBlack"> Level</span></h2>
<h3>WiFi Network Register</h3>
<form name="myForm" action="/action_new_connection" onsubmit="return validateForm()" method="post">
<div class="field-group">
<select class='text-field' placeholder="WiFi Network Password" name='ssid' ><option value="" disabled selected>Select WiFi Network</option></select>
</div>
<br>
<div class="field-group">
<input class="text-field" type="password" name="password" length=64 placeholder="WiFi Network Password">
</div>
<br>
<div id="statusDiv">
</div>
<div class="button-container">
<input class="button" type="submit" value="Connect">
</div>
</form>
<p>OR</p>
<div class="button-container">
<button class="button" type="button" onclick="window.location.href='/action_previous_connection'">Connect to the last used network</button>
</div>
</div>
</body>
</html>

After access, the system will scan and present all available WiFi networks to connect the device. Select the desired network and enter the password to register the device on the WiFi network. After connection, the blue LED on the ESP8266 will be activated to indicate that the board is connected to the WiFi network.

Monitoring System With Sensors

After connecting to WiFi, the device initializes and begins the process of monitoring the level and transmitting data to the Telegram group. As previously mentioned, the system is capable of sending alert messages based on these two situations below.

  • Sends alert messages to Telegram every 2 minutes when the water level is at or below the minimum level.
  • Send a message about the current level of the reservoir to the Telegram group, every 1 hour, when the water level is at or above the average level.

This task is performed based on hours obtained from the NTP protocol. The complete code for this system is presented below.

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <EEPROM.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <DNSServer.h>
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "7205391260:AAF1kO0diEAyctMB8uiXkWYFha0Ck4CZcAY"
// Use @myidbot (IDBot) to find out the chat ID of an individual or a group
// Also note that you need to click "start" on a bot before it can
// message you
#define CHAT_ID "-1002155991734"
//Define o pino para reset das definicoes de wifi
int pino_reset = 13;
#define sensorB 14
#define sensorM 12
#define sensorA 16
byte CountH = 0, CountM = 0;
byte CurrentMinute = 0, AntMinute = 0, CurrentHour = 0, AntHour = 0;
bool sensorL1 = 0, sensorL2 = 0, sensorL3 = 0, wificonfig = 0, EnviaAlerta = 0;
// Checks for new messages every 1 second.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan=0;
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
void VerificaNivel()
{
sensorL1 = digitalRead(sensorB);
sensorL2 = digitalRead(sensorM);
sensorL3 = digitalRead(sensorA);
//Deteccao de anormalidade nos sensores
if(sensorL1 == 1 && sensorL2 == 0 && sensorL3 == 0)
{
bot.sendMessage(CHAT_ID, "Abnormality: Medium level sensor or high level sensor!", "");
}
if(sensorL1 == 1 && sensorL2 == 1 && sensorL3 == 0)
{
bot.sendMessage(CHAT_ID, "Abnormality: Low level sensor or medium level sensor!", "");
}
if(sensorL1 == 0 && sensorL2 == 1 && sensorL3 == 0)
{
bot.sendMessage(CHAT_ID, "Abnormality: Medium level sensor!", "");
}
if(sensorL1 == 0 && sensorL2 == 1 && sensorL3 == 1)
{
bot.sendMessage(CHAT_ID, "ALERT! Close to the minimum water level.", "");
}
//Deteccao de Niveis na caixa de agua entre os sensores
if(sensorL1 == 0 && sensorL2 == 0 && sensorL3 == 0)
{
bot.sendMessage(CHAT_ID, "Water tank at maximum level.", "");
}
if(sensorL1 == 0 && sensorL2 == 0 && sensorL3 == 1)
{
bot.sendMessage(CHAT_ID, "Water tank at medium level.", "");
}
if(sensorL1 == 1 && sensorL2 == 1 && sensorL3 == 1)
{
bot.sendMessage(CHAT_ID, "CRITICAL ALERT! Water level below minimum level.", "");
}
}
#define ONBOARD_LED 2//Led embutido
const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Registro - WiFi</title>
<style>
body {color: #434343; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; font-size: 14px; background-color: #eeeeee; margin-top: 100px;}
.container {margin: 0 auto; max-width: 400px; padding: 30px; box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23); background-color: #ffffff; border-radius: 10px;}
h2 {text-align: center; margin-bottom: 20px; margin-top: 0px; color: #0ee6b1; font-size: 35px;}
#titleGreen {color: #00bcd4;}
#titleBlack {color: #000000;}
h3 {text-align: center; margin-bottom: 40px; margin-top: 0px; color: #0E0E0E; font-size: 35px;}
form .field-group {box-sizing: border-box; clear: both; padding: 4px 0; position: relative; margin: 1px 0; width: 100%;}
.text-field {font-size: 15px; margin-bottom: 4%; -webkit-appearance: none; display: block; background: #fafafa; color: #636363; width: 100%; padding: 15px 0px 15px 0px; text-indent: 10px; border-radius: 5px; border: 1px solid #e6e6e6; background-color: transparent;}
.text-field:focus {border-color: #00bcd4; outline: 0;}
.button-container {box-sizing: border-box; clear: both; margin: 1px 0 0; padding: 4px 0; position: relative; width: 100%;}
.button {background: #00BCD4; border: none; border-radius: 5px; color: #0e0e0e; cursor: pointer; display: block; font-weight: bold; font-size: 16px; padding: 15px 0; text-align: center; text-transform: uppercase; width: 100%; -webkit-transition: background 250ms ease; -moz-transition: background 250ms ease; -o-transition: background 250ms ease; transition: background 250ms ease;}
p {text-align: center; text-decoration: none; color: #0444444; font-size: 18px;}
a {text-decoration: none; color: #ffffff; margin-top: 0%;}
#status {text-align: center; text-decoration: none; color: #336859; font-size: 14px;}
</style>
<script>
function validateForm() {
var ssid = document.forms["myForm"]["ssid"].value;
var password = document.forms["myForm"]["password"].value;
var status = document.getElementById("statusDiv");
if (ssid == "" && password == "") {
status.innerHTML = "<p id='status' style='color:red;'>Insira SSID e senha.</p>";
return false;
}
else if (ssid == "") {
status.innerHTML = "<p id='status' style='color:red;'>Insira SSID.</p>";
return false;
}
else if (password == "") {
status.innerHTML = "<p id='status' style='color:red;'>Insira senha.</p>";
return false;
}
else {
status.innerHTML = "<p id='status'>Conectando...</p>";
return true;
}
}
</script>
</head>
<body>
<div class="container">
<h2><span id="titleGreen">IOT</span><span id="titleBlack"> Level</span></h2>
<h3>Registro de Rede WiFi</h3>
<form name="myForm" action="/action_new_connection" onsubmit="return validateForm()" method="post">
<div class="field-group">
<select class='text-field' name='ssid'></select>
</div>
<br>
<div class="field-group">
<input class="text-field" type="password" name="password" length=64 placeholder="Senha da Rede WiFi">
</div>
<br>
<div id="statusDiv">
<br><br>
</div>
<div class="button-container">
<input class="button" type="submit" value="Conectar">
</div>
</form>
<p>OU</p>
<div class="button-container">
<button class="button" type="button" onclick="window.location.href='/action_previous_connection'">Conectar à última rede utilizada</button>
</div>
</div>
</body>
</html>
)=====";
const char *ssid = "Wifi Tanque"; // Nome da rede WiFi que será criada
const char *password = "wifitanque99"; // Senha para se conectar nesta rede
ESP8266WebServer server(80); //Server utiliza a porta 80
void setup()
{
pinMode(ONBOARD_LED, OUTPUT); //LED embutido
pinMode(12, INPUT);
pinMode(14, INPUT);
pinMode(16, INPUT);
Serial.begin(115200);
WiFi.softAP(ssid, password);
Serial.print("Access Point \"");
Serial.print(ssid);
Serial.println("\" iniciado");
Serial.print("IP address:\t");
Serial.println(WiFi.softAPIP());
//Tratamento de rotas
server.on("/", handleRoot);
server.on("/action_new_connection", handleForm);
server.on("/action_previous_connection", connectEeprom);
server.begin();
Serial.println("Servidor HTTP iniciado");
connectEeprom();
Serial.println("Passou da funcao eeprom");
secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
}
void loop()
{
//Serial.println("Entrou no loop");
if((wificonfig == 1) && (WiFi.status() != WL_CONNECTED))
{
digitalWrite(ONBOARD_LED, HIGH); //Desative o LED
connectEeprom();
}
server.handleClient(); //Trata requisições de clientes
if(WiFi.status() == WL_CONNECTED)
{
sensorL1 = digitalRead(sensorB);
sensorL2 = digitalRead(sensorM);
sensorL3 = digitalRead(sensorA);
if((sensorL1 == 1 && sensorL2 == 1 && sensorL3 == 1)||(sensorL1 == 0 && sensorL2 == 1 && sensorL3 == 1))
{
EnviaAlerta = 1;
CurrentMinute = timeClient.getMinutes();
}
else
{
EnviaAlerta = 0;
}
if((EnviaAlerta == 1) && (CurrentMinute != AntMinute))
{
CountM++;
if(CountM >= 2)
{
if(sensorL1 == 0 && sensorL2 == 1 && sensorL3 == 1)
{
bot.sendMessage(CHAT_ID, "ALERT! Close to the minimum water level.", "");
}
if(sensorL1 == 1 && sensorL2 == 1 && sensorL3 == 1)
{
bot.sendMessage(CHAT_ID, "CRITICAL ALERT! Water level below minimum level.", "");
}
CountM = 0;
}
AntMinute = CurrentMinute;
}
if(wificonfig == 1)
{
CurrentHour = timeClient.getHours();
if(CurrentHour != AntHour)
{
CountH++;
AntHour = CurrentHour;
if(CountH >= 1)
{
VerificaNivel();
CountH = 0;
}
}
}
}
}
void handleRoot() {
String index = listSSID(); //Leia o conteúdo HTML
server.send(200, "text/html", index); //Enviar pagina Web
}
void handleForm() {
String ssidWifi = server.arg("ssid");
String passwordWifi = server.arg("password");
Serial.printf("SSID: %s\n", ssidWifi);
Serial.printf("Password: %s\n", passwordWifi);
if(!ssidWifi.equals("") && !passwordWifi.equals("")) {
connectToWiFi(ssidWifi, passwordWifi);
}
}
void connectToWiFi(String ssidWifi, String passwordWifi) {
Serial.print("Connect to WiFi funcao");
int count = 0;
WiFi.begin(ssidWifi.c_str(), passwordWifi.c_str()); //Conecta com seu roteador
Serial.println("");
//Espera por uma conexão
while ( count < 15 ) {
delay(500);
Serial.print(".");
if (WiFi.status() == WL_CONNECTED) {
Serial.println("");
salvarEeprom(ssidWifi, passwordWifi);
Serial.println("");
//Se a conexão ocorrer com sucesso, mostre o endereço IP no monitor serial
Serial.println("Conectado ao WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //Endereço IP do ESP8266
digitalWrite(ONBOARD_LED, LOW); //Acende o LED
wificonfig = 1;
timeClient.begin();
timeClient.setTimeOffset(0);
timeClient.update();
bot.sendMessage(CHAT_ID, "System restarted!", "");
time_t epochTime = timeClient.getEpochTime();
Serial.print("Epoch Time: ");
Serial.println(epochTime);
Serial.print("Retrieving time: ");
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
time_t now = time(nullptr);
while (now < 24 * 3600)
{
Serial.print(".");
delay(100);
now = time(nullptr);
}
Serial.println(now);
CurrentHour = timeClient.getMinutes();
AntHour = CurrentHour;
String responsePage = (const __FlashStringHelper*) MAIN_page; //Leia o conteúdo HTML
responsePage.replace("<br><br>", "<p id='status'>Conectado!</p>");
server.send(200, "text/html", responsePage);
return;
}
else if (WiFi.status() == WL_CONNECT_FAILED) {
String responsePage = (const __FlashStringHelper*) MAIN_page;
responsePage.replace("<br><br>", "<p id='status' style='color:red;'>Falha na conexão.</p>");
server.send(200, "text/html", responsePage);
Serial.println("Falha conexao wifi");
}
count++;
}
Serial.println();
Serial.println("Timed out.");
String responsePage = (const __FlashStringHelper*) MAIN_page;
responsePage.replace("<br><br>", "<p id='status' style='color:red;'>Erro.</p>");
server.send(200, "text/html", responsePage);
return;
}
String listSSID() {
String index = (const __FlashStringHelper*) MAIN_page; //Leia o conteúdo HTML
String networks = "";
int n = WiFi.scanNetworks();
Serial.println("Scan done.");
if (n == 0) {
Serial.println("Nenhuma rede encontrada.");
index.replace("<select class='text-field' name='ssid'></select>", "<select class='text-field' name='ssid'><option value='' disabled selected>Nenhuma rede encontrada</option></select>");
index.replace("<br><br>", "<p id='status' style='color:red;'>Rede não encontrada.</p>");
return index;
}
else {
Serial.printf("%d networks found.\n", n);
networks += "<select class='text-field' name='ssid'><option value='' disabled selected>SSID</option>";
for (int i = 0; i < n; ++i)
{
// Imprime o SSID de cada rede encontrada
networks += "<option value='" + WiFi.SSID(i) + "'>" + WiFi.SSID(i) + "</option>";
}
networks += "</select>";
}
index.replace("<select class='text-field' name='ssid'></select>", networks);
return index;
}
void salvarEeprom(String ssidWifi, String passwordWifi) {
EEPROM.begin(98); // Tamanho da FLASH reservado para EEPROM. Pode ser de 4 a 4096 bytes
if(!compareEeprom(ssidWifi, passwordWifi)) {
Serial.println("Salvando:");
EEPROM.write(0, ssidWifi.length());
Serial.println(ssidWifi.length());
for(int i = 2; i < 2+ssidWifi.length(); i++) {
Serial.print(ssidWifi.charAt(i-2));
EEPROM.write(i, ssidWifi.charAt(i-2));
}
Serial.println("");
Serial.println("Salvando:");
EEPROM.write(1, passwordWifi.length());
Serial.println(passwordWifi.length());
for(int j = 2+ssidWifi.length(); j < 2+ssidWifi.length()+passwordWifi.length(); j++)
{
Serial.print(passwordWifi.charAt(j-2-ssidWifi.length()));
EEPROM.write(j, passwordWifi.charAt(j-2-ssidWifi.length()));
}
Serial.println("");
EEPROM.commit(); // Salva alterações na FLASH
}
EEPROM.end(); // Apaga a cópia da EEPROM salva na RAM
}
boolean compareEeprom(String ssidWifi, String passwordWifi) {
int idLength = int(EEPROM.read(0)); // Tamanho do SSID armazenado (número de bytes)
int passLength = int(EEPROM.read(1)); // Tamanho do Password armazenado (número de bytes)
String id = "";
String pass = "";
Serial.println("Lendo SSID:");
Serial.print("Tamanho:");
Serial.println(idLength);
for(int i = 2; i < 2+idLength; i++) {
Serial.print("Posição ");
Serial.print(i);
Serial.print(": ");
id = id + char(EEPROM.read(i));
Serial.println(id[i-2]);
}
Serial.println("");
Serial.println("Lendo senha:");
Serial.print("Tamanho:");
Serial.println(passLength);
for(int j = 2+idLength; j < 2+idLength+passLength; j++) {
Serial.print("Posição ");
Serial.print(j);
Serial.print(": ");
pass = pass + char(EEPROM.read(j));
Serial.println(pass[j-2-idLength]);
Serial.println(pass);
}
Serial.println("");
Serial.print("SSID é igual: ");
Serial.println(id.equals(ssidWifi));
Serial.print("Senha é igual: ");
Serial.println(pass.equals(passwordWifi));
if(id.equals(ssidWifi) && pass.equals(passwordWifi))
{
Serial.println("Dados já presentes na memória.");
return true;
}
else
{
return false;
}
}
void connectEeprom() {
Serial.println("Entrou na funcao connecteeprom");
EEPROM.begin(98); // Tamanho da FLASH reservado para EEPROM. Pode ser de 4 a 4096 bytes
int ssidSize = (int)EEPROM.read(0); // Tamanho do SSID armazenado (número de bytes)
int passwordSize = (int)EEPROM.read(1); // Tamanho do Password armazenado (número de bytes)
String ssidWifi = "";
String passwordWifi = "";
//Serial.println("Lendo:");
for(int i = 2; i < 2+ssidSize; i++) {
Serial.print(char(EEPROM.read(i)));
ssidWifi.concat(char(EEPROM.read(i)));
}
Serial.println("");
//Serial.println("Lendo:");
for(int j = 2+ssidSize; j < 2+ssidSize+passwordSize; j++) {
//Serial.print(char(EEPROM.read(j)));
passwordWifi.concat(char(EEPROM.read(j)));
}
EEPROM.end(); // Apaga a cópia da EEPROM salva na RAM
connectToWiFi(ssidWifi, passwordWifi);
Serial.print("Saiu funcao connect EEPROM.");
}

Below is a presentation of the messages in the maintenance team group. As you can see, each alert is sent based on the conditions presented previously.


This way, the team has knowledge of the current state of the reservoir level and is able to make the best decisions in managing the site's water resources and ensuring that there is never a lack of water to supply the system. See the image of the alert messages.

To protect the printed circuit board from environmental impurities, we developed an electronic housing.

Electronic Enclosure Design

The electronic housing has the purpose of storing the printed circuit board, protecting the electronic board and facilitating the connection of power and other devices to the electronic board circuit.

From these points, we developed the electronic housing below.

The electronic housing is designed to provide access to the wires for the 3 level sensors and an input for the 9V power supply connector.

To facilitate its installation, we inserted two side structures for fixing to the wall using screws. See the figure below.

In the figure above you can see the two side flaps. In addition to this structure, we use insertion nuts in the internal region to facilitate fixing the electronic board and closing the cover with the help of screws. Its structure is presented below.


These elements are very useful when we want to create holes with metal threads. They facilitate the fixing of parts with screws and are highly resistant to wear, when compared to the plastic structure. Many designers use holes in the plastic structure itself to apply screws.

Now, see the structure of the electronic housing that was manufactured using FDM 3D printing technology.

Is it advantageous to use 3D printing in the manufacture of electronic housing prototypes? There are 4 important points that we can highlight the advantage of using 3D printing for your projects.

1 - Flexibility in design

3D printing allows designers to create complex shapes and structures that would be difficult or impossible to produce with traditional methods. This offers a great deal of creative freedom, allowing the creation of custom housings that precisely meet the needs of the electronic device. Design changes and iterations can be made quickly, facilitating innovation and experimentation.

2 - Speed ​​in developing prototypes

With 3D printing, you can go from digital design to physical prototype in a matter of hours or days, rather than weeks or months. This significantly speeds up the product development cycle, allowing you to quickly test and validate different designs. Problems can be identified and corrected earlier in the development process, resulting in a more refined and efficient final product.

3 - Customization and specific adaptations

The ability to customize each housing according to the specific needs of the device is one of the biggest advantages of 3D printing. This is especially useful for electronic devices that require specific adjustments, such as precise fittings for components, openings for connectors, and other custom features. 3D printing makes it possible to produce small series of customized housings without significant additional costs.

4 - Cost savings compared to traditional manufacturing methods

Traditional manufacturing methods such as plastic injection can be expensive and time-consuming, especially for small production runs. Expensive tools and molds are required, making low-volume production impractical. 3D printing eliminates the need for specific molds and tools, significantly reducing initial and production costs. This makes 3D printing a cost-effective option for startups and small businesses that need to produce high-quality electronic housings in limited volumes.

All of these points are possible to be achieved when we use industrial 3D printing resources, as the machines have a higher level of precision and the company uses surface finishing techniques to improve the quality of the parts.

JLC3DP is a specialist in this process and all of these housing and electronic board projects are developed with them.

There are more than 5 3D printing technologies that allow printing from plastic to printing with steel material. All this for prices starting at $0.3. In addition, there are several post-processing steps to increase the level of surface finish of the part.

Industrial 3D printing manufacturing is a reality that is accessible to everyone. The cost of manufacturing the structure for this electronic housing is $10.50.

The affordable price and quality of the parts means that any project can be manufactured quickly, affordably and the final result is similar to a part injected with thermoplastics, due to the high quality of surface finish in post-processing.

The JLC3DP is ideal for you to build any project. In addition to 3D printing, we also developed the electronic board at very low costs, which allowed us to create a commercial and affordable project to validate the idea.

Conclusion

3D printing has proven to be a revolutionary technology in the manufacture of electronic housings, bringing numerous advantages that benefit both designers and engineers. Flexibility in design allows the creation of complex and personalized shapes, while speed in developing prototypes accelerates the cycle of innovation and product improvement. Furthermore, the customization capacity meets the specific needs of each project, ensuring precise and efficient adaptations.

Using JLC3DP's industrial manufacturing resources is a crucial step for those who want to create professional electronic housings, with a high level of finishing and with high impact during the presentation of a built prototype.

All of this at an accessible, cheap cost that presents high quality and dimensional precision in the manufacturing process. If you want to create pieces with a high quality finish, access the JLC3DP website now and use our manufacturing services. We have several technologies to print polymers and steel to meet any of your needs.