Arduino - Sensor de Água

O sensor de água, ou sensor de nível de água, é usado para detectar vazamento de água, chuva, transbordamento de tanque ou para medir o nível da água. Neste tutorial, vamos aprender:

Sobre o Sensor de Nível de Água

Pinagem do Sensor de Nível de Água

O sensor de nível de água tem 3 pinos:

  • Pino S (Signal): é uma saída analógica que será conectada a uma das entradas analógicas do seu Arduino.
  • Pino + (VCC): fornece alimentação para o sensor. É recomendado alimentar o sensor com 3,3V – 5V.
  • Pino - (GND): é a conexão de terra (ground).
pinagem do sensor de água

※ Nota:

O valor da saída analógica no pino de sinal varia de acordo com a tensão fornecida ao pino VCC do sensor.

Como o Sensor de Nível de Água Funciona

Resumindo: quanto mais o sensor estiver imerso na água, maior será a tensão de saída no pino de sinal.

Vamos ver isso com mais detalhes.

Esta seção traz um conhecimento mais aprofundado. NÃO se preocupe se você não entender. Pule esta seção se ela parecer difícil demais e volte outro dia. Continue lendo as próximas seções.

O sensor tem uma série de dez trilhas de cobre expostas. Cinco são trilhas de alimentação e cinco são trilhas de detecção. Essas trilhas são intercaladas em paralelo, de modo que existe uma trilha de detecção entre cada duas trilhas de alimentação. Essas trilhas não estão conectadas, a menos que sejam ligadas pela água quando submersas.

As trilhas funcionam como um resistor variável (assim como um potenciômetro), cuja resistência varia de acordo com o nível da água.

  • A mudança na resistência corresponde à distância entre o topo do sensor e a superfície da água.
  • A resistência é inversamente proporcional à altura da água:
  • Quanto mais o sensor estiver imerso na água, melhor a condutividade e menor a resistência.
  • Quanto menos o sensor estiver imerso na água, pior a condutividade e maior a resistência.
  • O sensor produz uma tensão de saída de acordo com a resistência.

Medindo a tensão, podemos determinar o nível da água.

Diagrama de Ligação

Em teoria, para alimentar o sensor, podemos conectar os pinos VCC e GND do sensor aos pinos 5v e GND do Arduino, respectivamente.

Na prática, porém, essa forma não é recomendada. Isso porque, em um ambiente úmido, se alimentarmos o sensor o tempo todo, ele sofre corrosão eletroquímica mais rápido. Isso reduz a vida útil do sensor. Para resolver esse problema, recomendamos que você não alimente o sensor o tempo todo, mas apenas quando for ler o valor do sensor. Isso pode ser feito conectando o pino VCC do sensor a um pino digital do Arduino e colocando o pino do Arduino em HIGH e LOW antes e depois da leitura, respectivamente.

Diagrama de ligação do Sensor de Água com Arduino

This image is created using Fritzing. Click to enlarge image

Código Arduino - Lendo o Valor do Sensor de Água

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-water-sensor */ #define POWER_PIN 7 #define SIGNAL_PIN A5 int value = 0; // variable to store the sensor value void setup() { Serial.begin(9600); pinMode(POWER_PIN, OUTPUT); // configure D7 pin as an OUTPUT digitalWrite(POWER_PIN, LOW); // turn the sensor OFF } void loop() { digitalWrite(POWER_PIN, HIGH); // turn the sensor ON delay(10); // wait 10 milliseconds value = analogRead(SIGNAL_PIN); // read the analog value from sensor digitalWrite(POWER_PIN, LOW); // turn the sensor OFF Serial.print("Sensor value: "); Serial.println(value); delay(1000); }

Passos Rápidos

  • Copie o código acima e abra no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
  • Mergulhe o sensor na água devagar (em um copo de água).
  • Veja o resultado no Serial Monitor. O valor é 0 quando o sensor não está tocando em nada.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Sensor value: 0 Sensor value: 0 Sensor value: 0 Sensor value: 25 Sensor value: 97 Sensor value: 284 Sensor value: 428 Sensor value: 435 Sensor value: 441 Sensor value: 455 Sensor value: 467 Sensor value: 521 Sensor value: 528 Sensor value: 553
Ln 11, Col 1
Arduino Uno on COM15
2

※ Nota:

O sensor não foi projetado para ficar totalmente submerso; apenas as trilhas expostas na PCB podem entrar em contato com a água. Tenha cuidado ao instalá-lo.

Como Detectar Vazamento de Água

Para detectar vazamento de água, chuva e transbordamento de tanque, basta comparar o valor lido com um valor limite. O limite é determinado na parte de calibração deste tutorial.

