Важно: Не протирайте стеклянный наконечник датчика и не касайтесь его руками. Для очистки датчика споласкивайте его в дистиллированной воде. Не допускайте высыхание наконечника датчика. Храните датчик при надетом колпачке заполненном раствором для хранения.
Не допускайте контакта жидкости с выводами GND или VCC модуля во время измерений.
Общие сведения:
Trema модуль pH-метр, Flash-I2C является устройством для измерения водородного показателя жидкости (показателя pH), характеризующего её кислотность. Принято считать, что уровень pH определён диапазоном от 0 до 14, но в действительности у сильно агрессивных сред он может выходить за указанный диапазон.
- В нейтральной среде pH = 7,0
- В кислой среде pH < 7,0. Чем агрессивнее кислота, тем ниже pH.
- В щелочной среде pH > 7,0. Чем агрессивнее щёлочь, тем выше pH.
Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.
Модуль можно использовать для анализа жидкостей используемых в аквариумах, колодцах, для полива растений и т.д.
Видео:
Спецификация:
- Напряжение питания: 3,3 В или 5 В, поддерживаются оба напряжения.
- Ток потребляемый модулем: до 5 мА.
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: Vcc (толерантны к 5В).
- Диапазон измерений водородного показателя: от 0 до 14 pH.
- Рабочая температура: от 0 до +60 °С.
- Габариты: 30 х 30 мм.
- Вес: 9 г.
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Модуль подключается к шине I2C или к аналоговому входу Arduino.
У модуля имеются три колодки выводов: разъем I2C (GND, Vcc, SDA, SCL), разъем A (G, V, S) и разъем посередине платы используемый для подключения датчика.
- SCL - вход/выход линии тактирования шины I2C.
- SDA - вход/выход линии данных шины I2C.
- S (Signal) - аналоговый выход.
- Vcc - вход питания от 3,3 до 5 В (вывод VCC соединён с выводом V).
- GND - общий вывод питания (вывод GND соединён с выводом G).
Колодка A позволяет подключить модуль к аналоговому входу Arduino.
Колодка I2C используется для подключения модуля к шине I2C.
Способ - 1: Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
Способ - 2: Используя Trema Set Shield
Модуль можно подключить к любому из I2C входов Trema Set Shield.
Способ - 3: Используя проводной шлейф и Shield
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
Способ - 4: Подключение к программной шине I2C
При использовании программной шины I2C, модуль можно подключить к любым выводам Arduino, но потребуется дополнительно установить библиотеку iarduino_I2C_Software.h, для создания программной шины I2C, указав номера выбранных вами выводов. О том как это сделать читайте ниже в разделе «Подключение библиотеки», а так же на странице Wiki - Расширенные возможности библиотек iarduino для шины I2C.
Примечание по подключению:
Модуль рекомендуется подключать через устройство гальванической развязки шины I2C и питания, так как в этом случае щуп pH-метра не будет реагировать на любые контакты жидкости с потенциалами питания, например, от других модулей измерения параметров жидкости.
Питание:
Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND.
Подробнее о модуле:
Модуль построен на базе микроконтроллера STM32F030F4, операционного усилителя LMC7101, снабжён кнопкой калибровки, светодиодами информирующими о стадии калибровки, и собственным стабилизатором напряжения. Модуль способен определять водородный показатель pH в диапазоне от 0 до 14 и работать с различными датчиками, подключаемыми к разъему в центре платы.
Принцип действия модуля основан на измерении величины ЭДС электродной системы, значение которой пропорционально водородному показателю pH = -Lg[H+]. Отклонение потенциала с выхода датчика от подведённого к его входу на 59,16 мВ равносильно отклонению водородного показателя жидкости на 1 pH. Сигнал с датчика усиливается в 3 раза операционным усилителем и поступает, как на микроконтроллер модуля, так и на аналоговый выход модуля.
При погружении датчика в нейтральную жидкость (pH=7,0), напряжение на аналоговом выходе модуля устанавливается в 1,65В (половина от 3,3В). Увеличение напряжения аналогового выхода на 177,48мВ (59,16мВ усиленные в 3 раза) указывает о снижении водородного показателя на 1,0 от нейтральных 7,0 pH. Соответственно уменьшение напряжения на аналоговом выходе модуля указывает о увеличении водородного показателя жидкости в тех же пропорциях.
Модуль следует калибровать, как в процессе эксплуатации, так и после каждой замены датчика (если таковые будут выполняться).
Модуль позволяет:
- Менять свой адрес на шине I2C.
- Управлять внутренней подтяжкой линий шины I2C (по умолчанию включена).
- Узнать версию прошивки модуля.
- Указать водородный показатель жидкостей используемых для калибровки.
- Выполнить калибровку модуля как кнопкой на плате, так и по шине I2C.
- Узнать водородный показатель жидкости в которую погружен датчик.
- Узнать значения используемые модулем при вычислениях pH.
- Изменить некоторые значения используемые модулем при вычислениях pH.
Для работы с Trema модулем pH-метр Flash-I2C, предлагаем воспользоваться разработанной нами библиотекой iarduino_I2C_pH позволяющей реализовать все возможности модуля.
Подробнее про установку библиотеки читайте в нашей инструкции.
Проведение измерений:
Перед измерениями подготовьте датчик модуля к работе. Снимите колпачок содержащий буферную жидкость с датчика. Сполосните датчик модуля в дистиллированной воде, смыв остатки буферной жидкости.
Опустите датчик в исследуемую жидкость, при этом стеклянный наконечник датчика должен быть полностью погружён в жидкость.
Рекомендуется выждать не менее минуты с момента погружения датчика до проведения замеров.
Не протирайте стеклянный наконечник датчика и не касайтесь его руками.
Между измерениями разных жидкостей сполосните датчик в дистиллированной воде или стряхните остатки капель предыдущей жидкости с датчика.
Модуль следует калибровать, как в процессе эксплуатации, так и после каждой замены датчика (если таковые будут выполняться).
Получить данные с модуля можно по шине I2C, для этого предлагаем воспользоваться библиотекой iarduino_I2C_pH. А так же информацию о водородном показателе жидкости можно получить с аналогового выхода датчика.
Важно: Жидкость в которую погружается датчик не должна контактировать с потенциалами источника питания модуля.
При контакте жидкости с выводом GND, показания pH-метра значительно увеличатся.
При контакте жидкости с выводом VCC, показания pH-метра значительно уменьшатся.
Это справедливо даже при контактах жидкости через высокоомные сопротивления.
Если в жидкость погружены датчики pH-метра и TDS-метра, то не менее чем за минуту до начала измерений водородного показателя, необходимо извлекать датчик TDS-метра из жидкости, или отключать оба вывода этого датчика от модуля TDS при помощи электромагнитного реле.
Стоит избегать и одновременной работы pH-метра с металлическими термометрами, корпуса которых не изолированы от потенциалов питания. Или извлекать такие термометры из жидкости не менее чем за минуту до начала измерений водородного показателя.
Решение: Если модуль подключён через устройство гальванической развязки шины I2C и питания, то он не будет реагировать ни на контакты жидкости с потенциалами питания, ни на иные модули измерения параметров жидкости.
Калибровка модуля кнопкой:
Калибровка при помощи кнопки на плате модуля выполняется при наличии двух калибровочных (буферных) жидкостей, с водородными показателями 4,0pH и 9.18pH. Обе жидкости должны иметь температуру при которой планируется выполнять дальнейшие измерения. Нужно выполнить следующие действия:
- Сполоснуть датчик в дистиллированной воде.
- Опустить датчик в первую калибровочную жидкость с pH = 4,0.
- Подождать примерно 5 минут.
- Нажать на кнопку «калибровка». Начнёт мигать светодиод под номером 1.
- Подождать пока не начнут перемигиваться 1 и 2 светодиоды.
- Стряхнуть с датчика остатки капель и сполоснуть его в дистиллированной воде.
- Опустить во вторую калибровочную жидкость с pH = 9,18.
- Подождать примерно 5 минут.
- Нажать на кнопку «калибровка». Начнёт мигать светодиод под номером 2.
- Подождать пока не погаснут оба светодиода.
Водородные показатели калибровочных жидкостей (по умолчанию 4,0pH и 9.18pH) можно изменить обратившись к функции setKnownPH()
. Изменение сохранится и после отключения питания.
Смена адреса модуля на шине I2C:
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09. Если вы планируете подключать более 1 модуля на шину I2C, необходимо изменить адреса модулей таким образом, чтобы каждый из них был уникальным. Более подробно о том, как изменить адрес, а также о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.
В первой строке скетча необходимо записать в переменную newAddress адрес, который будет присвоен модулю. После этого подключите модуль к контроллеру и загрузите скетч. Адрес может быть от 0х07 до 0х7F.
uint8_t newAddress = 0x09; // Назначаемый модулю адрес (0x07 < адрес < 0x7F). // #include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH. #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. iarduino_I2C_pH sensor; // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH. // Если при объявлении объекта указать адрес, например, iarduino_I2C_pH sensor(0xBB), то пример будет работать с тем модулем, адрес которого был указан. void setup(){ // Serial.begin(9600); // if( sensor.begin(&Wire) ){ // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). Serial.print("Найден модуль 0x"); // Serial.println(sensor.getAddress(), HEX); // Выводим текущий адрес модуля. if( sensor.changeAddress(newAddress) ){ // Меняем адрес модуля на newAddress. Serial.print("Адрес изменён на 0x"); // Serial.println(sensor.getAddress(),HEX);// Выводим текущий адрес модуля. }else{ // Serial.println("Адрес не изменён!"); // } // }else{ // Serial.println("Модуль не найден!"); // } // } // // void loop(){} //
Данный пример использует библиотеку iarduino_I2C_pH, которая работает только с модулями pH-метр, а значит позволяет менять только их адреса.
Смена и сортировка адресов на шине I2C:
Изменить адрес любого I2C модуля серии «Flash» можно аппаратно, используя установщик адресов FLASH-I2C. Это модуль подключаемый к шине I2C, на плате которого размещён дисплей и кнопки управления, при помощи которых можно узнать количество любых устройств на шине I2C, и менять адреса модулей Flash-I2C не отключая их от шины, что значительно сократит время сборки ваших проектов. Модуль оснащён разъемом USB через который можно запитать как сам модуль, так и шину I2C, или можно запитать шину I2C без использования разъема USB на плате модуля. Установщик адресов пригодиться в проектах с большим количеством модулей Flash-I2C.
Изменить адрес любого I2C модуля серии «Flash» можно программно, о том как это сделать рассказано в статье Wiki - Программная установка адресов модулей FLASH-I2C. В этой статье рассмотрены примеры с использованием библиотеки iarduino_I2C_Address, которая позволяет получать адреса любых устройств на шине I2C, менять адреса модулей Flash-I2C не отключая их от шины, получать название, номер модели, версию прошивки модулей Flash-I2C, а главное - автоматически сортировать адреса модулей Flash-I2C даже если на шине есть устройства с одинаковыми адресами.
Примеры:
В данном разделе раскрыты примеры работы с модулем при использовании библиотеки iarduino_I2C_pH. Сама библиотека содержит больше примеров, доступных из меню Arduino IDE: Файл / Примеры / iarduino_I2C_pH.
Получение данных от модуля:
Данный пример демонстрирует получение водородного показателя жидкости.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH. #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_pH sensor;), то адрес будет найден автоматически. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек. sensor.begin(&Wire); // Инициируем работу с pH-метром I2C-flash, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). } // // void loop(){ // Serial.print("Кислотность = " ); // Serial.print(sensor.getPH() ,1); // Выводим водородный показатель жидкости с 1 знаком после запятой. Serial.print(" pH.\r\n" ); // delay(1000); // } //
Водородный показатель жидкости выводится в монитор последовательного порта.
Получение данных с аналогового выхода модуля:
Пример позволяет получать данные с модуля без использования библиотеки и без подключения модуля к шине I2C.
float pHn = 7.0; // Нейтральный водородный показатель для датчика. Водородный показатель при котором напряжение с датчика равно 0. float Vstp = 0.05916; // Шаг изменения напряжения датчика в В, при изменении pH жидкости на 1.0. float Vn = 3.3 / 2; // Нейтральное напряжение на выходе модуля. Напряжение на выходе модуля при 7.0 pH. float Ky = 3; // Коэффициент усиления операционного усилителя. // void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек. } // // void loop(){ // float Vout = analogRead(A0)*5.0f/1024.0f; // Получаем напряжение на входе A0. float pH = (Vn-Vout)/(Vstp*Ky) + pHn; // Вычисляем pH жидкости. Serial.print("Кислотность = " ); // Serial.print(pH ,1); // Выводим водородный показатель жидкости с 1 знаком после запятой. Serial.print(" pH.\r\n" ); // delay(1000); // } //
В начале скетча указаны значения по умолчанию используемые в вычислении pH, их можно получить по шине I2C используя функции получения настроек модуля, описанные ниже.
Значения pHn
и Vstp
могут отличаться от используемых по умолчанию, так как они зависят от используемого датчика. Эти значения точно определяются калибровкой модуля.
Значения Ky
и Vn
могут незначительно отличаться от используемых по умолчанию, так как они зависят от резистивных делителей на плате модуля.
pH = pHn + (Vn-Vout)/(Vstep*Ky)
Калибровка модуля без кнопки:
Пример позволяет выполнить калибровку модуля без нажатия на кнопку «калибровка».
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH. #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_pH sensor;), то адрес будет найден автоматически. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек. sensor.begin(&Wire); // Инициируем работу с pH-метром I2C-flash, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). Serial.print("ОПУСТИТЕ ДАТЧИК В 1 ЖИДКОСТЬ");// Serial.print(" (4.00 pH). \r\n"); // delay(300000); // Ждём 5 минут. sensor.setCalibration(1, 4.00 ); // Выполняем 1 стадию калибровки указав известную концентрацию 1 жидкости (в примере 4.0 pH ). delay(10000); // Ждём 10 секунд. Serial.print("СПОЛОСНИТЕ ДАТЧИК.\r\n"); // delay(30000); // Ждём 30 секунд. Serial.print("ОПУСТИТЕ ДАТЧИК В 2 ЖИДКОСТЬ");// Serial.print(" (9.18 pH). \r\n"); // delay(300000); // Ждём 5 минут. sensor.setCalibration(2, 9.18 ); // Выполняем 2 стадию калибровки указав известную концентрацию 2 жидкости (в примере 9.18 pH ). delay(10000); // Ждём 10 секунд. Serial.print("КАЛИБРОВКА ВЫПОЛНЕНА!\r\n"); // } // // void loop(){} //
Для калибровки модуля требуется наличие двух калибровочных жидкостей с разными известными водородными показателями. Нужно выполнить следующие действия:
- Опустить датчик в первую калибровочную жидкость.
- Подождать около 5 минут.
- Обратиться к функции
setCalibration()
указав стадию калибровки 1 и pH первой жидкости. - Подождать пока не начнут перемигиваться 1 и 2 светодиоды.
- Стряхнуть с датчика остатки капель и сполоснуть его в дистиллированной воде.
- Опустить во вторую калибровочную жидкость.
- Подождать около 5 минут.
- Обратиться к функции
setCalibration()
указав стадию калибровки 2 и pH второй жидкости. - Подождать пока не погаснут оба светодиода.
Указанные функцией setCalibration()
водородные показатели калибровочных жидкостей могут отличаться от приведённых в скетче. Функция позволяет воспользоваться любыми имеющимися у вас калибровочными жидкостями, pH которых лежит в диапазоне от 0 до 14. Эти значения не сохраняются в памяти модуля и используются только во время обращения к функции.
Настройка калибровки модуля кнопкой:
По умолчанию для калибровки модуля кнопкой необходимы две буферные жидкости с заданными водородными показателями: 4.00pH (первая жидкость) и 9.18pH (вторая жидкость).
Модуль позволяет изменить водородные показатели этих калибровочных жидкостей, сохранив новые значения в своей энергонезависимой памяти, для дальнейших калибровок кнопкой.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH. #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_pH sensor;), то адрес будет найден автоматически. void setup(){ // sensor.begin(&Wire); // Инициируем работу с pH-метром I2C-flash, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). sensor.setKnownPH (1, 5.00); // Устанавливаем водородный показатель 1 жидкости для калибровки модуля кнопкой от 0 до 14,000 pH. sensor.setKnownPH (2, 6.00); // Устанавливаем водородный показатель 2 жидкости для калибровки модуля кнопкой от 0 до 14,000 pH. } // Указанные значения сохранятся и после отключения питания. // void loop(){} //
Данный скетч не выполняет калибровку, он указывает новые значения калибровочных жидкостей, которые должны использоваться для всех последующих калибровок модуля кнопкой.
После загрузки данного скетча, калибровка модуля кнопкой будет осуществляться при помощи буферных жидкостей с водородными показателями 5.00pH (первая жидкость) и 6.00pH (вторая жидкость), даже после отключения питания.
Функция setKnownPH()
позволяет указать модулю какими калибровочными жидкостями вы желаете пользоваться при калибровке модуля кнопкой.
Получение настроек модуля:
Пример выводит различные значения используемые модулем для вычислений.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH. #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_pH sensor;), то адрес будет найден автоматически. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек. sensor.begin(&Wire); // Инициируем работу с pH-метром I2C-flash, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). Serial.print("pH1 = " ); // Serial.print(sensor.getKnownPH(1) ,2); // Выводим требуемый водородный показатель 1 жидкости для калибровки модуля кнопкой от 0 до 14,000 pH. Serial.print("pH.\r\npH2 = " ); // Serial.print(sensor.getKnownPH(2) ,2); // Выводим требуемый водородный показатель 2 жидкости для калибровки модуля кнопкой от 0 до 14,000 pH. Serial.print("pH.\r\nKy = " ); // Serial.print(sensor.getKy() ,3); // Выводим коэффициент усиления операционного усилителя от 1 до 65,535. Serial.print("\r\nVstp = " ); // Serial.print(sensor.getVstp() ,2); // Выводим шаг смещения напряжения датчика от 0,01 мВ до 655,35 мВ при смещении кислотности на 1 pH. Serial.print("мВ.\r\npHn = " ); // Serial.print(sensor.getPHn() ,2); // Выводим нейтральную кислотность для датчика от 0 до 14,000 pH. Serial.print("pH.\r\n" ); // } // // void loop(){} //
- pH1 - Требуемый pH первой калибровочной жидкости для калибровки кнопкой.
- pH2 - Требуемый pH второй калибровочной жидкости для калибровки кнопкой.
- Ky - Коэффициент усиления ОУ.
- Vstp - Шаг изменения напряжения датчика при изменении pH на 1,0.
- pHn - Нейтральный водородный показатель, при котором напряжение датчика равно нулю.
- В примере не указаны функции
getVin()
,getVout()
иgetVn()
для получения напряжения на входе датчика Vin, напряжения на выходе модуля Vout и нейтрального напряжения на выходе модуля Vn. Нейтральное напряжение на выходе модуля показывает, каким должно быть напряжение на аналоговом выходе модуля при нейтральном pH=7,0.
Получение версии прошивки модуля:
Пример выводит версию прошивки модуля.
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH. #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с pH-метром I2C-flash. iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // Если объявить объект без указания адреса (iarduino_I2C_pH sensor;), то адрес будет найден автоматически. void setup(){ // Serial.begin(9600); // Инициируем работу с шиной UART для передачи данных в монитор последовательного порта на скорости 9600 бит/сек. sensor.begin(&Wire); // Инициируем работу с pH-метром I2C-flash, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). Serial.print("Версия прошивки " ); // Serial.print(sensor.getVersion()); // Выводим версию прошивки. } // // void loop(){} //
Модули с версией прошивки ниже 6 не имеют возможности аппаратно определять стадию и результат калибровки, а так же нормализацию показаний pH.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки iarduino_I2C_pH для работы с Trema модулями pH-метр, Flash-I2C.
Библиотека iarduino_I2C_pH может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано ниже в разделе «Подключение библиотеки», а так же на странице Wiki - расширенные возможности библиотек iarduino для шины I2C.
Подключение библиотеки:
- Если используется аппаратная шина I2C:
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_I2C_pH.h #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с модулем. // iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // iarduino_I2C_pH sensor; // Если адрес модуля не известен, то его можно не указывать, он будет найден автоматически. // Если адрес не указан, то на шине должен находиться только один модуль. void setup(){ // ... // sensor.begin(&Wire); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). ... // Доступны объекты: &Wire, &Wire1, &Wire2... } //
- Если используется программная шина I2C:
#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_I2C_pH.h SoftTwoWire sWire(3,4); // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL. // #include <iarduino_I2C_pH.h> // Подключаем библиотеку для работы с модулем. iarduino_I2C_pH sensor(0x09); // Создаём объект sensor для работы с функциями и методами библиотеки iarduino_I2C_pH, указывая адрес модуля на шине I2C. // iarduino_I2C_pH sensor; // Если адрес модуля не известен, то его можно не указывать, он будет найден автоматически. // Если адрес не указан, то на шине должен находиться только один модуль. void setup(){ // ... // sensor.begin(&sWire); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). ... // } //
- В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека
Wire.h
(предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы(3-SDA, 4-SCL)
. - Далее подключается библиотека и создаётся объект для работы с модулем.
- В коде
Setup()
, при инициализации работы с модулем указывается ссылка на объект работы с выбранной шиной I2Cbegin(&ШИНА)
. Остальные строки кода одинаковы для любой шины I2C.
Функция begin();
- Назначение: Инициализация работы с модулем.
- Синтаксис: begin();
- Параметры:
- &ШИНА - Ссылка на объект для работы с шиной I2C на которой находится модуль.
- Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
- Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
- Параметр является не обязательным, по умолчанию используется ссылка &Wire.
- Возвращаемое значение: bool - результат инициализации (true или false).
- Примечание: По результату инициализации можно определить наличие модуля на шине.
- Пример:
if( sensor.begin() ){ Serial.print( "Модуль найден и инициирован!" ); } else { Serial.print( "Модуль не найден на шине I2C" ); }
Функция reset();
- Назначение: Перезагрузка модуля.
- Синтаксис: reset();
- Параметры: Нет.
- Возвращаемое значение: bool - результат перезагрузки (true или false).
- Пример:
if( sensor.reset() ){ Serial.print( "Модуль перезагружен" ); } else { Serial.print( "Модуль не перезагружен" ); }
Функция changeAddress();
- Назначение: Смена адреса модуля на шине I2C.
- Синтаксис: changeAddress( АДРЕС );
- Параметры:
- uint8_t АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
- Возвращаемое значение: bool - результат смены адреса (true или false).
- Примечание: Текущий адрес модуля можно узнать функцией getAddress().
- Пример:
if( sensor.changeAddress(0x12) ){ Serial.print( "Адрес модуля изменён на 0x12" ); } else { Serial.print( "Не удалось изменить адрес" ); }
Функция getAddress();
- Назначение: Запрос текущего адреса модуля на шине I2C.
- Синтаксис: getAddress();
- Параметры: Нет.
- Возвращаемое значение: uint8_t АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
- Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
- Пример:
Serial.print( "Адрес модуля на шине I2C = 0x"); Serial.println( sensor.getAddress(), HEX );
Функция getVersion();
- Назначение: Запрос версии прошивки модуля.
- Синтаксис: getVersion();
- Параметры: Нет
- Возвращаемое значение: uint8_t ВЕРСИЯ - номер версии прошивки от 0 до 255.
- Пример:
Serial.print( "Версия прошивки модуля "); Serial.println( sensor.getVersion(), HEX );
Функция setPullI2C();
- Назначение: Управление внутрисхемной подтяжкой линий шины I2C.
- Синтаксис: setPullI2C( [ФЛАГ] );
- Параметры:
- bool ФЛАГ требующий установить внутрисхемную подтяжку линий шины I2C (true или false).
- Возвращаемое значение:
- bool - результат включения / отключения внутрисхемной подтяжки (true или false).
- Примечание:
- Вызов функции без параметра равносилен вызову функции с параметром true - установить.
- Флаг установки внутрисхемной подтяжки сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Внутрисхемная подтяжка линий шины I2C осуществляется до уровня 3,3 В, но допускает устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния внутрисхемной подтяжки модуля.
- Пример:
if( sensor.setPullI2C(true ) ){ Serial.print( "Внутрисхемная подтяжка установлена." ); } if( sensor.setPullI2C(false) ){ Serial.print( "Внутрисхемная подтяжка отключена." ); }
Функция getPullI2C();
- Назначение: Запрос состояния внутрисхемной подтяжки линий шины I2C.
- Синтаксис: getPullI2C();
- Параметры: Нет.
- Возвращаемое значение: bool - ФЛАГ включения внутрисхемной подтяжки (true или false).
- Пример:
if( sensor.getPullI2C() ){ Serial.print( "Внутрисхемная подтяжка включена." ); } else { Serial.print( "Внутрисхемная подтяжка отключена." ); }
Функция getPH();
- Назначение: Запрос водородного показателя жидкости.
- Синтаксис: getPH();
- Параметры: Нет.
- Возвращаемое значение: float водородный ПОКАЗАТЕЛЬ жидкости от 0.0 до 14.0 pH.
- Пример:
Serial.print("Кислотность = "); Serial.print(sensor.getPH() ); Serial.print(" pH." );
Функция getStability();
- Назначение: Получение флага нормализации показаний.
- Синтаксис: getStability();
- Параметры: Нет.
- Возвращаемое значение: bool - флаг (true - показания стабильны, false - не стабильны).
- Примечание:
- Функция возвращает true если полученное значение кислотности сильно не меняется.
- Если изменить кислотность жидкости, или поместить щуп в жидкость с другим водородным показателем, то функция будет возвращать false, до тех пор пока показания модуля не стабилизируются.
- Функция доступна для модулей с версией прошивки 6 и выше.
В примерах данной статьи есть скетч определения версии прошивки модуля. - Функция доступна в библиотеке с версией 1.2.0 и выше.
- Пример:
if( sensor.getStability() ){ Serial.println((String)"Кислотность = "+sensor.getPH()+" pH."); }else{ Serial.println("Показания кислотности меняются, ждите ..."); }
Функция setCalibration();
- Назначение: Выполнение калибровки модуля без нажатия на кнопку «калибровка».
- Синтаксис: setCalibration( СТАДИЯ , ПОКАЗАТЕЛЬ );
- Параметры:
- uint8_t СТАДИЯ калибровки 1 или 2.
- float водородный ПОКАЗАТЕЛЬ жидкости используемой для калибровки от 0.0 до 14.0 pH.
- Возвращаемое значение:
- bool - результат запуска указанной стадии калибровки (true или false).
- Примечание:
- Ранее описан метод калибровки модуля при помощи кнопки. Вместо первого нажатия на кнопку вызывается функция с указанием 1 стадии калибровки, а вместо второго нажатия на кнопку вызывается функция с указанием 2 стадии калибровки.
- В отличии от калибровки кнопкой, функция позволяет указывать известный водородный показатель жидкости используемой для калибровки на 1 и 2 стадии.
- Водородные показатели жидкостей 1 и 2 стадии должны быть разными.
- Пример:
sensor.setCalibration( 1, 5.5 ); // Выполняем 1 стадию калибровки указав pH жидкости (в примере 4,5pH). delay(60000); // Ждём 1 минуту. sensor.setCalibration( 2, 9.5 ); // Выполняем 2 стадию калибровки указав pH жидкости (в примере 9,5pH).
Функция getCalibration();
- Назначение: Получение стадии калибровки модуля.
- Синтаксис: getCalibration();
- Параметры: Нет.
- Возвращаемое значение: uint8_t - стадия калибровки (0-нет, 1-первая, 2-вторая).
- Примечание:
- Функция возвращает 1 если модуль выполняет первую стадию калибровки.
- Функция возвращает 2 если модуль выполняет вторую стадию калибровки.
- Функция возвращает 0 если калибровка не запущена или завершена.
- Функция возвращает 0 если модуль завершил первую стадию калибровки и ожидает запуск второй стадии калибровки.
- Функцию удобно использовать для вывода подсказок пользователю при выполнении калибровки программно или нажатием кнопки.
- Функция доступна для модулей с версией прошивки 6 и выше.
В примерах данной статьи есть скетч определения версии прошивки модуля. - Функция доступна в библиотеке с версией 1.1.4 и выше.
- Пример:
Serial.println("Нажмите на кнопку калибровки..."); while(sensor.getCalibration()!=1); // Ждём начала первой стадии калибровки. Serial.println("Выполняется 1 стадия калибровки..."); while(sensor.getCalibration()!=0); // Ждём завершения первой стадии калибровки. Serial.println("Нажмите на кнопку калибровки..."); while(sensor.getCalibration()!=2); // Ждём начала второй стадии калибровки. Serial.println("Выполняется 2 стадия калибровки..."); while(sensor.getCalibration()!=0); // Ждём завершения второй стадии калибровки. Serial.println("Калибровка завершена");
Функция getResultCalib();
- Назначение: Получение результата последней калибровки.
- Синтаксис: getResultCalib();
- Параметры: Нет.
- Возвращаемое значение: bool - результат последней калибровки (true-успех, false-провал).
- Примечание:
- Если последняя калибровка выполнена успешно или калибровка не проводилась после подачи питания, то функция вернёт true.
- Если последняя калибровка завершилась неудачей, то функция вернёт false.
- Неудачной считается калибровка, результаты которой сильно отличаются от эталонных.
- Результаты неудачной калибровки не применяются и не сохраняются в памяти модуля.
- Функция доступна для модулей с версией прошивки 6 и выше.
В примерах данной статьи есть скетч определения версии прошивки модуля. - Функция доступна в библиотеке с версией 1.2.0 и выше.
- Пример:
sensor.setCalibration( 1, 5.5 ); // Выполняем 1 стадию калибровки указав pH жидкости (в примере 4,5pH). while( sensor.getCalibration() ); // Ждём завершения первой стадии калибровки. sensor.setCalibration( 2, 9.5 ); // Выполняем 2 стадию калибровки указав pH жидкости (в примере 9,5pH). while( sensor.getCalibration() ); // Ждём завершения второй стадии калибровки. bool i = sensor.getResultCalib(); // Получаем результат калибровки.
Функции настройки модуля:
В данном разделе описаны функции настройки работы модуля. Модуль использует различные коэффициенты и значения для вычислений. По умолчанию они установлены в стандартные значения и не требуют изменений.
Важно: Все значения устанавливаемые функциями настройки модуля сохраняются в энергонезависимую память модуля, а значит действуют и после отключения питания!
Функция setKy();
- Назначение: Установка коэффициента усиления усилителя.
- Синтаксис: setKy( КОЭФФИЦИЕНТ );
- Параметры:
- float КОЭФФИЦИЕНТ усиления усилителя от 1 до 65,535.
- Возвращаемое значение:
- bool - результат применения нового коэффициента (true или false).
- Примечание:
- Значение по умолчанию 3,000.
- Коэффициент усиления операционного усилителя определяется резистивным делителем на плате модуля. Значение устанавливаемое данной функцией будет использоваться модулем при вычислениях pH, но не изменит реальный коэффициент усиления ОУ.
- Точное значение коэффициента усиления можно вычислить по формуле Ky = Vout / Vin, при условии что датчик отключён от модуля, а выводы BNC разъема модуля электрически замкнуты. Значения Vout и Vin можно получить функциями
getVout()
иgetVin()
. - После изменения Ky необходимо произвести калибровку модуля.
- Пример:
sensor.setKy( 3.02 ); // Корректируем значение коэффициента усиления операционного усилителя.
Функция getKy();
- Назначение: Запрос коэффициента усиления усилителя.
- Синтаксис: getKy();
- Параметры: Нет.
- Возвращаемое значение: float КОЭФФИЦИЕНТ усиления усилителя от 1 до 65,535.
- Пример:
Serial.print( "Модуль использует Ky = " ); Serial.print( sensor.getKy() );
Функция setVstp();
- Назначение: Установка шага изменения напряжения датчика.
- Синтаксис: setVstp( НАПРЯЖЕНИЕ );
- Параметры:
- float НАПРЯЖЕНИЕ датчика соответствующее шагу в 1 pH, значение от 0,01 до 655,35 мВ.
- Возвращаемое значение:
- bool - результат применения нового напряжения (true или false).
- Примечание:
- Значение по умолчанию 59,16 мВ.
- Данное значение указывает на сколько изменится напряжение с датчика при изменении водородного показателя жидкости на 1,0 pH.
- Модуль самостоятельно определяет и сохраняет значение Vstp в процессе калибровки.
- Пример:
sensor.setVstp( 60.0 ); // Указываем модулю новое значение Vstp в мВ.
Функция getVstp();
- Назначение: Запрос шага изменения напряжения датчика.
- Синтаксис: getVstp();
- Параметры: Нет.
- Возвращаемое значение: float НАПРЯЖЕНИЕ шага датчика в 1 pH, от 0,01 мВ до 655,35 мВ.
- Пример:
Serial.print( "Модуль использует Vstp = " ); Serial.print( sensor.getVstp() ); Serial.print( " мВ" );
Функция getVin();
- Назначение: Запрос напряжения поданного на вход датчика.
- Синтаксис: getVin();
- Параметры: Нет.
- Возвращаемое значение: float НАПРЯЖЕНИЕ на входе датчика, от 0 В до 6,5535 В.
- Примечание:
- Напряжение на входе датчика устанавливается резистивными делителями и должно соответствовать значению: 3.3 В / 2 / Ky = 3.3/2/3 = 0.55 В.
- Функция возвращает не расчётное, а реальное напряжение на входе датчика.
- Пример:
Serial.print( "На вход датчика подано напряжение Vin = " ); Serial.print( sensor.getVin() ); Serial.print( " В" );
Функция getVout();
- Назначение: Запрос напряжения на аналоговом выходе модуля.
- Синтаксис: getVout();
- Параметры: Нет.
- Возвращаемое значение: float НАПРЯЖЕНИЕ на выходе модуля, от 0 В до 6,5535 В.
- Примечание: Напряжение на аналоговый выход модуля подаётся с выхода операционного усилителя, вход которого подключён к выходу датчика.
- Пример:
Serial.print( "Напряжение на аналоговом выходе модуля Vout = " ); Serial.print( sensor.getVout() ); Serial.print( " В" );
Функция getVn();
- Назначение: Запрос нейтрального напряжения на аналоговом выходе модуля.
- Синтаксис: getVn();
- Параметры: Нет.
- Возвращаемое значение: float НАПРЯЖЕНИЕ на выходе модуля при нейтральном pH=0,7.
- Примечание:
- Нейтральное напряжение на выходе модуля Vn показывает каким должно быть напряжение Vout при нейтральном водородном показателе жидкости = 7,0 pH.
- Vn = Vin * Ky = 0.55 * 3 = 1.65. Что соответствует половине от 3,3 В.
- Пример:
Serial.print( "Напряжение на аналоговом выходе модуля при 7,0 pH должно быть равно " ); Serial.print( sensor.getVn() ); Serial.print( " В" );
Функция setPHn();
- Назначение: Установка нейтрального водородного показателя для датчика.
- Синтаксис: setPHn( ПОКАЗАТЕЛЬ );
- Параметры:
- float водородный ПОКАЗАТЕЛЬ жидкости при котором напряжение датчика равно 0, значение от 0 до 14,0 pH.
- Возвращаемое значение:
- bool - результат применения нового нейтрального pH датчика (true или false).
- Примечание:
- Нейтральный водородный показатель жидкости равен 7,0 pH.
- Нейтральный водородный показатель жидкости для датчика это pH нулевой точки, такой водородный показатель при котором напряжение датчика равно нулю.
- При погружении датчика в нейтральную среду (pH=7,0), потенциалы на входе и выходе датчика должны быть одинаковыми (напряжение датчика равно 0) - нулевая точка. Но в процессе старения датчика его нулевая точка смещается, и напряжение датчика будет равно нулю при водородном показателе жидкости отличном от 7,0 pH, это значение и является нейтральным водородным показателем для датчика pHn.
- Модуль самостоятельно определяет и сохраняет значение pHn в процессе калибровки.
- Пример:
sensor.setPHn( 7.02 ); // Указываем модулю новое значение pHn.
Функция getPHn();
- Назначение: Запрос нейтрального водородного показателя для датчика.
- Синтаксис: getPHn();
- Параметры: Нет.
- Возвращаемое значение: float водородный ПОКАЗАТЕЛЬ жидкости, от 0,0 pH до 14,0 pH.
- Пример:
Serial.print( "Модуль использует pHn = " ); Serial.print( sensor.getPHn() ); Serial.print( " pH" );
Функция setKnownPH();
- Назначение: Установка водородных показателей жидкостей для калибровки модуля кнопкой.
- Синтаксис: setKnownPH( СТАДИЯ , ПОКАЗАТЕЛЬ );
- Параметры:
- uint8_t СТАДИЯ калибровки 1 или 2.
- float водородный ПОКАЗАТЕЛЬ жидкости используемой для калибровки от 0 до 14.0 pH.
- Возвращаемое значение:
- bool - результат применения нового pH калибровочной жидкости (true или false).
- Примечание:
- По умолчанию на 1 стадии калибровки используется жидкость с 4,0 pH.
- По умолчанию на 2 стадии калибровки используется жидкость с 9,18 pH.
- В процессе калибровки датчик опускают в 1 жидкость (4,0 pH), нажимают на кнопку, опускают датчик во 2 жидкость (9,18 pH) и опять нажимают на кнопку.
- Данная функция позволяет изменить водородные показатели жидкостей используемых на 1 или 2 стадии калибровки модуля кнопкой.
- Пример:
sensor.setKnownPH( 1, 5.5 ); // Указываем модулю, что на 1 стадии используется жидкость с 5,5 pH. sensor.setKnownPH( 2, 9.5 ); // Указываем модулю, что на 2 стадии используется жидкость с 9,5 pH.
Функция getKnownPH();
- Назначение: Запрос требуемого водородного показателя жидкости для калибровки кнопкой.
- Синтаксис: getKnownPH( СТАДИЯ );
- Параметры: Нет.
- uint8_t СТАДИЯ калибровки 1 или 2.
- Возвращаемое значение: float требуемый водородный ПОКАЗАТЕЛЬ жидкости от 0 до 14.0 pH.
- Пример:
Serial.print( "Для калибровки модуля кнопкой требуются жидкости с pH = " ); Serial.print( sensor.getKnownPH(1) ); Serial.print( " и " ); Serial.print( sensor.getKnownPH(2) );
Ссылки:
- Набор буферных растворов для калибровки pH-метра.
- Модуль pH-метр, FLASH-I2C.
- Wiki - pH-метр, FLASH-I2C - Datasheet.
- Библиотека iarduino_I2C_pH.
- Библиотека iarduino_I2C_Software.
- Wiki - Расширенные возможности библиотек iarduino для шины I2C.
- Wiki - Установка библиотек в Arduino IDE.
- Wiki - Программная установка адресов модулей FLASH-I2C.
Обсуждение