Скала pH используется для измерения кислотности и валентности жидкостей. Диапазон pH составляет 1-14, где 1 соответствует наиболее кислотной жидкости, а 14 – основной жидкости. 7 pH соответствует нейтральным веществам (субстанциям), которые не являются ни кислотными, ни основными. Параметр pH играет достаточно важную роль в жизни людей. Например, его можно использовать для определения качества воды в бассейне. Также параметр pH имеет большое число разнообразных применений в сельском хозяйстве, очистке сточных вод, промышленности, мониторинге состояния окружающей среды и т.п.
В данной статье мы рассмотрим создание pH-метра (pH Meter) на основе платы Arduino Uno и гравитационного датчика pH. Значение pH мы будем показывать на экране ЖК диcплея 16x2. Также мы рассмотрим вопросы калибровки датчика pH чтобы повысить точность его измерений.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Модуль I2C для ЖК диcплея (купить на AliExpress).
- Аналоговый гравитационный датчик pH (Gravity Analog pH sensor) (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
Что такое значение pH?
Параметр, который мы используем для измерения кислотности веществ, называется pH. Термин “H” здесь обозначает концентрацию ионов водорода. Диапазон pH содержит значения от 0 до 14. Значение pH равное 7 обозначает нейтральную, чистую жидкость. Чистая вода имеет pH точно 7. Значения меньшие 7 обозначают кислотность, а большие 7 – основной или щелочной характер жидкости.
Как работает аналоговый гравитационный датчик pH
Аналоговый датчик pH предназначен для измерения значения pH и показывает кислотность или щелочность (щелочные свойства) вещества. Датчик содержит в своем составе встроенный чип регулятора напряжения, который поддерживает широкий диапазон питающих напряжений - 3.3-5.5V DC (постоянного тока), что позволяет его подключать к контактам 5V и 3.3V любых плат Arduino. Выходной сигнал фильтруется аппаратным фильтром.
Технические характеристики модуля преобразования:
- питающее напряжение: 3.3~5.5V;
- BNC-соединитель (стандартный байонетный соединитель);
- высокая точность: ±0.1@25°C;
- диапазон измерений pH: 0~14.
Технические характеристики pH электрода датчика:
- диапазон рабочих температур: 5~60°C;
- точка нуля (нейтральная точка): 7±0.5;
- простая калибровка;
- внутреннее сопротивление: <250MΩ.
Внешний вид pH электрода датчика показан на следующем рисунке.
Внешний вид платы преобразования сигнала pH (pH Signal Conversion Board) показан на следующем рисунке.
Назначение контактов (распиновка) платы датчика pH:
V+: вход напряжения 5V постоянного тока (DC);
G: контакт земли (Ground pin, общий контакт);
Po: аналоговый выход pH;
Do: выход напряжения 3.3V постоянного тока (DC);
To: выход температуры.
Внешний вид конструкции электрода показан на следующем рисунке.
Электрод pH выглядит обычно как трубка, сделанная из стекла, с наконечником в виде стеклянной мембраны. Эта мембрана наполняется буферным раствором с известным pH (обычно pH = 7). Электрод спроектирован таким образом, что на стеклянной мембране всегда поддерживается постоянная концентрация ионов H+. Когда электрод погружается в тестируемое вещество, ионы водорода этого вещества начинают обмен с другими позитивно заряженными ионами стеклянной мембраны, в результате чего создается электрохимический потенциал на концах мембраны, который подается на модуль электронного усиления - он измеряет разность потенциалов между двумя электродами и преобразует ее в значения pH. Преобразование разности потенциалов в значение pH осуществляется на основе уравнения Нернста.
Уравнение Нернста
Уравнение Нернста — уравнение, связывающее окислительно-восстановительный потенциал системы с активностями веществ, входящих в электрохимическое уравнение, и стандартными электродными потенциалами окислительно-восстановительных пар (википедия).
Также уравнение Нернста может быть использовано для расчета общей электродвижущей силы (ЭДС) электрохимической ячейки. В нашем случае мы его используем для расчета значения pH тестируемого вещества. На основе данного уравнения разность потенциалов на концах стеклянного электрода может быть рассчитана следующим образом:
E = E0 - 2.3 (RT/nF) ln Q
где
Q= коэффициент реакции
E = выход в mV на концах электрода
E0 = напряжение "нуля" для электрода
R = идеальная газовая постоянная= 8.314 J/mol-K
T = температура в ºK (Кельвинах)
F = константа Фарадея = 95,484.56 C/mol
N = ионный заряд
Схема проекта
Схема pH метра на основе платы Arduino Uno представлена на следующем рисунке.
Соединения между платой Arduino и платой преобразования сигнала pH показаны в следующей таблице.
Плата Arduino | Плата преобразования сигнала pH |
5V | V+ |
GND | G |
A0 | Po |
Внешний вид конструкции проекта показан на следующем рисунке.
Объяснение программы для Arduino
Полный код программы для нашего pH метра на основе Arduino приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе мы должны подключить все используемые библиотеки. В нашем случае мы подключили библиотеку “LiquidCrystal_I2C.h” для использования интерфейса I2C с целью обмена данными с ЖК дисплеем и библиотеку “Wire.h” для использования функционала интерфейса I2C в плате Arduino.
1 2 3 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); |
Далее определим калибровочное значение, которое в дальнейшем можно будет изменить (переопределить, откалибровать) для получения более точных значений pH.
1 |
float calibration_value = 21.34; |
Внутри функции setup() мы будем отображать на экране ЖК дисплея приветственное сообщение.
1 2 3 4 5 6 7 8 9 |
lcd.init(); lcd.begin(16, 2); lcd.backlight(); lcd.setCursor(0, 0); lcd.print(" Welcome to "); lcd.setCursor(0, 1); lcd.print(" Circuit Digest "); delay(2000); lcd.clear(); |
Внутри функции loop() мы будем считывать 10 аналоговых значений (отсчетов) и сохранять их в массив – это необходимо для сглаживания результата измерений.
1 2 3 4 5 |
for(int i=0;i<10;i++) { buffer_arr[i]=analogRead(A0); delay(30); } |
Затем мы отсортируем принятые аналоговые значения по возрастанию. Это необходимо для расчета скользящего среднего отсчетов на более поздней стадии (в дальнейшем).
1 2 3 4 5 6 7 8 9 10 11 12 |
for(int i=0;i<9;i++) { for(int j=i+1;j<10;j++) { if(buffer_arr[i]>buffer_arr[j]) { temp=buffer_arr[i]; buffer_arr[i]=buffer_arr[j]; buffer_arr[j]=temp; } } } |
Наконец, мы рассчитаем среднее 6-ти центральных отсчетов в наших аналоговых значениях. Затем это рассчитанное среднее мы преобразуем (конвертируем) в значение pH и выводим его на экран ЖК дисплея.
1 2 3 4 5 6 7 8 9 10 |
for(int i=2;i<8;i++) avgval+=buffer_arr[i]; float volt=(float)avgval*5.0/1024/6; float ph_act = -5.70 * volt + calibration_value; lcd.setCursor(0, 0); lcd.print("pH Val:"); lcd.setCursor(8, 0); lcd.print(ph_act); delay(1000); } |
Калибровка pH электрода
Калибровка pH электрода играет существенную роль в нашем проекте. Для проведения калибровки нам будет нужна жидкость (вещество) с известным значением pH, будем называть эту жидкость контрольным раствором.
Предположим, что у нас есть жидкость, значение pH которой равно 7 (дистиллированная вода). К примеру, при погружении в эту жидкость мы получим на экране ЖК дисплея значение 6.5. В данном случае для осуществления калибровки нам будет необходимо просто добавить значение 7-6.5=0.5 к значению калибровочной переменной (“calibration_value”) в коде нашей программы, то есть получим ее значение равное 21.34 + 0.5=21.84. После внесения этих изменений в код программы ее необходимо заново загрузить в плату Arduino и снова проверить работу устройства путем погружения электрода в контрольный раствор (с известным значением pH). Теперь на экране ЖК дисплея мы должны увидеть уже точное значение pH равное 7. Если оно будет все равно немного отличаться от своего истинного значения, то снова корректируем калибровочное значение в коде программы и снова тестируем работу проекта.
Тестирование работы pH метра
Мы протестировали работу нашего pH метра на чистой воде и лимонной кислоте. Результат тестирования показан на рисунках ниже.
Чистая вода:
Лимонная кислота:
Исходный код программы (скетча)
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 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); float calibration_value = 21.34; int phval = 0; unsigned long int avgval; int buffer_arr[10],temp; void setup() { Serial.begin(9600); lcd.init(); lcd.begin(16, 2); lcd.backlight(); lcd.setCursor(0, 0); lcd.print(" Welcome to "); lcd.setCursor(0, 1); lcd.print(" Circuit Digest "); delay(2000); lcd.clear(); } void loop() { for(int i=0;i<10;i++) { buffer_arr[i]=analogRead(A0); delay(30); } for(int i=0;i<9;i++) { for(int j=i+1;j<10;j++) { if(buffer_arr[i]>buffer_arr[j]) { temp=buffer_arr[i]; buffer_arr[i]=buffer_arr[j]; buffer_arr[j]=temp; } } } avgval=0; for(int i=2;i<8;i++) avgval+=buffer_arr[i]; float volt=(float)avgval*5.0/1024/6; float ph_act = -5.70 * volt + calibration_value; lcd.setCursor(0, 0); lcd.print("pH Val:"); lcd.setCursor(8, 0); lcd.print(ph_act); delay(1000); } |