Прибор для измерения солей в жидкости

0 3

Прибор для измерения солей в жидкости

В этой статье, мастер-самодельщик поделиться нами своим опытом по сборке солемера.
Прибор работает путем измерения сопротивления между двумя электродами датчика. Он также измеряет температуру для компенсации изменению температуры.
Инструменты и материалы:
— Arduino Uno;
— Макетная плата;
— Перемычки;
— Резистор 10 кОм;
— Резистор 1 кОм;
— Резистор 4,7 кОм;
— Водонепроницаемый датчик температуры DS18B20;
— Два медных электрода;
— Кнопки;
— ЖК-дисплей для Arduino;
— Паяльные принадлежности;
— Клеевой пистолет;
— Компьютер;
— Powerbank (опция);
Шаг первый: датчик удельного сопротивления
Первым шагом в изготовлении солимера является монтаж электродеталей. Прибор состоит из четырех частей: датчик удельного сопротивления, термометр, кнопка и дисплей.
Начинаем с датчика удельного сопротивления. Для его изготовления понадобится следующее детали:
Два электрода
Резистор 1 кОм
Перемычки
Arduino UNO
Макетная плата
Чтобы избежать электролиза, который приводит к окислению электродов и, в свою очередь, к быстрому увеличению сопротивления в течение первой секунды измерения, на электроды нужно подавать переменный ток. Поскольку Arduino работает на постоянном токе, мастер использует схему быстрого переключения, между двумя контактами, полярности. Вывод HIGH (высокий) будет положительным, а вывод LOW (низкий)- отрицательным.

Прибор для измерения солей в жидкости

В приборе используется относительно простой код для измерения удельного сопротивления. Он состоит из двух частей. Одна часть переключает полярность, а другая выполняет измерения, когда 8-контактный разъем HIGH, а 7-контактный LOW.
Код для работы одного датчика приведен ниже. Ее можно использовать, чтобы проверить, работает ли он.

Прибор для измерения солей в жидкости

 Показать / Скрыть текстint analogPin = 0;
int dtime = 500;
int raw = 0;
int Vin = 5;
float Vout = 0;
float R1 = 1000;
float R2 = 0;
float buff = 0;
float avg = 0;
int samples = 5000;

void setup(){
pinMode(8,OUTPUT); // define ports 8 and 7 for AC
pinMode(7,OUTPUT);
Serial.begin(9600); // start serial
}

void loop(){
float tot = 0;
for (int i =0; i<samples; i++) {
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
delayMicroseconds(dtime);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
delayMicroseconds(dtime);
raw = analogRead(analogPin);
if(raw){
buff = raw * Vin;
Vout = (buff)/1024.0;
buff = (Vin/Vout) — 1;
R2= R1 * buff;
//Serial.print("Vout: ");
//Serial.println(Vout);
//Serial.print("R2: ");
//Serial.println(R2);
tot = tot + R2;
}
}
avg = tot/samples;
Serial.print("The average resistance is: ");
Serial.print(avg);
Serial.println(" Ohm");
}<br>

Прибор для измерения солей в жидкости

Прибор для измерения солей в жидкости

Шаг второй: кнопка
Дальше в схему нужно установить кнопку. Нажатие на кнопку запускает процесс измерения.

Прибор для измерения солей в жидкости

Шаг третий: термометр
В схеме используется водонепроницаемый цифровой термометр DS18B20. Термометр необходим для термокомпенсации при изменении температуры.

Прибор для измерения солей в жидкости

Шаг четвертый: ЖК-дисплей
Для настройки прибора и отображения показаний в схеме присутствует экран. Мастер использовал дисплей I2C, у которого всего 4 контакта (на схеме дугой экран).

Прибор для измерения солей в жидкости

Шаг пятый: кодирование и калибровка
После сборки прибора на макетной плате необходимо загрузить код.

Прибор для измерения солей в жидкости

 Показать / Скрыть текст#include <Wire.h> //These two libraries are for the LCD
#include <LiquidCrystal_I2C.h>
#include <OneWire.h> //These two libraries are for the temp sensor
#include <DallasTemperature.h>

//Data wire from thermometer is plugged into digital pin 12 on the Arduino
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27, 16, 2);

int analogPin = 0;
int dtime = 500;
int raw = 0;
int Vin = 5;
float Vout = 0;
float R1 = 1000;
float R2 = 0;
float buff = 0;
float avg = 0;
int samples = 5000;
int state = 0;
int button = 0;
int buttonPin = 5;

float CalibrationTemp = 21.0; //This is the temperature from which calibration is done. Change if needed
float CorrectionFactor = 1.02; //Correction factor found by us. Change if needed
float dTemp = 0; //Initial value for temperature difference