Vamos ver um exemplo específico. O Arduino acende um LED se a água for detectada.

Diagrama de Ligação

Diagrama de ligação do Sensor de Água e LED com Arduino

This image is created using Fritzing. Click to enlarge image

Código Arduino - Detectando Vazamento de Água

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-water-sensor */ #define LED_PIN 2 #define POWER_PIN 7 #define SIGNAL_PIN A5 #define THRESHOLD 300 int value = 0; // variable to store the sensor value void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); // configure D2 pin as an OUTPUT pinMode(POWER_PIN, OUTPUT); // configure D7 pin as an OUTPUT digitalWrite(POWER_PIN, LOW); // turn the sensor OFF digitalWrite(LED_PIN, LOW); // turn LED OFF } void loop() { digitalWrite(POWER_PIN, HIGH); // turn the sensor ON delay(10); // wait 10 milliseconds value = analogRead(SIGNAL_PIN); // read the analog value from sensor digitalWrite(POWER_PIN, LOW); // turn the sensor OFF if (value > THRESHOLD) { Serial.print("The water is detected"); digitalWrite(LED_PIN, HIGH); // turn LED ON } else { digitalWrite(LED_PIN, LOW); // turn LED OFF } }

Como Medir o Nível da Água

Se você quiser dividir a altura máxima da água em alguns níveis e medir o nível atual, pode usar o método do código abaixo. Observe que a altura máxima da água é igual à altura do sensor. O código abaixo divide a altura máxima em 4 níveis.

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-water-sensor */ #define POWER_PIN 7 #define SIGNAL_PIN A5 #define SENSOR_MIN 0 #define SENSOR_MAX 521 int value = 0; // variable to store the sensor value int level = 0; // variable to store the water level void setup() { Serial.begin(9600); pinMode(POWER_PIN, OUTPUT); // configure D7 pin as an OUTPUT digitalWrite(POWER_PIN, LOW); // turn the sensor OFF } void loop() { digitalWrite(POWER_PIN, HIGH); // turn the sensor ON delay(10); // wait 10 milliseconds value = analogRead(SIGNAL_PIN); // read the analog value from sensor digitalWrite(POWER_PIN, LOW); // turn the sensor OFF level = map(value, SENSOR_MIN, SENSOR_MAX, 0, 4); // 4 levels Serial.print("Water level: "); Serial.println(level); delay(1000); }

※ Nota:

  • SENSOR_MIN e SENSOR_MAX são determinados pelo processo de calibração.
  • O método de mapeamento acima não é preciso. No entanto, ele é aceitável em muitas aplicações. Se você quiser torná-lo preciso, pode medir os valores limite para cada nível. Veja a parte de calibração

Calibração do Sensor de Nível de Água

O valor de saída do sensor depende não só do nível da água, mas também da condutividade da água. A água pura não é condutora. A água que contém minerais e impurezas é condutora. Quanto mais condutora for a água, mais sensível o sensor será. Por outro lado, o valor de saída também varia de acordo com a tensão fornecida ao pino VCC do sensor.

Para ter leituras precisas do sensor de água, recomendamos que você calibre o sensor para o tipo específico de água que pretende monitorar.

Antes de determinar o limite para disparar uma ação, você deve medir o valor real lido do sensor fazendo um teste.

Como fazer o teste:

  • Use o sketch acima para ler o valor do sensor.
  • Mergulhe o sensor na água até o nível que você quer usar como limite.
  • Anote o valor que o sensor mostra no Serial Monitor.
  • Use esse valor como o limite em que você pretende disparar uma ação.

Este teste pode exigir algumas tentativas e erros.

O teste também pode ser usado para encontrar:

  • O valor SENSOR_MIN, quando o sensor não está imerso na água
  • O valor SENSOR_MAX, quando o sensor está totalmente imerso na água
  • Um valor limite para detectar vazamento de água
  • Os valores limite para cada nível da sua escala.

Vídeo

