Как измерить электропроводность с помощью Arduino?

Я хочу измерить TSS (общее количество растворимых солей) в почве. В некоторой литературе я обнаружил, что путем измерения электропроводности гораздо легче измерить TSS. Итак, я подумал: если я смогу измерить электропроводность, возможно, удастся определить TSS.

Логика, лежащая в основе TSS, заключается в том, что чистая вода является плохим проводником электричества, поэтому увеличение содержания растворимой соли в воде пропорционально увеличивает проводимость. Итак, существуют ли датчики, которые легко измеряют проводимость? Еще хочу упомянуть: может ли для этого быть полезен вольтметр?

, 👍7

Обсуждение

имхо, вы бы хотели использовать тайминги RC вместо аналогового чтения, что, как правило, более точно. micros() отличается высоким разрешением и надежностью, а встроенные АЦП — нет., @dandavis

Какие параметры или значения изменяются, чтобы заставить его работать с esp32?, @Mohamed Amine Mechichi


2 ответа


1

Это должно быть возможно... подключите +5 В к одному концу, аналоговый входной контакт к другому, не забудьте резистор, который достаточно велик, чтобы не получать ток больше допустимого. Затем измерьте на аналоговом входе проводимость (значение) и воздействуйте на нее.

На самом деле, максимальная сила тока для аналогового контакта составляет 20 мА, если я правильно помню. Таким образом, резистор V = I * R <=> 5 = 0,02 * R <=> R = 5 / 0,02 = 250 Ом должен подойти. Это произойдет только в том случае, если проводимость равна 100%. Если вы получите очень низкую проводимость, вы получите очень низкие значения при чтении аналогового вывода. Если вы получаете слишком меньшее значение, вам придется уменьшить номинал резистора, но вы рискуете сжечь вывод, когда через него пройдет слишком большой ток.

,

6

Ответ: 3 доллара EC — метр PPM [Arduino]. Я опробовал его на электропроводном измерителе потребительского уровня и после калибровки получил те же результаты. Это дешево и просто.

Распиновка EC-метра Arduino

Единственное предупреждение: для измерения электропроводности используется несколько шкал, поэтому результаты могут быть несопоставимы между разными устройствами и вам необходимо внимательно прочитать рекомендации по электропроводности вашего водного раствора.

р>

Единицы ЕС

Электрическую проводимость можно выразить в различных единицах, но типичной единицей является сименс на метр2 на моль (См/м2/моль) или миллисименс на сантиметр (мСм/см). Единица мСм/см обычно используется в Европе для определения концентрации питательных веществ в воде. В Северной Америке проводимость преобразуется в количество ионов в воде с использованием частей на миллион (которые также можно преобразовать в единицы, включая мг/л и т. д.). Это делается путем преобразования ЕС в значение, основанное на ионах, содержащихся в растворе. К счастью, существует фиксированный расчет соотношения между всеми этими единицами, который приведен в таблице ниже.

Код EC-метра

/*
Измерения ElCheapo Arduino EC-PPM

В этом сценарии используется обычная в США двухконтактная вилка и резистор 47 кОм для измерения EC/PPM в системе аквапоники/гидропоники.
Вы можете изменить этот код для измерения других жидкостей, если измените резистор и значения в верхней части кода.

Эта программа предоставит вам контроллер подачи на основе температуры. Дополнительную информацию см. в разделе «Прочитай меня в загружаемом файле».

28.08.2015 Майкл Рэтклифф [email protected]


Эта программа является свободным программным обеспечением: вы можете распространять ее и/или изменять.
это в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной
Фонд свободного программного обеспечения, либо версия 3 Лицензии, либо
(по вашему выбору) любая более поздняя версия.


Данная программа распространяется в надежде, что она будет полезна,
но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
ТОВАРНАЯ ПРИГОДНОСТЬ или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. См.
Стандартная общественная лицензия GNU для более подробной информации.


Вы должны были получить копию Стандартной общественной лицензии GNU.
вместе с этой программой. Если нет, см.

Части:
-Ардуино-Уно/Мега
-Стандартная американская двухконтактная вилка.
Резистор -1 кОм
-DS18B20 Водонепроницаемый датчик температуры

Ограничения:
-
-

Распиновку и руководство пользователя см. на сайте www.MichaelRatcliffe.com/Projects или обратитесь к ZIP-архиву, из которого вы получили этот код.

*/

#include <OneWire.h>
#include <DallasTemperature.h>

//*************************** Пользовательские переменные ********************** *************************************//

