Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino-Based Water Quality Monitoring System with SIM900A and Multiple Sensors

View and Edit Project In Cirkit DesignerImage of Arduino-Based Water Quality Monitoring System with SIM900A and Multiple Sensors

Circuit Documentation

Summary

This circuit is designed to monitor water flow, temperature, and turbidity. It uses an Arduino UNO as the main microcontroller to interface with various sensors and a SIM900A module for GSM communication. The sensors include a YF-S201 Water Flow Meter, a Temperature Sensor, and a Turbidity Sensor. The data collected from these sensors is processed and sent via SMS using the SIM900A module.

Component List

YF-S201 Water Flow Meter

SIM900A

Temperature Sensor

Resistor

Turbidity Sensor

Battery Pack

Arduino UNO

Wiring Details

YF-S201 Water Flow Meter

SIM900A

Temperature Sensor

Resistor

Turbidity Sensor

Battery Pack

Arduino UNO

Documented Code

#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>

SoftwareSerial GSM(11, 10); // Pinos RX e TX conectados ao módulo SIM900

// Defina os pinos aos quais os sensores estão conectados
#define FLOW_SENSOR_PIN 2
#define ONE_WIRE_BUS 3      // sinal do sensor DS18B20
#define TURBIDITY_SENSOR_PIN A0 // pino do sensor de turbidez

// Variáveis para armazenar os dados do sensor de fluxo de água
volatile int pulseCount;
float flowRate;

// Variáveis para armazenar os dados do sensor de temperatura
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1;

// Variáveis para armazenar os dados do sensor de turbidez
double NTU = 0.0;

// Variáveis para cálculos
unsigned long startTime;
unsigned long currentTime;
unsigned long totalPulses;
unsigned long lastSMSTime = 0; // Para rastrear o tempo da última mensagem de texto
const unsigned long interval = 30000; // Intervalo de 30 segundos para testes

void setup() {
  // Inicialize a comunicação serial para visualizar os resultados
  Serial.begin(9600);
  GSM.begin(9600);

  GSM.println("AT");
  delay(1000);
  while (GSM.available()) {
    Serial.write(GSM.read()); // Mostra a resposta no Monitor Serial
  }

  GSM.println("AT+CMGF=1"); // Configura o módulo para o modo texto
  delay(1000);

  Serial.println("Initializing...");

  // Inicialize as variáveis do sensor de fluxo de água
  pulseCount = 0;
  flowRate = 0;
  totalPulses = 0;

  // Configure o pino do sensor de fluxo como entrada
  pinMode(FLOW_SENSOR_PIN, INPUT);

  // Attach uma interrupção ao pino do sensor para contar os pulsos
  attachInterrupt(digitalPinToInterrupt(FLOW_SENSOR_PIN), pulseCounter, FALLING);

  // Inicie o tempo de início
  startTime = millis();

  // Inicie o sensor de temperatura
  sensors.begin();

  // Localize e mostre endereços dos sensores
  Serial.println("Localizando sensores DS18B20...");
  Serial.print("Foram encontrados ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sensores.");

  if (!sensors.getAddress(sensor1, 0))
    Serial.println("Sensores nao encontrados !");

  // Mostra o endereço do sensor encontrado no barramento
  Serial.print("Endereco sensor: ");
  mostra_endereco_sensor(sensor1);
  Serial.println();
  Serial.println();
}

void loop() {
  // Calcule o tempo decorrido desde a última mensagem de texto
  unsigned long currentTime = millis();
  if (currentTime - lastSMSTime >= interval) {
    // Envie uma mensagem de texto
    sendSMS("+5575981342134", getSensorData());
    lastSMSTime = currentTime;
  }

  // Mostra os dados no monitor serial
  Serial.println(getSensorData());
  delay(10000); // Aguarde 10 segundos
}

// Função para obter dados dos sensores
String getSensorData() {
  // Calcule a taxa de fluxo em litros por segundo
  flowRate = (float)pulseCount / (float)totalPulses;

  // Le a informacao do sensor de temperatura
  sensors.requestTemperatures();
  float tempC = sensors.getTempC(sensor1);

  // Leitura e cálculo da turbidez
  int sensorValue = analogRead(TURBIDITY_SENSOR_PIN);
  float voltage = sensorValue * (5.0 / 1024.0); 
  NTU = calc_NTU(voltage); // Calcula NTU usando a função

  // Formate os dados em uma string
  String data = "Fluxo de agua (litros/s): " + String(flowRate, 2) + "\n";
  data += "Temperatura (C): " + String(tempC, 2) + "\n";
  data += "Turbidez (NTU): " + String(NTU, 2);

  // Reinicie as variáveis do sensor de fluxo para a próxima leitura
  pulseCount = 0;
  totalPulses = 0;

  return data;
}

// Função para enviar mensagem de texto
void sendSMS(const char* number, String message) {
  GSM.print("AT+CMGS=\"");
  GSM.print(number);
  GSM.println("\"");
  delay(500);
  GSM.print(message);
  delay(500);
  GSM.println((char)26); // Ctrl+Z
  delay(5000); // Aguarde um tempo para a mensagem ser enviada

  // Verifique a resposta do módulo
  while (GSM.available()) {
    Serial.write(GSM.read());
  }
}

// Função de interrupção para contar os pulsos do sensor de fluxo de água
void pulseCounter() {
  pulseCount++;
  totalPulses++;
}

// Função