O vídeo de demonstração abaixo usa o código a seguir:

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-water-sensor */ #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); // Water sensor pins #define SENSOR_POWER_PIN 5 #define SENSOR_SIGNAL_PIN A0 // Status indicator pins #define GREEN_LED_PIN 6 #define YELLOW_LED_PIN 7 #define RED_LED_PIN 8 #define BUZZER_PIN 9 // Calibrated sensor range #define SENSOR_MIN 30 #define SENSOR_MAX 470 // Exponential moving average filter float filteredSensor = 0.0; const float FILTER_ALPHA = 0.75; // Sensor sampling interval unsigned long lastSensorRead = 0; const unsigned long SENSOR_INTERVAL = 100; // LCD refresh interval unsigned long lastLCDUpdate = 0; const unsigned long LCD_INTERVAL = 250; // Buzzer timing unsigned long lastBuzzerTime = 0; const unsigned long BUZZER_INTERVAL = 300; bool buzzerState = false; /** * Read the water sensor while powering it only during measurement. * This helps reduce sensor corrosion during long-term operation. */ int readWaterSensor() { digitalWrite(SENSOR_POWER_PIN, HIGH); delayMicroseconds(500); int val = analogRead(SENSOR_SIGNAL_PIN); digitalWrite(SENSOR_POWER_PIN, LOW); return val; } void setup() { Serial.begin(115200); // Use 10-bit ADC resolution for Arduino UNO R4. #if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI) analogReadResolution(10); #endif // Configure sensor power and signal pins. pinMode(SENSOR_POWER_PIN, OUTPUT); digitalWrite(SENSOR_POWER_PIN, LOW); // Configure LEDs and buzzer. pinMode(GREEN_LED_PIN, OUTPUT); pinMode(YELLOW_LED_PIN, OUTPUT); pinMode(RED_LED_PIN, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); // Ensure all indicators are OFF at startup. digitalWrite(GREEN_LED_PIN, LOW); digitalWrite(YELLOW_LED_PIN, LOW); digitalWrite(RED_LED_PIN, LOW); digitalWrite(BUZZER_PIN, LOW); // Initialize LCD. lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(4, 0); lcd.print("WATER LEVEL"); lcd.setCursor(6, 1); lcd.print("MONITOR"); lcd.setCursor(5, 3); lcd.print("Starting..."); delay(1500); lcd.clear(); // Initialize the filter with the first sensor reading. filteredSensor = readWaterSensor(); } void loop() { // Read and filter the sensor periodically. if (millis() - lastSensorRead >= SENSOR_INTERVAL) { lastSensorRead = millis(); int rawSensor = readWaterSensor(); // Apply exponential moving average to reduce sensor noise. filteredSensor = FILTER_ALPHA * rawSensor + (1.0 - FILTER_ALPHA) * filteredSensor; // Limit the sensor value to the calibrated range. int clampedSensor = constrain( (int)filteredSensor, SENSOR_MIN, SENSOR_MAX ); // Convert the sensor value into a water level from 0 to 4. int level = map( clampedSensor, SENSOR_MIN, SENSOR_MAX, 0, 4 ); // Update the LED indicator according to the water level. if (level == 0) { digitalWrite(GREEN_LED_PIN, LOW); digitalWrite(YELLOW_LED_PIN, LOW); digitalWrite(RED_LED_PIN, LOW); } else if (level <= 2) { digitalWrite(GREEN_LED_PIN, HIGH); digitalWrite(YELLOW_LED_PIN, LOW); digitalWrite(RED_LED_PIN, LOW); } else if (level == 3) { digitalWrite(GREEN_LED_PIN, LOW); digitalWrite(YELLOW_LED_PIN, HIGH); digitalWrite(RED_LED_PIN, LOW); } else { digitalWrite(GREEN_LED_PIN, LOW); digitalWrite(YELLOW_LED_PIN, LOW); digitalWrite(RED_LED_PIN, HIGH); } } // Convert the filtered sensor value into the current water level. int currentLevel = map( constrain( (int)filteredSensor, SENSOR_MIN, SENSOR_MAX ), SENSOR_MIN, SENSOR_MAX, 0, 4 ); // Activate the buzzer when the water level reaches the maximum. if (currentLevel == 4) { if (millis() - lastBuzzerTime >= BUZZER_INTERVAL) { lastBuzzerTime = millis(); buzzerState = !buzzerState; digitalWrite(BUZZER_PIN, buzzerState ? HIGH : LOW); } } else { // Immediately stop the buzzer when the level drops below maximum. digitalWrite(BUZZER_PIN, LOW); buzzerState = false; } // Refresh the LCD periodically to avoid unnecessary screen updates. if (millis() - lastLCDUpdate >= LCD_INTERVAL) { lastLCDUpdate = millis(); lcd.setCursor(0, 0); lcd.print("Water Level "); lcd.setCursor(0, 1); lcd.print("Level: "); lcd.print(currentLevel); lcd.print(" / 4 "); // Output sensor data for debugging and calibration. Serial.print("ADC: "); Serial.print((int)filteredSensor); Serial.print(" | Level: "); Serial.print(currentLevel); Serial.println(" / 4"); } }

Desafie-se

  • Enviar um e-mail ao detectar vazamento de água
  • Enviar uma mensagem SMS ao detectar vazamento de água
  • Fazer um alarme sonoro ao detectar vazamento de água

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!