int R1= 1000;
int Ra=25;          //Сопротивление контактов питания
int ECPin= A0;
int ECGround=A1;
int ECPower =A4;

//*********** Преобразование в ppm [Научитесь использовать EC, это намного лучше**************//
// Хана [США] Конверсия PPM: 0,5
// Eutech [EU] Конверсия PPM: 0,64
// Транчен [Австралия] Конверсия PPM: 0,7
// Почему никто это не стандартизировал?

float PPMconversion=0.5;

//***************Компенсация по температуре ********************************** ****//
// Значение ниже будет меняться в зависимости от того, какой химический раствор мы измеряем
// 0,019 обычно считается стандартом для питательных веществ для растений [Google «Температурная компенсация EC» для получения дополнительной информации
float TemperatureCoef = 0.019; //это меняется в зависимости от того, какое химическое вещество мы измеряем

//************************ Константа ячейки для измерений ЕС ********************** //
// У меня было около 2,9, заглушки стандартного размера, они все должны быть примерно одинаковыми
// Но если вы получаете неверные показания, вы можете использовать сценарий калибровки и жидкость, чтобы получить лучшую оценку K
float K=2.34;

//************ Связано с датчиком температуры ********************************** ************//
#define ONE_WIRE_BUS 10          // Провод данных для датчика температуры подключен к контакту 10 на Arduino
const int TempProbePossitive =8;  //Питание датчика температуры подключено к контакту 9
const int TempProbeNegative=9;    //Отрицательный датчик температуры подключен к контакту 8

//****************************** КОНЕЦ рекомендуемых пользовательских данных ************** ************************************************* *//


OneWire oneWire(ONE_WIRE_BUS);// Настраиваем экземпляр oneWire для связи с любыми устройствами OneWire
DallasTemperature sensors(&oneWire);// Передаем ссылку oneWire на температуру Далласа.

float Temperature=10;
float EC=0;
float EC25 =0;
int   ppm =0;

float raw= 0;
float Vin= 5;
float Vdrop= 0;
float Rc= 0;
float buffer=0;

//*********************************Настройка — запускается один раз, устанавливает контакты и т. д. ******* *************************************************//
void setup()
{
    Serial.begin(9600);
    pinMode(TempProbeNegative , OUTPUT);  //устанавливаем контакт заземления в качестве выхода для датчика tmp
    digitalWrite(TempProbeNegative , LOW); //Заземляем его, чтобы он мог потреблять ток
    pinMode(TempProbePossitive , OUTPUT); //то же самое, но в позитивном ключе
    digitalWrite(TempProbePossitive , HIGH);
    pinMode(ECPin,INPUT);
    pinMode(ECPower,OUTPUT);//Установочный вывод для источника тока
    pinMode(ECGround,OUTPUT);//установка контакта для потребляющего тока
    digitalWrite(ECGround,LOW);//Мы можем оставить землю подключенной постоянно

    delay(100);// дает датчику время на стабилизацию
    sensors.begin();
    delay(100);
    //** Добавление сопротивления цифрового вывода к [25 Ом] к статическому резистору *********//
    // Консультируйтесь с информацией «Почему» или просто примите это как истину
    R1=(R1+Ra);//Учитываем сопротивление питающего контакта

    Serial.println("ElCheapo Arduino EC-PPM measurments");
    Serial.println("By: Michael Ratcliffe  [email protected]");
    Serial.println("Free software: you can redistribute it and/or modify it under GNU ");
    Serial.println("");
    Serial.println("Make sure Probe and Temp Sensor are in Solution and solution is well mixed");
    Serial.println("");
    Serial.println("Measurements at 5's Second intervals [Dont read Ec morre than once every 5 seconds]:");
}

void loop()
{
    GetEC();          //Вызывает код для входа в цикл GetEC() [ниже основного цикла] не вызывайте это чаще, чем на 1/5 Гц [раз в пять секунд], иначе вы поляризуете воду
    PrintReadings();  // Процедура печати Cals [ниже основного цикла]
    delay(5000);
}

