Arduino UNO R4 - Sensor de Água

Este tutorial vai nos ensinar a usar um sensor de água com o Arduino UNO R4. Um sensor de água pode descobrir se há um vazamento de água, medir a chuva, verificar se um tanque está transbordando ou checar o nível de água. Em detalhes, vamos aprender:

Arduino UNO R4 e módulo sensor de água

Sobre o Sensor de Nível de Água

Pinagem do Sensor de Nível de Água

O sensor de nível de água tem três pinos:

  • Pino S (Signal): é uma saída analógica. Conecte-o a uma entrada analógica do seu Arduino UNO R4.
  • Pino + (VCC): este pino alimenta o sensor. Use de 3,3V a 5V para alimentá-lo.
  • Pino - (GND): é a conexão de terra.
Pinagem do sensor de água

※ Nota:

A saída do pino de sinal do sensor muda conforme a tensão aplicada ao pino VCC.

Como Funciona o Sensor de Nível de Água

Quando o sensor está em mais água, a tensão de saída no pino de sinal aumenta.

Vamos olhar com mais atenção.

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 dez linhas de cobre visíveis. Ele tem cinco linhas de alimentação e cinco linhas de sensor. Essas linhas ficam lado a lado, alternando uma linha de sensor entre cada duas linhas de alimentação. Normalmente, essas linhas não se tocam, mas se o sensor for colocado na água, a água conecta as linhas.

As trilhas funcionam como um resistor variável (parecido com um potenciômetro) que muda a sua resistência conforme o nível de água.

  • A mudança na resistência mostra a distância entre o topo do sensor e a superfície da água.
  • A resistência diminui conforme o nível de água sobe.
  • Quando o sensor está mais submerso, ele conduz melhor a eletricidade, e a resistência fica menor.
  • Quando o sensor está menos submerso, ele conduz pior a eletricidade, e a resistência fica maior.
  • O sensor fornece uma tensão de saída com base na resistência.

Podemos descobrir o nível de água medindo a tensão.

Diagrama de Ligação

Para alimentar o sensor, conecte o pino VCC do sensor ao pino 5V do Arduino UNO R4 e o pino GND ao pino GND do Arduino.

No entanto, não é recomendável alimentar o sensor o tempo todo em um ambiente úmido, pois isso pode fazer o sensor corroer rapidamente, reduzindo a sua vida útil. Para evitar isso, sugerimos alimentar o sensor somente quando você precisar ler os seus dados. Você pode fazer isso conectando o pino VCC do sensor a um pino digital do Arduino UNO R4. Coloque o pino do Arduino em HIGH para ler o sensor e depois em LOW quando terminar.

Diagrama de ligação do sensor de água no Arduino UNO R4

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Uno R4 e outros componentes.

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

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-water-sensor */ #define POWER_PIN 5 // The Arduino UNO R4 pin connected to the VCC pin of water sensor to control the power #define SIGNAL_PIN A0 // The Arduino UNO R4 pin connected to the signal pin of water sensor int value = 0; // Variable for storing the value read from the sensor void setup() { Serial.begin(9600); // Start serial communication at 9600 baud pinMode(POWER_PIN, OUTPUT); // Set POWER_PIN as an output digitalWrite(POWER_PIN, LOW); // Initially set the POWER_PIN LOW to turn the sensor off } void loop() { digitalWrite(POWER_PIN, HIGH); // Set POWER_PIN HIGH to power the sensor delay(10); // Allow sensor time to stabilize (10ms delay) value = analogRead(SIGNAL_PIN); // Read the value from the sensor digitalWrite(POWER_PIN, LOW); // Set POWER_PIN LOW to turn off the sensor Serial.print("Sensor value: "); // Print the sensor value to Serial Monitor Serial.println(value); // Display the sensor value delay(1000); // Wait for 1 second before reading again }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a sua primeira vez usando o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima na Arduino IDE.
  • Conecte o sensor de água ao Arduino Uno R4 conforme o diagrama fornecido.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 correta (por exemplo, Arduino Uno R4 WiFi) e a porta COM.
  • Copie o código fornecido e abra-o na Arduino IDE.
  • Pressione o botão Upload na Arduino IDE para enviar o código ao Arduino UNO R4.
  • Abaixe o sensor aos poucos na água (use um copo de água).
  • Confira o resultado no Serial Monitor. Ele mostra o valor 0 quando o sensor não está em contato com nada.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 R4 WiFi on COM15
