В этом проекте мы узнаем как сделать собственный измеритель общей минерализации воды с использованием NodeMCU ESP8266, датчика TDS и технологий Интернета вещей (IoT). Значение TDS (Total Dissolved Solids, общее количество растворенных твердых веществ) дает сумму растворенных твердых веществ в воде. К этим твердым веществам относятся, например, соли, минералы и ионы проводящих металлов. Это значение также называется проводимостью воды. Поскольку чем больше таких твердых веществ или ионов находится в воде, тем лучше она проводит электричество. Измерители TDS обычно количественно измеряют эту проводимость в микросименсах или ppm. Последнее означает части на миллион, то есть количество твердых частиц на миллион частиц водной смеси. Значение 40 ppm означает, что из миллиона частиц есть 40 растворенных ионов, и, следовательно, остальные (= 999 960) являются молекулами воды.
Датчик TDS может измерять не только TDS жидкости, но и ее EC (Electrical Conductivity - электропроводность). Измеритель электропроводности (EC-метр) измеряет электропроводность раствора. Он имеет множество применений в исследованиях и проектировании, с общим использованием в гидропонике, аквакультуре, аквапонике, рыбоводстве и пресноводных системах для контроля количества питательных веществ, солей или примесей в воде.
Чтобы сделать наш собственный измеритель TDS на основе IoT, нам понадобится датчик TDS, а также датчик температуры, который должен быть водонепроницаемым. Для отправки измеренных данных TDS, EC и температуры нам нужна платформа IoT. Лучшая бесплатная платформа IoT — Blynk . Измеритель TDS на основе ESP8266 подключается к Wi-Fi и непрерывно отправляет данные в приложение Blynk. Таким образом, вы можете получать круглосуточный отчет о качестве вашей воды. Таким образом, датчик TDS является лучшим датчиком для мониторинга качества воды.
В последнее время с Blynk происходят какие то метаморфозы, то он становится платным для жителей России, то платным, поэтому если он стал платным как раз в то время когда вы собрались сделать данный проект или Blynk чем то не устраивает, то есть еще одна очень перспективная платформа для проектов Интернета вещей - это Thingspeak, на нашем сайте мы уже рассматривали множество проектов с ее использованием. Вместо Blynk также можно использовать Sinric Pro или одну из других перспективных платформ IoT.
Ранее на нашем сайте мы также рассматривали подключение TDS датчика к плате ESP32. Возможно, вас заинтересуют и другие проекты измерителей качества воды:
- определение качества воды с помощью Arduino и датчика мутности;
- pH-метр (измеритель кислотности) на Arduino Uno.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- TDS датчик (купить на AliExpress).
- Цифровой датчик температуры DS18B20 (купить на AliExpress).
- Резистор 4,7 кОм.
- Макетная плата.
- Соединительные провода/перемычки.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема подключения TDS датчика к NodeMCU ESP8266 представлена на следующем рисунке.
Аналоговый вывод датчика TDS подключен к контакту A0 NodeMCU. Вывод VCC подключен к 3,3 В платы, а GND датчика - к GND платы.
Использование датчика температуры DS18B0 предназначено для целей калибровки. Это связано с тем, что значение TDS изменяется в зависимости от изменения температуры, поэтому необходима температурная компенсация в зависимости от изменения температуры жидкости. Это осуществляется с помощью DS18B20, водонепроницаемого датчика температуры.
Настройка приложения Blynk
Проект мониторинга качества воды IoT был бы неполным без приложения Blynk. Это приложение специально разработано для проектов Интернета вещей. Оно может управлять оборудованием удаленно, отображать данные датчиков, хранить данные, визуализировать их и делать много других интересных вещей.
Загрузите и установите приложение Blynk из Google Play Store. Пользователи iOS могут загрузить его из App Store. После завершения установки откройте приложение и зарегистрируйтесь, используя свой адрес электронной почты и пароль.
Создайте свой пользовательский интерфейс, перетаскивая и заполняя данные вместе с назначением виртуального контакта. После создания пользовательского интерфейса вы можете запросить токен аутентификации, отправив письмо. Вам понадобится токен аутентификации для кода программы.
Исходный код программы
Исходный код программа для нашего измерителя качества воды с использованием TDS датчика и ESP8266 приведены ниже. Вы можете загрузить этот код на плату NodeMCU. Перед компиляцией скетча необходимо добавить следующую библиотеку в Arduino IDE.
1 2 3 |
char auth[] = "******************************"; char ssid[] = "******************************"; char pass[] = "******************************"; |
Полный код программы выглядит следующим образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
#include <Blynk.h> #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> char auth[] = "fqMvEno5LtFrd_UcIpyyc6U03ehbgeQU"; // You should get Auth Token in the Blynk App. char ssid[] = "Alexahome"; // Your WiFi credentials. char pass[] = "loranthus"; int DSPIN = D5; // Dallas Temperature Sensor namespace pin { const byte tds_sensor = A0; // TDS Sensor } namespace device { float aref = 3.3; } namespace sensor { float ec = 0; unsigned int tds = 0; float ecCalibration = 1; } void setup() { Serial.begin(115200); // Dubugging on hardware Serial 0 Blynk.begin(auth, ssid, pass); } void loop() { Blynk.run(); double waterTemp = TempRead(); waterTemp = waterTemp*0.0625; // conversion accuracy is 0.0625 / LSB float rawEc = analogRead(pin::tds_sensor) * device::aref / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value float temperatureCoefficient = 1.0 + 0.02 * (waterTemp - 25.0); // temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); sensor::ec = (rawEc / temperatureCoefficient) * sensor::ecCalibration; // temperature and calibration compensation sensor::tds = (133.42 * pow(sensor::ec, 3) - 255.86 * sensor::ec * sensor::ec + 857.39 * sensor::ec) * 0.5; //convert voltage value to tds value Serial.print(F("TDS:")); Serial.println(sensor::tds); Serial.print(F("EC:")); Serial.println(sensor::ec, 2); Serial.print(F("Temperature:")); Serial.println(waterTemp,2); Serial.print(F("")); Blynk.virtualWrite(V1, sensor::tds); Blynk.virtualWrite(V2, sensor::ec); Blynk.virtualWrite(V3, waterTemp); delay(1000); } boolean DS18B20_Init() { pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); delayMicroseconds(5); digitalWrite(DSPIN, LOW); delayMicroseconds(750);//480-960 digitalWrite(DSPIN, HIGH); pinMode(DSPIN, INPUT); int t = 0; while(digitalRead(DSPIN)) { t++; if(t > 60) return false; delayMicroseconds(1); } t = 480 - t; pinMode(DSPIN, OUTPUT); delayMicroseconds(t); digitalWrite(DSPIN, HIGH); return true; } void DS18B20_Write(byte data) { pinMode(DSPIN, OUTPUT); for(int i=0; i<8; i++) { digitalWrite(DSPIN, LOW); delayMicroseconds(10); if(data & 1) digitalWrite(DSPIN, HIGH); else digitalWrite(DSPIN, LOW); data >>= 1; delayMicroseconds(50); digitalWrite(DSPIN, HIGH); } } byte DS18B20_Read() { pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); delayMicroseconds(2); byte data = 0; for(int i=0; i<8; i++) { digitalWrite(DSPIN, LOW); delayMicroseconds(1); digitalWrite(DSPIN, HIGH); pinMode(DSPIN, INPUT); delayMicroseconds(5); data >>= 1; if(digitalRead(DSPIN)) data |= 0x80; delayMicroseconds(55); pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); } return data; } int TempRead() { if(!DS18B20_Init()) return 0; DS18B20_Write (0xCC); // Send skip ROM command DS18B20_Write (0x44); // Send reading start conversion command if(!DS18B20_Init()) return 0; DS18B20_Write (0xCC); // Send skip ROM command DS18B20_Write (0xBE); // Read the register, a total of nine bytes, the first two bytes are the conversion value int waterTemp = DS18B20_Read (); // Low byte waterTemp |= DS18B20_Read () << 8; // High byte return waterTemp; } |
Тестирование работы проекта
После загрузки кода Nodemcu будет пытаться подключиться к сети. Как только она подключится к сети Wi-Fi, она начнет отправлять данные на сервер Blynk.
Вы можете взять различные образцы воды и проверить значение TDS, значение EC, а также ее температуру. Добавление солей или любого ионного растворенного вещества может быстро повысить значение TDS.
Данные можно отслеживать на панели инструментов приложения Blynk.