void GetEC()
{
    sensors.requestTemperatures();          // Отправляем команду для получения температуры
    Temperature=sensors.getTempCByIndex(0); //Сохраняет значение в переменной
    //************Оценка сопротивления жидкости ****************//
    digitalWrite(ECPower,HIGH);
    raw= analogRead(ECPin);
    raw= analogRead(ECPin);// Это не ошибка. Первое чтение будет низким, потому что конденсатор заряжен
    digitalWrite(ECPower,LOW);

    //**************** Преобразует в EC ****************************//
    Vdrop= (Vin*raw) / 1024.0;
    Rc = (Vdrop*R1) / (Vin-Vdrop);
    Rc = Rc-Ra; //учет сопротивления цифрового контакта
    EC = 1000/ (Rc*K);

    //*************Компенсация температуры********************//
    EC25  =  EC / (1+ TemperatureCoef*(Temperature-25.0));
    ppm=(EC25)*(PPMconversion*1000);
}


//***Этот цикл вызывается From Main Loop — выводит на серийный номер полезную информацию ***//
void PrintReadings()
{
    Serial.print("Rc: ");
    Serial.print(Rc);
    Serial.print(" EC: ");
    Serial.print(EC25);
    Serial.print(" Simens  ");
    Serial.print(ppm);
    Serial.print(" ppm  ");
    Serial.print(Temperature);
    Serial.println(" *C ");
};

Код для калибровки

/*
ElCheapo Arduino EC-PPM измерения Калибровка

Этот сценарий используется для калибровки датчика и точной настройки константы ячейки K.
Погрузите датчик и датчик температуры в калибровочный раствор и оставьте на некоторое время, чтобы датчик температуры успокоился.
Измените значение калибровочного раствора в соответствии с силой раствора.
Перемешайте щуп, чтобы убедиться, что раствор хорошо перемешан, и загрузите код в Arduino.
Откройте терминал для обновления расчетной константы ячейки K [должно быть около 3] и используйте это новое значение в основном коде EC.


28.08.2015 Майкл Рэтклифф [email protected]


Эта программа является свободным программным обеспечением: вы можете распространять ее и/или изменять.
это в соответствии с условиями Стандартной общественной лицензии GNU, опубликованной
Фонд свободного программного обеспечения, либо версия 3 Лицензии, либо
(по вашему выбору) любая более поздняя версия.


Данная программа распространяется в надежде, что она будет полезна,
но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
ТОВАРНАЯ ПРИГОДНОСТЬ или ПРИГОДНОСТЬ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. См.
Стандартная общественная лицензия GNU для более подробной информации.


Вы должны были получить копию Стандартной общественной лицензии GNU.
вместе с этой программой. Если нет, см.

Части:
-Ардуино-Уно/Мега
-Стандартная американская двухконтактная вилка.
Резистор -1 кОм
-DS18B20 Водонепроницаемый датчик температуры


Распиновку и руководство пользователя см. на сайте www.MichaelRatcliffe.com/Projects или обратитесь к ZIP-архиву, из которого вы получили этот код.

*/


//*************************** Библиотеки, необходимые для компиляции сценария [см. «Прочитайте меня в загрузке]» ********* ******//
// Обе библиотеки ниже являются пользовательскими [ПОСМОТРИ ПРОЧИТАЙТЕ МЕНЯ в загруженном ZIP-архиве, если вы не знаете, как установить. Используйте их или добавьте подтягивающий резистор к датчику температуры.

#include <OneWire.h>
#include <DallasTemperature.h>

//*************************** Пользовательские переменные ********************** *************************************//

float CalibrationEC = 0.762; //Значение EC калибровочного раствора составляет с/см.

//############################################# ########################################################################
//----------- Не заменяйте R1 резистором сопротивлением менее 300 Ом ------------
//############################################# ########################################################################
int R1 = 1000;
int Ra = 25; //Сопротивление контактов питания
int ECPin = A0;
int ECGround = A1;
int ECPower = A4;

//***************Компенсация по температуре ********************************** ****//
//Значение ниже будет меняться в зависимости от того, какой химический раствор мы измеряем
//0,019 обычно считается стандартом для питательных веществ для растений [Google «Температурная компенсация EC» для получения дополнительной информации
float TemperatureCoef = 0.019; //это меняется в зависимости от того, какое химическое вещество мы измеряем

//************ Связано с датчиком температуры ********************************** ************//
#define ONE_WIRE_BUS 10          // Провод данных для датчика температуры подключен к контакту 10 на Arduino
const int TempProbePossitive = 8; //Питание датчика температуры подключено к контакту 9
const int TempProbeNegative = 9;  //Отрицательный датчик температуры подключен к контакту 8

//****************************** КОНЕЦ рекомендуемых пользовательских данных ************** ************************************************* *//


OneWire oneWire(ONE_WIRE_BUS);// Настраиваем экземпляр oneWire для связи с любыми устройствами OneWire
DallasTemperature sensors(&oneWire);// Передаем ссылку oneWire на температуру Далласа.


