Датчик минерализации воды на Arduino
Общее количество растворенных твердых веществ (TDS) оно же уровень минерализации воды он же уровень концентрации солей – это параметр для определения пригодности воды для питья. И людям, и водным существам для выживания требуется соответствующий уровень минерализации воды. Значение TDS > 1000 ppm (частей на миллион) указывает на избыток растворенных твердых веществ (высокий), а значение TDS < 50-250 ppm указывает на недостаток основных минералов (низкий) – оба значения не подходят для качественной воды. Для безопасной питьевой воды уровень TDS должен находиться в пределах 300–500 ppm, то есть идеально сбалансирован (ни слишком высок, ни слишком низок). Именно поэтому уровень TDS воды необходимо постоянно поддерживать.
Итак, в этом проекте вы узнаете, как сделать портативный измеритель TDS, который проверяет уровень концентрации солей воды в режиме реального времени, что позволит нам поддерживать правильный уровень pH воды.
Большинство TDS-метров имеют аналоговый вывод. Существует множество датчиков TDS для Arduino, которые имеют разные опорные и аналоговые выходные напряжения. Здесь мы использовали датчик с выходным сигналом от 0 В до 2,3 В для измерения значения TDS.

Компании-производители TDS-метров внедряют в свои устройства код, который содержит формулу для преобразования выходного сигнала (напряжения) в ppm. Вам просто нужно получить этот код, изменить и включить его в свой код, что позволит вам обновлять значение TDS воды на OLED-дисплее в режиме реального времени.
Теперь подключим все наши компоненты в соответствии со следующей схемой. В качестве управляющего элементы в данном случае мы используем плату Arduino Nano.

Далее приведен код программы для Arduino Nano.
#define sensorpin A1
#define VREF 5.0
#define SCOUNT 30
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
int analogBuffer[SCOUNT];
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;
void setup()
{
Serial.begin(115200);
pinMode(sensorpin,INPUT);
u8g2.begin();
// u8g2.setFont(u8g2_font_profont11_tf);//967
u8g2.setFont(u8g2_font_profont17_tr);//980
//
}
void loop()
{
static unsigned long analogSampleTimepoint = millis();
if(millis()-analogSampleTimepoint > 40U)
{
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(sensorpin);
analogBufferIndex++;
if(analogBufferIndex == SCOUNT)
analogBufferIndex = 0;
}
static unsigned long printTimepoint = millis();
if(millis()-printTimepoint > 800U)
{
printTimepoint = millis();
for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF/ 1024.0;
float compensationCoefficient=1.0+0.02*(temperature-25.0);
float compensationVolatge=averageVoltage/compensationCoefficient;
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5;
//Serial.print("voltage:");
//Serial.print(averageVoltage,2);
//Serial.print("V ");
Serial.print("TDS Value:");
Serial.print(tdsValue,0);
Serial.println("ppm");
u8g2.setFont(u8g2_font_profont17_tr);//980
u8g2.clearBuffer();
u8g2.setCursor(5,10);
u8g2.print("TDS=");
u8g2.setFont(u8g2_font_profont17_tf);//967
u8g2.setCursor(5,25);
u8g2.print(tdsValue);
u8g2.print(" ppm");
if (tdsValue<250){
u8g2.setCursor(5,40);
u8g2.print("Fit For Drink");
}else{
u8g2.setCursor(5,40);
u8g2.print("Not to Drink");
}
u8g2.sendBuffer();// Irms
}
}
int getMedianNum(int bArray[], int iFilterLen)
{
int bTab[iFilterLen];
for (byte i = 0; i<iFilterLen; i++)
bTab[i] = bArray[i];
int i, j, bTemp;
for (j = 0; j < iFilterLen - 1; j++)
{
for (i = 0; i < iFilterLen - j - 1; i++)
{
if (bTab[i] > bTab[i + 1])
{
bTemp = bTab[i];
bTab[i] = bTab[i + 1];
bTab[i + 1] = bTemp;
}
}
}
if ((iFilterLen & 1) > 0)
bTemp = bTab[(iFilterLen - 1) / 2];
else
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
return bTemp;
}
Собрав схему и загрузив код, можно приступить к тестированию устройства. Поместите датчик в пробы воды из озер, прудов, кранов и фильтров обратного осмоса, чтобы измерять параметр TDS в режиме реального времени. Данный параметр будет отображаться на ЖК-экране.