//State 0 = rest
//State 1 = measure
//State 2 = print

void setup(){
sensors.begin(); // start up temperature library
pinMode(8,OUTPUT); // define ports 8 and 7 for AC
pinMode(7,OUTPUT);
pinMode(12,INPUT); //Setup the thermometerpin as input
pinMode(buttonPin,INPUT); //Setup buttonpin as input
Serial.begin(9600); // start serial

lcd.begin(); //start up LCD
lcd.clear(); //clear LCD memory

}

void loop(){
//REST
button = digitalRead(buttonPin);
if (button == HIGH) { //Check is the button is pressed and go to another state to start measuring
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Starting");
lcd.setCursor(2,1);
lcd.print("measurement");
state = 1;
}

//MEASURE
if (state == 1) {
float tot = 0;
for (int i =0; i<samples; i++) {
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
delayMicroseconds(dtime);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
delayMicroseconds(dtime);
raw = analogRead(analogPin);
if(raw){
buff = raw * Vin;
Vout = (buff)/1024.0;
buff = (Vin/Vout) — 1;
R2= R1 * buff;
//Serial.print("Vout: ");
//Serial.println(Vout);
//Serial.print("R2: ");
//Serial.println(R2);
tot = tot + R2;
}
}
avg = tot/samples;
Serial.print("Average resistance is: ");
Serial.print(avg);
Serial.println(" Ohm");
state = 2;

// Send the command to get temperatures
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
//print the temperature in Celsius
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print("C | ");
dTemp = temp — CalibrationTemp;
avg = avg * pow(CorrectionFactor, dTemp);
Serial.print("Corrected resistance is: " + String(avg));

}

//PRINT
if (state == 2) { //Here the value found is printed and the values for different sorts of water are defined
if (avg > 2000) {
Serial.println("This is demineralised water.");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Demi water");
lcd.setCursor(1,1);
lcd.print("AVG: " + String(avg));

delay(1000);
state = 0;
}
else if (avg > 1000) {
Serial.println("This is fresh/tap water.");

lcd.clear();
lcd.setCursor(1,0);
lcd.print("Tap water");
lcd.setCursor(1,1);
lcd.print("AVG: " + String(avg));

delay(1000);
state = 0;
}
else if (avg > 190) {
Serial.println("This is brackish water.");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Brackish water");
lcd.setCursor(1,1);
lcd.print("AVG: " + String(avg));

delay(1000);
state = 0;
}
else if (avg < 190) {
Serial.println("This is seawater.");
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Sea water");
lcd.setCursor(1,1);
lcd.print("AVG: " + String(avg));

delay(1000);
state = 0;
}
}
}<br>
Теперь нужно откалибровать прибор. Поскольку измеренное удельное сопротивление не может сразу дать уровень солености воды, необходимо откалибровать датчик. Самый первый и важный шаг в этом процессе — установить электроды на фиксированном расстоянии друг от друга. Измеренное сопротивление изменится при изменении расстояния между электродами.
Для калибровки мастер отобрал несколько проб деминерализованной воды и добавил в них разное известное количество соли. Дальше сопротивление в данных пробах было измерено другим прибором и прибором калибруемым. Затем в код были внесены необходимые изменения.
Калибровка поправочного коэффициента — это немного сложнее. Поправочный коэффициент обычно составляет 2–4% изменения сопротивления на каждый градус изменения температуры. Однако это не всегда верно. Метод определения поправочного коэффициента заключается в взятии пробы воды и изменении температуры при измерении сопротивления. Самый простой способ сделать это — взять горячую воду и измерить сопротивление, пока она остывает. Из этих данных можно рассчитать поправочный коэффициент.
Шаг шестой: сборка
Поскольку этот датчик будет использоваться в воде, важно защитить все электрические компоненты от влаги. Для этого датчика мастер сделал три отдельных корпус: для электродов, для Arduino и для ЖК-дисплея.
Электроды помещаются в черный пластиковый корпус с двумя отверстиями спереди и одним сзади. Чтобы сделать все водонепроницаемым, он использовал термоклей. Как было сказано в предыдущем шаге, очень важно, чтобы электроды находились на фиксированном расстоянии друг от друга.
Для Ардуино мастер использует пластиковую водонепроницаемую капсулу, от какого то прибора .
ЖК-дисплей установлен в подходящий корпус.

Прибор для измерения солей в жидкости

Прибор для измерения солей в жидкости

Прибор для измерения солей в жидкости

Прибор для измерения солей в жидкости

Все готово. Как видим сборка такого прибора не сложная и не должна вызвать затруднений.

(Source)

Подборки: Ардуино солемер

Источник

Оставьте ответ

Your email address will not be published.