2

※ Nota:

O sensor não deve ficar totalmente submerso na água; somente as partes expostas da placa de circuito podem tocar a água. Instale-o com cuidado.

Como Detectar Vazamento de Água

Para descobrir se há vazamento de água, chuva ou transbordamento de tanque, basta comparar a leitura com um limite definido. Definimos esse limite na etapa de calibração deste tutorial.

Código Arduino UNO R4 - Detectando Vazamento de Água

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-water-sensor */ #define POWER_PIN 5 // The Arduino UNO R4 pin connected to the VCC pin of water sensor to control the power #define SIGNAL_PIN A0 // The Arduino UNO R4 pin connected to the signal pin of water sensor #define THRESHOLD 300 int value = 0; // Initialize variable to store the value read from the sensor void setup() { Serial.begin(9600); pinMode(POWER_PIN, OUTPUT); // Set the power pin as an output digitalWrite(POWER_PIN, LOW); // Initially turn off the power } void loop() { digitalWrite(POWER_PIN, HIGH); // Enable power to the sensor delay(10); // Allow some time for the sensor to stabilize value = analogRead(SIGNAL_PIN); // Read the sensor output digitalWrite(POWER_PIN, LOW); // Disable power to the sensor if (value > THRESHOLD) { // Check if the sensor output exceeds the threshold Serial.print("The water is dedected"); // Send a message to the serial monitor } }

Como Medir o Nível de Água

Para dividir o nível máximo de água em diferentes estágios e verificar o estágio atual, use a técnica do código a seguir. Lembre-se de que o nível máximo de água corresponde à altura do sensor. Este código divide a altura máxima em 4 estágios.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-water-sensor */ #define POWER_PIN 5 // The Arduino UNO R4 pin connected to the VCC pin of water sensor to control the power #define SIGNAL_PIN A0 // The Arduino UNO R4 pin connected to the signal pin of water sensor #define SENSOR_MIN 0 // Minimum value for sensor #define SENSOR_MAX 521 // Maximum value for sensor int value = 0; // Holds the current sensor value int level = 0; // Holds the water level indicator void setup() { Serial.begin(9600); // Initialize serial communication pinMode(POWER_PIN, OUTPUT); // Set the power pin as output digitalWrite(POWER_PIN, LOW); // Initially turn off the sensor } void loop() { digitalWrite(POWER_PIN, HIGH); // Activate the sensor delay(10); // Wait for the sensor to stabilize value = analogRead(SIGNAL_PIN); // Read the sensor output digitalWrite(POWER_PIN, LOW); // Deactivate the sensor level = map(value, SENSOR_MIN, SENSOR_MAX, 0, 4); // Map sensor values to 0-4 scale Serial.print("Water level: "); // Print the label Serial.println(level); // Print the mapped water level delay(1000); // Wait one second before repeating }

※ Nota:

  • SENSOR_MIN e SENSOR_MAX são definidos durante o processo de calibração.
  • O método de mapeamento acima pode não ser preciso, mas funciona bem para muitos usos. Para melhorar a precisão, meça os valores de limite de cada nível, como explicado na seção de calibração.

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

A saída do sensor é afetada pelo nível de água e pela condutividade da água. A água pura não conduz eletricidade. No entanto, a água com minerais e impurezas conduz eletricidade. Quanto maior a condutividade da água, mais sensível o sensor se torna. Além disso, o valor de saída muda conforme as diferentes tensões aplicadas ao pino VCC do sensor.

Para obter leituras precisas do sensor de água, sugerimos calibrá-lo para o tipo específico de água que você vai monitorar.

Antes de definir o limite para uma ação, primeiro meça o valor real do sensor fazendo um teste.

Como fazer o teste:

  • Use o desenho fornecido para ler o valor do sensor.
  • Coloque o sensor na água até o nível desejado.
  • Anote o valor mostrado no Serial Monitor.
  • Defina esse valor como o limite para ativar uma ação.

Este teste pode precisar de algumas tentativas para dar certo.

O teste também pode ajudar a descobrir:

  • O valor mínimo do sensor quando ele está fora da água.
  • O valor máximo do sensor quando ele está completamente na água.
  • Um valor de limite para detectar vazamentos de água.
  • Valores de limite para cada nível da sua escala.

Vídeo

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

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-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"); } }

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!