This is an old revision of the document!
Silvestru Radu - 335CC
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 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 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
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
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
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 |
``` #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 ```
``` OneWire oneWire(TEMP_DATA_PIN); DallasTemperature tempSensor(&oneWire); ```
``` const float EC_VOLT_LOW = 0.20; Voltage in distilled water const float EC_VOLT_HIGH = 1.12; Voltage in 1413 uS/cm solution 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() ```
== Pin Setup == ``` pinMode(EC_IN1, OUTPUT); pinMode(EC_IN2, OUTPUT); ```
== Serial & Sensors == ``` Serial.begin(9600); tempSensor.begin(); ```
== LCD Init (manual style) == Wire.begin(); lcd.begin(16, 2); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Water Monitor"); delay(2000); lcd.clear(); ```
void loop() {
// === EC Sensor Measurement (manually alternating) === digitalWrite(EC_IN1, HIGH); digitalWrite(EC_IN2, LOW); delayMicroseconds(5000); // ~5 ms int adc1 = analogRead(EC_ANALOG);
digitalWrite(EC_IN1, LOW); digitalWrite(EC_IN2, HIGH); delayMicroseconds(5000); // ~5 ms 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;
// Apply calibration to get conductivity float ec_uScm = EC_SLOPE * (voltage_avg - EC_OFFSET); if (ec_uScm < 0) ec_uScm = 0;
// === Turbidity Sensor === int turb_raw = analogRead(TURBIDITY_PIN); float turb_voltage = turb_raw * (5.0 / 1023.0);
// === Temperature Sensor === tempSensor.requestTemperatures(); float tempC = tempSensor.getTempCByIndex(0);
// === Serial Monitor Output === 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("========================\n");
// === LCD Display Output === 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);
} ```