IoT-система мониторинга качества воды на Arduino с Bluetooth
Компоненты и материалы
| Arduino UNO | ×1 |
| Провода-перемычки (Male/Female) | ×1 |
| Bluetooth-модуль HC-05 | ×1 |
| RGB-светодиод (общий катод) | ×1 |
| Резистор 330 Ом | ×3 |
| Потенциометр (для контраста LCD) | ×1 |
| RGB LCD Shield 16x2 | ×1 |
| Резистор 1 кОм | ×1 |
Инструменты
- Обезжириватель и кусачки для проводов (26–14 AWG)
Программное обеспечение и сервисы
- Arduino IDE
- Приложение Ardutooth (для приема данных по Bluetooth)
О проекте
Вода — жизненно важный ресурс. Мы должны быть уверены в её качестве.
Что такое TDS?
TDS (Total Dissolved Solids) — общее количество растворенных твердых веществ в воде, в ppm (частей на миллион). Рассчитывается по электрической проводимости: чем выше проводимость, тем выше TDS.
Ориентировочные значения:
- Дистиллированная вода: 80–150 ppm
- Водопроводная: 250–350 ppm
- Грунтовые воды: 500–1000 ppm
- Морская вода: ~30 000 ppm
ВОЗ рекомендует TDS питьевой воды ниже 300 ppm. Ниже 100 ppm — вода лишена минералов. Выше 300 — слишком «жесткая».
Обычно используют TDS-перо, но его нельзя интегрировать с Arduino. Есть специальные TDS-метры с интерфейсом, но я решил обойтись без них.

Схема подключения
Arduino
- 5V → одна шина питания на макетке
- GND → вторая шина
- Резистор 1 кОм: один конец на GND, второй на макетку. Аналоговый вход A0 к резистору. Провод от резистора и провод от 5V — свободные концы к крокодилам (электродам в воде).

LCD-дисплей
- VSS → GND
- VDD → 5V
- V0 → средний вывод потенциометра (края потенциометра на 5V и GND)
- RS → D7, R/W → GND, E → D8
- D4–D7 → D10–D13

Bluetooth HC-05
- VCC → 5V, GND → GND
- TX → D3 (Arduino RX), RX → D2 (Arduino TX)

RGB-светодиод
- Общий катод (самый длинный вывод) → GND
- Красный (справа от катода) → PWM D9 через 330 Ом
- Зеленый (слева) → PWM D6 через 330 Ом
- Синий (крайний левый) → PWM D5 через 330 Ом

Вывод формулы расчета сопротивления
Используем закон Ома: V = I·R. Два резистора последовательно: R₁ = 1000 Ом (на плате), R₂ — сопротивление воды между электродами. Ток через АЦП пренебрежимо мал, значит ток одинаков. Напряжение на R₁ измеряется АЦП (V₁). Общее напряжение 5В = V₁ + V₂. Отсюда:
V₂ = 5 - V₁
V₂ / V₁ = R₂ / R₁
R₂ = R₁ * (5 - V₁) / V₁
Переменная buffer = (5 - V₁) / V₁, тогда R₂ = buffer * R₁.
Принцип работы
- Измеряем сопротивление воды R₂.
- Вычисляем удельное сопротивление:
ρ = R₂ * A / L(A — площадь сечения электродов, L — расстояние между ними). - Проводимость:
σ = 1/ρ(См/м). - TDS =
σ * 7000(эмпирический коэффициент перевода в ppm).
R = ρ * L / A → ρ = R * A / L
c = 1 / ρ
TDS = c * 7000
Библиотеки
Установка: Sketch → Include Library → Manage Libraries → поиск по названию.

Код
Код мониторинга качества воды
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
SoftwareSerial BTserial(3, 2); // RX, TX для HC-05
float reads; int pin = A0;
float vOut = 0, vIn = 5, R1 = 1000, R2 = 0, buffer = 0;
float TDS, R = 0, r = 0, L = 0.06, A = 0.000154;
float C = 0, Cm = 0;
int rPin = 9, bPin = 5, gPin = 6;
int rVal = 255, bVal = 255, gVal = 255;
LiquidCrystal lcd(7, 8, 10, 11, 12, 13);
void setup() {
Serial.begin(9600);
BTserial.begin(9600);
lcd.begin(16, 2);
pinMode(rPin, OUTPUT);
pinMode(bPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(pin, INPUT);
lcd.print("Conductivity: ");
}
void loop() {
reads = analogRead(A0);
vOut = reads * 5.0 / 1023.0;
Serial.println(reads);
buffer = (vIn / vOut) - 1;
R2 = R1 * buffer;
Serial.println(R2);
delay(500);
r = R2 * A / L; // удельное сопротивление
C = 1 / r; // проводимость См/м
Cm = C * 10; // мСм/см
TDS = Cm * 700; // ppm
lcd.setCursor(0, 1);
lcd.print(C);
// RGB-индикация по уровню сигнала
if (reads < 600) {
if (reads <= 300) setColor(255, 0, 255);
else if (reads > 200) setColor(200, 0, 255);
} else {
if (reads <= 900) setColor(0, 0, 255);
else if (reads > 700) setColor(0, 255, 255);
}
// Отправка в Ardutooth: проводимость, TDS
BTserial.print(C); BTserial.print(",");
BTserial.print(TDS); BTserial.print(";");
delay(500);
}
void setColor(int red, int green, int blue) {
analogWrite(rPin, 255 - red);
analogWrite(gPin, 255 - green);
analogWrite(bPin, 255 - blue);
}
Корпус и монтаж
Использовал старую пробирку: проделал отверстия на концах, вставил провода, зафиксировал молоточкой.

Схемы

Производственный процесс
- Raspberry Pi и HDC2010: полное руководство по настройке I2C датчика температуры и влажности
- Подключение Raspberry Pi 3 к датчику DHT11 и загрузка данных в облако ThingsIo.ai
- Умное мусорное ведро: клеточное IoT-решение для автоматизированного управления отходами
- Солнечный датчик качества воздуха на Helium: руководство по проектированию и развёртыванию
- Интеграция высокочувствительного датчика воды Phantom YoYo с ADC MCP3008 на Raspberry Pi
- Точный мониторинг температуры и влажности с SHT15 на Windows 10 IoT Core
- Многопозиционная система датчиков температуры для интеграции в умный дом
- Умная бутылка для воды на Arduino: мониторинг и напоминания в реальном времени
- Умный водяной пистолет с датчиком движения на Arduino Nano
- Продвинутый углеродный датчик NO₂ улучшает мониторинг качества воздуха в помещениях