E não só a caixa dágua, mas também tanques, reservatórios e aquários, usando o sensor de nível de água, um sensor do tipo bóia que é um sensor de funcionamento bem simples, como você vai ver nesse projeto de monitoramento. Monitore sua caixa dágua e evite desperdícios!

Sensor de nível de água com Arduino

Para entender melhor o funcionamento do sensor de nível de água, recomendo a leitura deste post aqui do Arduino e Cia.

Material necessário para o projeto

Para esse projeto você vai precisar do seguinte material:

  • Arduino Uno
  • Sensores de nível de água tipo bóia (usarei 3)
  • Display LCD 16×2 I2C
  • Módulo Relé 5V 1 canal
  • Resistores
  • Protoboard 400 pontos
  • Jumpers macho-macho e macho-fêmea

O material mostrado acima será usado para a montagem da parte eletrônica do projeto. Se você pretende instalar isso na sua casa, vai precisar de outros materiais para fixar os sensores na caixa dágua, cabos para ligação dos sensores ao Arduino, caixa para proteção do circuito, etc.

O projeto de monitoramento de caixa dágua

Este projeto consiste em um Arduino Uno que vai efetuar a leitura dos sensores de nível de água, que são do tipo “bóia” e ficarão dentro do reservatório. Serão utilizados 3 sensores que, conforme o nível da água, vão enviar sinais para o microcontrolador, que por sua vez vai acionar um display LCD 16×2 I2C e mostrar o nível de água no reservatório.

Sensores posicionados em uma caixa dágua

Coloquei um relé no circuito, mas o uso é opcional, já que ele pode ser usado para ligar uma bomba que vai encher a caixa. O relé permanece desligado até que o nível da água atinja o ponto mais baixo (sensor 3), quando então ele é acionado, e permanece assim até que o nível do reservatório atinja o nível máximo (sensor 1).

Circuito monitoração de caixa dágua

O circuito abaixo mostra a ligação dos 3 sensores no Arduino Uno, conectados às portas 8, 9 e 10, com o relé conectado na porta 7.

O display utiliza interface I2C, e é ligado nas portas analógicas A4 (SDA) e A5 (SCL) do Arduino. Ele está “de lado” justamente para facilitar a visão do nível da água, representado pelos quadrados no lado direito do display.

Circuito Arduino com rele e sensor de nivel de água

Os resistores usados nos sensores são de 10K, funcionando como resistores pull-down. Você não precisa usar necessariamente esses valores, ajuste de acordo com os resistores que tiver em mãos.

Programa monitoramento de caixa dágua

O programa usa a biblioteca LiquidCrystal_I2C (download), e você deve descompactar a biblioteca e colocá-la na pasta Libraries da IDE do Arduino. Atenção: Observe que esta biblioteca é diferente de outras LiquidCrystal_I2C que já usei aqui no Arduino e Cia, e foi escolhida por aceitar caracteres customizados, ok?

Não esqueça de adaptar, na linha 22, o endereço I2C do display que você está usando. No caso o meu display está com o endereço 0x3B. Se não souber qual o endereço I2C do display utilize o I2CScanner, mostrado neste post.

No código temos a inicialização do display e depois a leitura do estado dos sensores. Se houver alguma mudança, o nível do reservatório é atualizado, passando pelos níveis C (caixa cheia), M (nível médio) e V (caixa vazia).

//Programa: Monitoracao de Caixa d´agua usando Arduino
//Autor: Arduino e Cia

//Display HD44780 com adaptador I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define pino_rele 7
#define sensor1 8
#define sensor2 9
#define sensor3 10

int valor_s1 = 1, valor_s2 = 1, valor_s3 = 1;

//Simbolos
uint8_t letra_C[8] = {0x0, 0xE, 0x11, 0x11, 0x11, 0x11, 0x0, 0x0};
uint8_t letra_M[8] = {0x0, 0x1F, 0x2, 0x4, 0x2, 0x1F, 0x0, 0x0};
uint8_t letra_v[8] = {0x0, 0x7, 0x8, 0x10, 0x8, 0x7 , 0x0, 0x0};
uint8_t caracter_nivel[8] = {0x0, 0x1F, 0x1F, 0x1F, 0x1F,
                             0x1F, 0x1F, 0x0};

LiquidCrystal_I2C lcd(0x3B, 16, 2);

int nivel_anterior = 0;

void setup()
{
  Serial.begin(9600);
  //Inicializa o display I2C
  lcd.init();
  lcd.backlight();
  //Caracteres customizados
  lcd.createChar(0, letra_C);
  lcd.createChar(1, letra_M);
  lcd.createChar(2, letra_v);
  lcd.createChar(3, caracter_nivel);

  //Define os pinos dos sensores como entrada
  pinMode(sensor1, INPUT);
  pinMode(sensor2, INPUT);
  pinMode(sensor3, INPUT);

  //Mostra a letra C no display
  lcd.setCursor(15, 0);
  lcd.write(uint8_t(0));
  //Mostra a letra M no display
  lcd.setCursor(8, 0);
  lcd.write(uint8_t(1));
  //Mostra a letra V no display
  lcd.setCursor(0, 0);
  lcd.write(uint8_t(2));

  Serial.println("Monitoracao de Caixa Dagua");
  Serial.println();
}

void loop()
{
  //Leitura dos sensores
  int valor_s1 = digitalRead(sensor1);
  int valor_s2 = digitalRead(sensor2);
  int valor_s3 = digitalRead(sensor3);

  //Mostra valor dos sensores no serial monitor
  Serial.print("S1: ");
  Serial.print(valor_s1);
  Serial.print(" S2: ");
  Serial.print(valor_s2);
  Serial.print(" S3: ");
  Serial.println(valor_s3);

  //Checa o nivel e atualiza o display
  if ((valor_s1 == 0) && valor_s2 == 0 && valor_s3 == 0)
  {
    //Atualiza o nivel no display, enviando o numero de
    //"quadrados" que devem ser mostrados para indicar
    //o nivel
    mostra_nivel(15);
    //Desliga o rele
    digitalWrite(pino_rele, HIGH);
  }

  if ((valor_s1 == 1) && valor_s2 == 0 && valor_s3 == 0)
  {
    //Atualiza o nivel no display
    mostra_nivel(11);
  }

  if ((valor_s1 == 1) && valor_s2 == 1 && valor_s3 == 0)
  {
    //Atualiza o nivel no display
    mostra_nivel(4);
  }

  if ((valor_s1 == 1) && valor_s2 == 1 && valor_s3 == 1)
  {
    mostra_nivel(0);
    //Liga o rele
    digitalWrite(pino_rele, LOW);
  }
  delay(100);
}

void mostra_nivel(int nivel)
{
  if (nivel != nivel_anterior)
  {
    //Apaga informacao anterior
    lcd.setCursor(0, 1);
    lcd.print("                ");
    //Atualiza o nivel no display
    for (int i = 0; i <= nivel; i++)
    {
      lcd.setCursor(i, 1);
      lcd.write(uint8_t(3));
    }
    nivel_anterior = nivel;
  }
}

Na imagem abaixo, temos a saída de mensagens no serial monitor, onde você pode acompanhar o estado de cada um dos sensores e também incluir mensagens para o seu próprio controle:

Saída sensores Serial Monitor

Você pode expandir facilmente esse projeto, se precisar utilizar mais sensores, e também pode incrementá-lo adicionando funcionalidades como envio de avisos via Wifi, SMS, MQTT e outros.

Gostou? Monitore sua caixa dágua de uma jeito fácil e confira outros posts sobre Arduino aqui no Arduino e Cia!

4.9/5 - (8 votes)