Arduino-Based Water Quality Monitoring System with SIM900A and Multiple Sensors
View and Edit Project In Cirkit Designer
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
- Pins: SIG, GND, VCC
- Description: Measures the flow rate of water.
- Purpose in Circuit: Provides real-time water flow data to the Arduino.
SIM900A
- Pins: GND, DB9-3 (RXD), DB9-2 (TXD), 5V, 3VR, 5VR, 3VT, 5VT, VCC, Ring, RESTART, RESET, STATUS
- Description: GSM module for sending SMS.
- Purpose in Circuit: Sends sensor data via SMS.
Temperature Sensor
- Pins: Temp GND Black, Temp VDD Red, Temp DQ Data Yellow
- Description: Measures temperature.
- Purpose in Circuit: Provides temperature data to the Arduino.
Resistor
- Pins: pin1, pin2
- Description: 200 Ohms resistor.
- Purpose in Circuit: Used for current limiting or voltage division.
Turbidity Sensor
- Pins: OUT, VCC, GND
- Description: Measures the turbidity of water.
- Purpose in Circuit: Provides turbidity data to the Arduino.
Battery Pack
- Pins: +, -
- Description: Power supply for the circuit.
- Purpose in Circuit: Provides power to the entire circuit.
Arduino UNO
- Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
- Description: Main microcontroller.
- Purpose in Circuit: Interfaces with all sensors and the GSM module, processes data, and sends SMS.
Wiring Details
YF-S201 Water Flow Meter
- SIG: Connected to Arduino UNO pin D2
- GND: Connected to Arduino UNO GND
- VCC: Connected to Arduino UNO 5V
SIM900A
- GND: Connected to Arduino UNO GND
- 5VT: Connected to Arduino UNO pin D11
- 5VR: Connected to Arduino UNO pin D10
- VCC: Connected to Arduino UNO IOREF
Temperature Sensor
- Temp GND Black: Not connected
- Temp VDD Red: Not connected
- Temp DQ Data Yellow: Not connected
Resistor
- pin1: Connected to pin2 (self-connected)
Turbidity Sensor
- OUT: Connected to Arduino UNO pin A0
- GND: Connected to Arduino UNO GND
- VCC: Connected to Arduino UNO 5V
Battery Pack
- +: Not connected
- -: Not connected
Arduino UNO
- D2: Connected to YF-S201 Water Flow Meter SIG
- D3: Not connected
- D10: Connected to SIM900A 5VR
- D11: Connected to SIM900A 5VT
- A0: Connected to Turbidity Sensor OUT
- 5V: Connected to YF-S201 Water Flow Meter VCC, Turbidity Sensor VCC
- GND: Connected to YF-S201 Water Flow Meter GND, Turbidity Sensor GND, SIM900A GND
- IOREF: Connected to SIM900A VCC
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