Общие сведения
Датчик кислотности жидкости (pH-метр) — это датчик, позволяющий определить pH (potentia Hydrogenii) уровень жидкостей.
У чистой воды (H2O) при температуре 25 °C нейтральный уровень pH = 7. Чем выше кислотность жидкости, тем ниже её уровень pH, а в щелочных растворах уровень pH выше.
Принято считать, что уровень pH определён диапазоном от 0 до 14, но в действительности у сильно агрессивных сред он может выходить за указанный диапазон.
Видео
Характеристики
- Напряжение питания модуля: 5 В постоянного тока.
- Диапазон измерений: 0...14 pH.
- Зависимость напряжения на выходе модуля от pH растворов: 1 pH = 2/7 В.
- Температура измеряемых растворов: 0...60 ℃.
- Точность измерений: ± 0.1 pH (при температуре 25 ℃).
- Время измерений: до 1 мин.
- Длина кабеля от датчика до разъема BNC на плате модуля: 660 мм.
- Размер модуля: 43x32 мм.
- Размер датчика: 143,7 мм.
Подключение
Синий провод шлейфа, с которого будут сниматься показания, подключается к любому аналоговому выводу Arduino.
Питание
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
Напряжение питания 5 В постоянного тока подаётся на красный (Vcc) и чёрный (GND) провод шлейфа pH-метра.
Подробнее о датчике
pH уровень (водородный показатель) является отрицательным десятичным логарифмом концентрации ионов водорода в жидкости: pH = - lg[H+]. В воде помимо молекул H2O имеются ионы водорода [H+] и гидроксид-ионы [OH−]. Если их количество равно (нейтральная среда), то концентрация ионов водорода [H+] составляет 10−7 моль/л, следовательно pH = -lg[10-7] = 7.
- Если в воду добавить кислоту, то концентрация ионов водорода [H+] увеличится, а гидроксид-ионов [OH−] упадет, следовательно уменьшится pH. Например при увеличении концентрации ионов водорода [H+] до 10−6 моль/л (степень отрицательная), pH упадёт до -lg[10-6] = 6.
- Если в воду добавить щелочь, то концентрация водорода [H+] упадёт, а гидроксид-ионов [OH−] увеличится, следовательно увеличится pH. Например при уменьшении концентрации ионов водорода [H+] до 10−9 моль/л (степень отрицательная), pH увеличится до -lg[10-9] = 9.
В основу работы pH-метра заложен ионометрический метод определения pH. Этот метод заключается в измерении ЭДС гальванической цепи включающей специальный стеклянный электрод, потенциал которого зависит от концентрации ионов водорода [H+] в окружающем растворе, см таблицу в разделе «примечание».
В комплекте поставляется измерительный pH-щуп с разъёмом BNC, который является расходным материалом. Со временем ухудшается его чувствительность и сдвигается значение pH при нулевом потенциале на выводах. Влияние этих изменений на точность показаний исключается после выполнения калибровки.
Для модуля можно приобрести дополнительные (запасные) измерительные pH-щупы, в пластиковом или стеклянном корпусе.
Калибровка и измерения
При первом включении pH-метра (и в дальнейшем примерно раз в пол года) его нужно откалибровать. Опустите сенсор pH-метра в нейтральный раствор (раствор хлорида калия KCL, его pH = 7.0), который находится в колпачке pH-метра и поворотом многооборотного потенциометра на плате добейтесь напряжения на выходе модуля в 2 В.
Изменение уровня pH исследуемого раствора на 1 pH приводит к изменению напряжения на выходе модуля на 2/7 В. Значит после калибровки напряжение на выходе модуля 2 В соответствует pH = 7, напряжение 0 В соответствует pH = 0, а напряжение 4 В соответствует pH = 14, см. таблицу в разделе «Примечание». Значит для преобразования считанного с модуля уровня напряжения в уровень pH исследуемой жидкости, достаточно разделить это напряжение на 2/7 или умножить на 3,5: U/(2/7) = U*7/2 = U*3,5.
Для измерения pH исследуемого раствора опустите в него сенсор pH-метра и слегка помешайте, подождите стабилизации показаний в течении 30-60 секунд.
Не опускайте сенсор pH-метра в калибровочную жидкость (раствор хлорид калия KCL в колпачке датчика) после проведения измерений щелочных и кислых сред, так как остатки этих жидкостей на сенсоре pH-метра могут изменить pH калибровочной жидкости. Сначала промойте сенсор в проточной воде и стряхните её остатки, после чего оденьте колпачок с калибровочной жидкостью на датчик pH-метра.
Дополнительно
Зависимость напряжений от уровня pH исследуемой жидкости:
pH | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
В | 0 | 0,29 | 0,57 | 0,86 | 1,14 | 1,43 | 1,71 | 2 | 2,29 | 2,57 | 2,86 | 3,14 | 3,43 | 3,71 | 4 |
мВ | 414,12 | 354,96 | 295,8 | 236,64 | 177,48 | 118,32 | 59,16 | 0 | -59,16 | -118,32 | -177,48 | -236,64 | -295,8 | -354,96 | -414,12 |
В вольтах указано напряжение на выходе модуля (после калибровки) которое подаётся на вход Arduino. В милливольтах указано напряжение на выходе датчика (разъема BNC) который подключается к разъему BNC модуля.
Примеры
Вывод в монитор порта значения pH.
#define SensorPin A0 // pH meter Analog output to Arduino Analog Input 0 #define Offset -0.00 // Компенсация смещения #define LED 13 // Номер вывода светодиода, который является индикатором нормальной работы скетча #define samplingInterval 20 // Интервал в мс между измерениями #define printInterval 800 // Интервал в мс между выводами показаний #define ArrayLenth 40 // Количество выборок int pHArray[ArrayLenth]; // Массив для определения среднего показания напряжения считанного с датчика int pHArrayIndex=0; // Индекс элемента массива pHArray значения которого требуется изменить // void setup(void){ // pinMode(LED,OUTPUT); // Конфигурируем вывод светодиода как выход Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/с Serial.println("pH meter experiment!"); // Выводим надпись "pH meter experiment!" } // void loop(void){ // static unsigned long samplingTime = millis(); // Определяем переменную samplingTime для хранения времени прошедшего с момента старта (переменная создаётся при первом проходе цикла loop и не теряется по его завершении) static unsigned long printTime = millis(); // Определяем переменную printTime для хранения времени прошедшего с момента старта (переменная создаётся при первом проходе цикла loop и не теряется по его завершении) static float pHValue, voltage; // Объявляем переменные для хранения значений напряжения и pH // Проводим измерения: // if(millis() - samplingTime > samplingInterval){ // Выполняем код в теле оператора if через каждые samplingInterval мс pHArray[pHArrayIndex++] = analogRead(SensorPin); // Читаем данные в очередной элемент массива pHArray if(pHArrayIndex==ArrayLenth) pHArrayIndex=0; // Если достигли последнего элемента массива pHArray, то сбрасываем номер текущего элемента этого массива в 0 voltage = averagearray(pHArray, ArrayLenth) * 5.0 / 1023; // Получаем среднее напряжение в мВ из массива напряжений pHArray pHValue = 3.5 * voltage + Offset; // Преобразуем мВ в pH samplingTime = millis(); // Обновляем время для переменной samplingTime } // // Выводим показания в монитор: // if(millis() - printTime > printInterval){ // Выполняем код в теле оператора if через каждые printInterval мс Serial.print("Voltage:"); // Выводим надпись "Voltage:" Serial.print(voltage,2); // Выводим среднее напряжение Serial.print(" pH value: "); // Выводим надпись " pH value: " Serial.println(pHValue,2); // Выводим значение pH digitalWrite(LED,digitalRead(LED)^1); // Меняем состояние светодиода printTime = millis(); // Обновляем время для переменной printTime } // } // // // Функция определения среднего значения напряжения // Эта функция возвращает среднее арифметическое значение данных массива arr без учёта одного максимального и одного минимального значения массива. double averagearray(int* arr, int number){ // int i,max,min; // Объявляем переменные для цикла и экстремумов double avg; // Объявляем переменную для вывода среднего значения long amount=0; // Определяем переменную для подсчёта среднего значения if(number<=0){ Serial.println("Error number for the array to avraging!/n"); return 0;} // В массиве arr не может быть 0 и менее элементов if(number< 5){ for(i=0; i<number; i++){amount+=arr[i];} avg = amount/number; return avg; // Если в массиве arr менее 5 элементов, то среднее значение является средним арифметическим значением }else{ // Если в массиве arr более 5 элементов, то среднее значение считаем иначе ... if(arr[0]<arr[1]){ min = arr[0]; max=arr[1];} // Определяем минимальное и максимальное число из первых двух элементов массива else { min = arr[1]; max=arr[0];} // Определяем минимальное и максимальное число из первых двух элементов массива for(i=2; i<number; i++){ // Проходим по остальным элементам массива if(arr[i]<min){ amount+=min; min=arr[i]; } // Если значение очередного элемента меньше минимального, то добавляем к значению amount предыдущее минимальное значение и обновляем значение min else if(arr[i]>max){ amount+=max; max=arr[i]; } // Если значение очередного элемента больше максимального, то добавляем к значению amount предыдущее максимальное значение и обновляем значение max else { amount+=arr[i]; } // Если значение очередного элемента находится в пределах между min и max, то добавляем значение этого элемента к amount } // avg = (double) amount/(number-2); // Получаем среднее арифметическое значение (без учета значений первых двух элементов массива arr, т.к. они не добавлялись к amount) } // return avg; // Возвращаем полученное среднее значение } //
Комплектация
- 1x Датчик с кабелем, колпачком и контрольным раствором;
- 1x Модуль с разъемом BNC;
- 1x Трёхпроводной шлейф для подключения к Arduino;