float TemperatureFinish = 0;
float TemperatureStart = 0;
float EC = 0;
int ppm = 0;

float raw = 0;
float Vin = 5;
float Vdrop = 0;
float Rc = 0;
float K = 0;
int i = 0;
float buffer = 0;

//*********************************Настройка — запускается один раз, устанавливает контакты и т. д. ******* *************************************************//
void setup()
{
    Serial.begin(9600);
    pinMode(TempProbeNegative , OUTPUT);  //устанавливаем контакт заземления в качестве выхода для датчика tmp
    digitalWrite(TempProbeNegative , LOW); //Заземляем его, чтобы он мог потреблять ток
    pinMode(TempProbePossitive , OUTPUT); //то же самое, но в позитивном ключе
    digitalWrite(TempProbePossitive , HIGH);
    pinMode(ECPin, INPUT);
    pinMode(ECPower, OUTPUT); //Установочный контакт для источника тока
    pinMode(ECGround, OUTPUT); //установка контакта для тока стока
    digitalWrite(ECGround, LOW); //Мы можем оставить землю подключенной постоянно

    delay(100);// дает датчику время на стабилизацию
    sensors.begin();
    delay(100);
    //** Добавление сопротивления цифрового вывода к [25 Ом] к статическому резистору *********//
    // Консультируйтесь с информацией «Почему» или просто примите это как истину
    R1 = (R1 + Ra);

    Serial.println("ElCheapo Arduino EC-PPM measurments Calibration");
    Serial.println("By: Michael Ratcliffe  [email protected]");
    Serial.println("Free software: you can redistribute it and/or modify it under GNU ");
    Serial.println("");
    Serial.println("Make sure Probe and Temp Sensor are in Solution and solution is well mixed");
    Serial.println("");
    Serial.println("Starting Calibration: Estimated Time 60 Seconds:");
};
//****************************************** Конец установки
//************************************ Главный цикл — работает вечно ****** ************************************************* *******//
//Тяжелая работа перенесена в подпрограммы, чтобы вы могли вызывать их из основного цикла, не загромождая основной цикл
void loop()
{
    i = 1;
    buffer = 0;
    sensors.requestTemperatures();//Отправляем команду для получения температуры
    TemperatureStart = sensors.getTempCByIndex(0); //Сохраняет значение в переменной

    //************Оценка сопротивления жидкости ****************//
    while(i <= 10) {
        digitalWrite(ECPower, HIGH);
        raw = analogRead(ECPin);
        raw = analogRead(ECPin); // Это не ошибка, первое чтение будет низким
        digitalWrite(ECPower, LOW);
        buffer = buffer + raw;
        i++;
        delay(5000);
    };

    raw = (buffer / 10);

    sensors.requestTemperatures();//Отправляем команду для получения температуры

    TemperatureFinish = sensors.getTempCByIndex(0); //Сохраняет значение в переменной

    //*************Компенсация температуры********************//
    EC = CalibrationEC * (1 + (TemperatureCoef * (TemperatureFinish - 25.0))) ;

    //****************** Вычисляет R относительно калибровочной жидкости ************************* *//
    Vdrop = (((Vin) * (raw)) / 1024.0);

    Rc = (Vdrop * R1) / (Vin - Vdrop);

    Rc = Rc - Ra;

    K = 1000 / (Rc * EC);

    Serial.print("Calibration Fluid EC: ");

    Serial.print(CalibrationEC);

    Serial.print(" S  ");  //добавим сюда юниты

    Serial.print("Cell Constant K");

    Serial.print(K);

    if(TemperatureStart == TemperatureFinish) {
        Serial.println("  Results are Trustworthy");
        Serial.println("  Safe To Use Above Cell Constant in Main EC code");

    } else {
        Serial.println("  Error -Wait For Temperature To settle");
        Serial.print("Temp start=");
        Serial.print(TemperatureStart);
        Serial.print(" Temp end=");
        Serial.println(TemperatureFinish);
    }
}
//*************************** Конец основного цикла ******************* ************************************************* //

РЕДАКТИРОВАТЬ:

Обязательно используйте вилку с заводской опломбировкой. Если вода попадет внутрь вилки, показания напряжения будут неточными.

,

Только будьте уверены, что какой-нибудь плонккер не подключит его к сети... ;), @Majenko

повторное использование сетевых разъемов – плохая идея; человеческие факторы., @dandavis