Mini statie de monitorizare a calitatii apei

Silvestru Radu - 335CC

Introducere

Calitatea apei este un indicator esențial pentru sănătatea mediului și a oamenilor. Detectarea și monitorizarea parametrilor apei pot ajuta la identificarea contaminărilor și la evaluarea potabilității acesteia. Acest proiect își propune să construiască o mini stație de testare a calității apei, capabilă să măsoare temperatura, pH-ul, turbiditatea și conductivitatea (EC - electrical conductivity) apei

Scopul

Scopul proiectului este de a construi un dispozitiv compact și accesibil pentru evaluarea rapidă a calității apei, utilizând un Arduino Nano și senzori low-cost

Ideea de la care am pornit

Ideea a pornit de la dorința de a crea un sistem accesibil și educativ care să permită testarea calității apei, fără a depinde de soluții comerciale scumpe

De ce cred ca este util

Credem că proiectul este util pentru că oferă o metodă simplă și accesibilă de a evalua rapid calitatea apei, un aspect esențial pentru sănătatea umană și protecția mediului

Descriere generala

Sistemul este compus din următoarele module:

  * Senzor de temperatură (DS18B20) – măsoară temperatura apei și transmite date digitale către microcontroler
  * Senzor de turbiditate – detectează nivelul de impurități din apă
  * Senzor de conductivitate electrică (EC) – construit folosind electrozi metalici, măsoară concentrația totală de săruri dizolvate în apă
  * Display OLED/I2C – afișează mesaje de stare și valori ale parametrilor măsurați.
  * Microcontroler (Arduino Nano) – colectează și procesează datele de la senzori, calculează valorile finale și controlează ieșirile

Hardware Design

Nume componentă Model Protocol
Microcontroler Arduino Nano -
Senzor de turbiditate Turbidity V1.3 ADC
Senzor de conductivitate DIY EC Sensor ADC
Display OLED (I2C) I2C
Modul H-Bridge L9110S PWM

Schema Bloc

Schema Electrica

Software

Librarie Scop
Wire.h Comunicare I2C (pentru LCD)
LiquidCrystal_I2C.h Afișare pe LCD 1602 cu interfață I2C
OneWire.h Protocol OneWire pentru senzorul de temperatură DS18B20
DallasTemperature.h Citirea temperaturii de la senzorul DS18B20
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
#define EC_IN1 7
#define EC_IN2 6
#define EC_ANALOG A0
#define EC_REF_RESISTOR 1000.0
 
#define TURBIDITY_PIN A1
 
#define TEMP_DATA_PIN 2
OneWire oneWire(TEMP_DATA_PIN);
DallasTemperature tempSensor(&oneWire);
 
const float EC_VOLT_LOW = 0.20;
const float EC_VOLT_HIGH = 1.12;
const float EC_LOW_UScm = 0.0;
const float EC_HIGH_UScm = 1413.0;
 
const float EC_SLOPE = (EC_HIGH_UScm - EC_LOW_UScm) / (EC_VOLT_HIGH - EC_VOLT_LOW);
const float EC_OFFSET = EC_VOLT_LOW;
 
void setup() {
  pinMode(EC_IN1, OUTPUT);
  pinMode(EC_IN2, OUTPUT);
  Serial.begin(9600);
  tempSensor.begin();
  Wire.begin();
  lcd.begin(16, 2);
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Water Monitor");
  delay(2000);
  lcd.clear();
}
 
void loop() {
  digitalWrite(EC_IN1, HIGH);
  digitalWrite(EC_IN2, LOW);
  delayMicroseconds(5000);
  int adc1 = analogRead(EC_ANALOG);
 
  digitalWrite(EC_IN1, LOW);
  digitalWrite(EC_IN2, HIGH);
  delayMicroseconds(5000);
  int adc2 = analogRead(EC_ANALOG);
 
  float voltage_avg = ((adc1 + adc2) / 2.0) * (5.0 / 1023.0);
  float current_mA = voltage_avg / EC_REF_RESISTOR * 1000.0;
  float ec_uScm = EC_SLOPE * (voltage_avg - EC_OFFSET);
  if (ec_uScm < 0) ec_uScm = 0;
 
  int turb_raw = analogRead(TURBIDITY_PIN);
  float turb_voltage = turb_raw * (5.0 / 1023.0);
 
  tempSensor.requestTemperatures();
  float tempC = tempSensor.getTempCByIndex(0);
 
  Serial.println("==== WATER QUALITY ====");
  Serial.print("Temperature: "); Serial.print(tempC); Serial.println(" C");
  Serial.print("EC: "); Serial.print(ec_uScm); Serial.println(" uS/cm");
  Serial.print("Turbidity Voltage: "); Serial.print(turb_voltage, 2); Serial.println(" V");
  Serial.println("========================");
 
  lcd.setCursor(0, 0);
  lcd.print("T:"); lcd.print(tempC, 1); lcd.print("C ");
  lcd.print("EC:"); lcd.print((int)ec_uScm);
 
  lcd.setCursor(0, 1);
  lcd.print("Turb:"); lcd.print(turb_voltage, 1); lcd.print("V");
 
  delay(1500);
}
pm/prj2025/vstoica/radu.silvestru.txt · Last modified: 2025/05/26 20:29 by radu.silvestru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0