Правила ухода: Перед измерениями подготовьте датчик модуля к работе. Протрите электроды датчика спиртом или дистиллированной водой, после чего дайте им высохнуть. Те же действия рекомендуется делать до калибровки модуля и после проведения измерений. Не касайтесь руками выводов датчика (измерительного щупа).
Общие сведения:
Trema модуль TDS/EC-метр, Flash-I2C является устройством для измерения общего количества растворённых твердых веществ в воде и её удельной электрической проводимости. Модуль позволяет определять количество растворённых твёрдых веществ в диапазоне от 0 до 10'000 ppm (1ppm = 1мг/л воды), по этим показаниям можно судить об общей минерализации, жёсткости и солёности воды. Чувствительность модуля позволяет «заметить» 2-3 крупинки мелкозерновой пищевой соли (NaCl) растворённой в стакане дистиллированной воды. Управление модулем осуществляется по шине I2C.
Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.
Модуль можно использовать для анализа качества дистиллированной воды, для контроля за оставшимся ресурсом мембранных фильтров воды, слежения за жёсткостью воды в аквариумах, бассейнах и системах водоснабжения. По изменениям показаний минерализации воды на входе и выходе из трубы, можно судить о степени износа этой трубы. Но модуль нельзя использовать для определения качества питьевой воды, так как питьевая вода может содержать и полезные для организма минералы.
Видео:
Спецификация:
- Напряжение питания: 3,3 В или 5 В, поддерживаются оба напряжения.
- Ток потребляемый модулем: до 10 мА.
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: Vcc (толерантны к 5В).
- Диапазон измерений TDS: от 0 до 10'000 ppm (мг/л воды).
- Диапазон измерений ЕС: от 0 до 20'000 мкСм/см.
- Частота тока используемого для измерений: от 50Гц до 5кГц (по умолчанию 2кГц).
- Точность показаний: ±5% (для растворов NaCl до 3'000 ppm в дистиллированной воде).
- Рабочая температура: от 0 до +55 °С.
- Габариты: 30 х 30 мм.
- Вес: 5 г.
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Модуль подключается к шине I2C Raspberry Pi.
По умолчанию все модули FLASH-I2C имеют установленный адрес 0х09.
— Перед подключением 1 модуля к шине I2C настоятельно рекомендуется изменить адрес модуля.
— При подключении 2 и более FLASH-I2C модулей к шине необходимо в обязательном порядке предварительно изменить адрес каждого модуля, после чего уже подключать их к шине.
Более подробно о том, как это сделать, а так же о многом другом, что касается работы FLASH-I2C модулей, вы можете прочесть в этой статье.
У модуля имеются три колодки выводов: разъем 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.
Модуль удобно подключать 2 способами, в зависимости от ситуации:
Способ - 1: Используя провода и Raspberry Pi
Используя провода «Мама — Мама», подключаем напрямую к Raspberry Pi, согласно следующей таблице:
Вывод модуля | Вывод Raspberry |
---|---|
Vcc | 3.3V |
GND | GND |
SDA | GPIO 23 |
SCL | GPIO 24 |
В этом случае необходимо питать логическую часть модуля от 3,3 В Raspberry
Способ - 2: Используя Trema+Expander Hat
Подключаем к Trema+Expander Hat:
Питание:
Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND.
Подробнее о модуле:
Модуль построен на базе микроконтроллера STM32F030F4 и двух операционных усилителях LMC7101, и LM358, снабжён кнопкой калибровки, светодиодами информирующими о стадии калибровки, и собственным стабилизатором напряжения.
Модуль способен работать как TDS-метр (Total Dissolved Solids) для определения общего количества растворённых твердых веществ в воде от 0 до 10'000 ppm (1ppm = 1мг/л воды). Так и в качестве EC-метра (Electrical Conductivity) для определения удельной электрической проводимости жидкости от 0 до 20'000 мкСм/см. Модуль способен работать с различными датчиками, подключаемыми к колодке в центре платы.
Принцип действия модуля основан на прямой зависимости электропроводности от количества растворенных в воде веществ, а электропроводность жидкости является величиной обратно пропорциональной её сопротивлению. Так как электропроводность и сопротивление жидкости сильно зависят от температуры, модулю нужно указывать реальную температуру жидкости в °С.
Модуль измеряет сопротивление жидкости, используя переменный ток, для снижения поляризации. Значение сопротивления определяется по напряжению считанному с выхода ОУ, которое преобразуется в электропроводность, после чего оно приводится от реальной температуры к опорной температуре и переводится в общее количество растворённых твердых веществ. Каждый измеренный в этом процессе показатель можно прочитать по шине I2C. Подробнее о измерительной части схемы написано в datasheet.
Модуль следует калибровать, как в процессе эксплуатации, так и после каждой замены датчика (если таковые будут выполняться), или после изменения частоты переменного тока используемого для измерения сопротивления жидкости.
Модуль позволяет:
- Менять свой адрес на шине I2C.
- Управлять внутренней подтяжкой линий шины I2C (по умолчанию включена).
- Узнать версию прошивки модуля.
- Указать частоту переменного тока используемую для измерения сопротивления жидкости.
- Указать количество растворённых веществ в жидкостях используемых для калибровки.
- Выполнить калибровку модуля как кнопкой на плате, так и по шине I2C.
- Указать или прочитать коэффициенты степенной функции, определяемые при калибровке.
- Указать или прочитать температурный коэффициент жидкости.
- Указать или прочитать коэффициент пересчёта (для перевода проводимости в ppm).
- Указать текущую температуру жидкости и опорную температуру к которой приводится EC.
- Узнать общее сопротивление между электродами датчика.
- Узнать удельную электрическую проводимость жидкости для текущей температуры.
- Узнать удельную электрическую проводимость приведённую к опорной температуре.
- Узнать количество растворённых твердых веществ в жидкости.
Для работы с Trema модулем TDS/EC-метр Flash-I2C, предлагаем воспользоваться разработанной нами библиотекой pyiArduinoI2Ctds позволяющей реализовать все возможности модуля.
Подробнее про установку библиотеки читайте в нашей инструкции.
Проведение измерений:
Перед измерениями подготовьте датчик модуля к работе. Протрите электроды датчика спиртом или дистиллированной водой, после чего дайте им высохнуть.
При сильном загрязнении электродов, рекомендуется опустить датчик в дистиллированную воду на несколько часов.
Для замеров датчик (измерительный щуп) модуля должен быть погружен в жидкость. После погружения датчика в жидкость, рекомендуется им немного поводить в стороны, как бы перемешивая жидкость, это позволит избавиться от пузырька воздуха попавшего между контактами в процессе погружения датчика.
Рекомендуется выждать не менее минуты с момента погружения датчика до проведения замеров.
Не касайтесь руками выводов датчика (измерительного щупа).
Между измерениями разных жидкостей сполосните датчик в дистиллированной воде или стряхните остатки капель предыдущей жидкости с датчика не касаясь его выводов.
Модуль следует калибровать, как в процессе эксплуатации, так и после каждой замены датчика (если таковые будут выполняться).
При калибровке модуля старайтесь погружать датчик в калибровочную жидкость на ту же глубину, при которой планируется производить последующие измерения.
Постоянное увеличение показаний модуля (>20 ppm в день) может свидетельствовать о испарении жидкости в которую погружён датчик, или о наличии в ней микрофлоры.
Получить данные с модуля можно по шине I2C, для этого предлагаем воспользоваться библиотекой pyiArduinoI2Ctds. А так же информацию о электропроводности и концентрации растворов можно получить с аналогового выхода датчика.
При работе с модулем по шине I2C, ему требуется периодически передавать информацию о текущей температуре жидкости.
Калибровка модуля кнопкой:
Калибровка при помощи кнопки на плате модуля выполняется при наличии двух калибровочных жидкостей с концентрацией растворённых твёрдых веществ в первой жидкости 500 ppm, а во второй 1'500 ppm. Нужно выполнить следующие действия:
- Протереть электроды спиртом или дистиллированной водой, после чего дать им высохнуть.
- Опустить датчик в первую калибровочную жидкость с концентрацией 500 ppm.
- Подождать не менее минуты.
- Нажать на кнопку «калибровка». Начнёт мигать светодиод под номером 1.
- Подождать пока не начнут перемигиваться 1 и 2 светодиоды.
- Стряхнуть с датчика остатки капель.
- Опустить во вторую калибровочную жидкость с концентрацией 1'500 ppm.
- Подождать не менее минуты.
- Нажать на кнопку «калибровка». Начнёт мигать светодиод под номером 2.
- Подождать пока не погаснут оба светодиода.
Концентрации растворённых твёрдых веществ в жидкостях используемых
для калибровки кнопкой (по умолчанию 500 ppm и 1'500 ppm) можно изменить
обратившись к функции setKnownTDS()
. Изменение сохранится и
после отключения питания.
Температура калибровочных жидкостей должна быть близка к 25°С.
Если температура жидкостей отличается от 25°С, то её реальное
значение необходимо указать функцией set_t()
. Указанное
значение не сохраняется после отключения питания.
Приготовление калибровочных растворов:
В данном разделе описан процесс приготовления растворов хлорида натрия (NaCl) в концентрации 500 ppm и 1'500 ppm, для проведения калибровки модуля.
Нам понадобятся: хлорид натрия (NaCl) - это обычная поваренная (пищевая) соль, дистиллированная вода (H2O) - продаётся в универсальных и автомагазинах, 3 чистых стакана, шприц, и весы.
- Пронумеруйте стаканы, написав на них цифры «0», «1» и «2» соответственно.
- В стакане «0» приготовим раствор хлорида натрия (NaCl) в
концентрации 10'000ppm:
- Насыпьте в стакан 1г (1000мг) соли (NaCl).
- Налейте 50-70мл дистиллированной воды и перемешайте до полного растворения соли.
- Долейте дистиллированной воды до получения 100мл раствора и снова перемешайте. В стакане «0» получился раствор = 10'000ppm (1000мг/100мл = 10'000мг/л).
- В стакане «1» приготовим первую калибровочную жидкость:
- Используя шприц перелейте 5мл раствора из стакана «0» в стакан «1». Теперь в «1» стакане находится 5мл начального раствора (50мг/5мл = 10'000мг/л).
- Долейте в «1» стакан дистиллированной воды до получения 100мл раствора. Мы получили первую калибровочную жидкость = 500ppm (50мг/100мл = 500мг/л).
- В стакане «2» приготовим вторую калибровочную жидкость:
- Используя шприц перелейте 15мл раствора из стакана «0» в стакан «2». Теперь во «2» стакане находится 15мл начального раствора (150мг/15мл = 10'000мг/л).
- Долейте во «2» стакан дистиллированной воды до получения 100мл раствора. Мы получили вторую калибровочную жидкость = 1'500ppm (150мг/100мл = 1'500мг/л).
- Раствор хлорида натрия (NaCl) в стакане «0» больше не понадобится.
- Калибровочные жидкости в стаканах «1» и «2» должны настояться не менее 2 часов.
Примечание: Если у Вас нет весов позволяющих (на втором пункте) отмерить 1г поваренной соли (NaCl), взвесьте любое количество поваренной соли, разведя её дистиллированной водой в соотношении 1г на 100мл, например, 10г соли (чайная ложка с горкой) на 1000мл (1л) дистиллированной воды.
Примеры:
В данном разделе раскрыты примеры работы с модулем при использовании библиотеки pyiArduinoI2Ctds.
Для работы с модулем необходимо включить шину I2C.
Для подключения библиотеки необходимо сначала её установить. Сделать это можно в менеджере модулей в Thonny или в терминале Raspberry, в виртуальной среде, командой:
pip install pyiArduinoI2Ctds
Подробнее об установке библиотек можно узнать в этой статье.
Смена адреса модуля на шине I2C:
Пример меняет текущий адрес модуля шины I2C на указанный в скрипте и сохраняет его в энергонезависимую память, значит адрес сохранится и после отключения питания. Для работы скрипта не требуется знать какой сейчас адрес у модуля.
# Подключаем библиотеку для работы с датчиком температуры и влажности from pyiArduinoI2Ctds import * import sys # Объявляем объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds. # Если при объявлении объекта указать адрес, например, pyiArduinoI2Ctds(address = 0x0B), # то пример будет работать с тем модулем, адрес которого был указан. tds = pyiArduinoI2Ctds(bus = "/dev/i2c-3", auto = NO_BEGIN) # Если сценарию не были переданы аргументы if len(sys.argv) < 2: # Назначаем модулю адрес (0x07 < адрес < 0x7F). newAddress = 0x09 # Иначе else: # Новый адрес - первый аргумент tmp = int(sys.argv[1]) if tmp > 6: newAddress = tmp # Если датчик найден if tds.begin(): print("Найден датчик %#.2x" % tds.getAddress()) # Если адрес удалось изменить if tds.changeAddress(newAddress): print("Адрес изменён на %#.2x" % tds.getAddress()) else: print("Адрес не изменён!") else: print("Датчик не найден!")
Для работы данного примера, на шине I2C должен быть только один модуль.
Данный скрипт демонстрирует не только возможность смены адреса на
указанный в переменной newAddress
, но и обнаружение, и
вывод текущего адреса модуля на шине I2C.
Получение данных от модуля:
Данный пример демонстрирует получение всех данных которые определены модулем.
from time import sleep from pyiArduinoI2Ctds import * # Подключаем библиотеку для работы с TDS/EC-метром I2C-flash. tds = pyiArduinoI2Ctds(address = 0x09, bus = "/dev/i2c-3) # Объявляем объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, указывая адрес модуля на шине I2C. # Если объявить объект без указания адреса (tds = pyiArduinoI2Ctds() ), то адрес будет найден автоматически. while True: # tds.set_t(22.5) # Указываем текущую температуру жидкости. print("Ro=" , end='') # print(tds.getRo() , end='') # Выводим общее измеренное сопротивление. print("Ом, S=" , end='') # print(tds.get_S() , end='') # Выводим измеренную удельную электропроводность жидкости. print("мкСм/см, EC=" , end='') # print(tds.getEC() , end='') # Выводим удельную электропроводность жидкости приведённую к опорной температуре. print("мкСм/см, TDS=", end='') # print(tds.getTDS() , end='') # Выводим количество растворённых твёрдых веществ в жидкости. print(" мг/л\r\n" , end='') # sleep(1) #
- t - текущая температура жидкости. Модуль определяет все параметры измеряя сопротивление жидкости, которое сильно зависит от её температуры. По этому модулю требуется указывать текущую температуру жидкости для получения корректных значений.
- Ro - Общее измеренное сопротивление в Ом. Является совокупностью активных Rd и реактивных Xc сопротивлений датчика (зависящих от его конструкции и частоты переменного тока), и сопротивления жидкости R. Ro=(R+Rd)Xc/(R+Rd+Xc) Ом.
- S - Удельная электрическая проводимость в мкСм/см. Вычисляется из электрической проводимости G (мкСм) и постоянной датчика Kd (см-1). В библиотеке используется символ «S» для обозначения удельной проводимости, вместо символа «σ», это сделано для совместимости с таблицей ASCII. S=G*Kd; S=Kd/R.
- EC - Удельная электрическая проводимость в мкСм/см приведённая к опорной температуре T = 25°C (по умолчанию). ЕС показывает какой должна быть S, если бы измерения проводились при температуре T.
- TDS - Количество растворённых твёрдых веществ в ppm (мг/л воды). Это значение определяется умножением приведённой удельной электрической проводимости ЕС (мкСм/см) на коэффициент пересчёта Kp = 0,5 (по умолчанию).
Калибровка модуля без кнопки:
Пример позволяет выполнить калибровку модуля без нажатия на кнопку «калибровка».
from pyiArduinoI2Ctds import * # Подключаем библиотеку для работы с TDS/EC-метром I2C-flash. tds = pyiArduinoI2Ctds(address = 0x09, bus = "/dev/i2c-3") # Объявляем объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, указывая адрес модуля на шине I2C. # Если объявить объект без указания адреса (tds = pyiArduinoI2Ctds() ), то адрес будет найден автоматически. val_t = 23.0 # Температура калибровочных жидкостей. # tds.set_t(val_t) # Указываем температуру жидкости в °С. print("ОПУСТИТЕ ДАТЧИК В 1 РАСТВОР", end='') # print(" (500 ppm). ") # sleep(60) # Ждём 1 минуту. print("КАЛИБРОВКА...") # tds.setCalibration(1, 500) # Выполняем 1 стадию калибровки указав известную концентрацию 1 раствора (в примере 1234ppm ). sleep(10) # Ждём 10 секунд. print("СПОЛОСНИТЕ ДАТЧИК.") # sleep(30) # Ждём 30 секунд. print("ОПУСТИТЕ ДАТЧИК В 2 РАСТВОР", end='') # print(" (1500 ppm). ") # sleep(60) # Ждём 1 минуту. print("КАЛИБРОВКА...") # tds.setCalibration(2, 1500 ) # Выполняем 2 стадию калибровки указав известную концентрацию 2 раствора (в примере 4321ppm ). sleep(10) # Ждём 10 секунд. print("КАЛИБРОВКА ВЫПОЛНЕНА!") # # while True: # print("TDS=", end='') # print(tds.getTDS() ) # Выводим количество растворённых твёрдых веществ в жидкости. print("мг/л.\r\n") # sleep(1) #
Для калибровки модуля требуется наличие двух калибровочных жидкостей с разной известной концентрацией растворённых твёрдых веществ в них. Нужно выполнить следующие действия:
- Обратиться к функции
set_t()
указав реальную температуру жидкостей в °С. - Опустить датчик в первую калибровочную жидкость.
- Подождать не менее минуты.
- Обратиться к функции
setCalibration()
указав стадию калибровки 1 и концентрацию используемого раствора в ppm. Начнёт мигать светодиод под номером 1. - Подождать пока не начнут перемигиваться 1 и 2 светодиоды.
- Стряхнуть с датчика остатки капель.
- Опустить во вторую калибровочную жидкость.
- Подождать не менее минуты.
- Обратиться к функции
setCalibration()
указав стадию калибровки 2 и концентрацию используемого раствора в ppm. Начнёт мигать светодиод под номером 2. - Подождать пока не погаснут оба светодиода.
Указанные функцией setCalibration()
концентрации
растворов могут отличаться от приведённых в скрипте. Функция позволяет
воспользоваться любыми имеющимися у вас калибровочными жидкостями, ppm
которых лежит в диапазоне от 0 до 10'000. Эти значения не сохраняются в
памяти модуля и используются только во время обращения к функции.
Настройка калибровки модуля кнопкой:
По умолчанию для калибровки модуля кнопкой необходимы две калибровочные жидкости с концентрациями их растворов: 500 ppm (первая жидкость) и 1'500 ppm (вторая жидкость).
Модуль позволяет изменить концентрации этих калибровочных жидкостей, сохранив новые значения в своей энергонезависимой памяти, для дальнейших калибровок кнопкой.
from pyiArduinoI2Ctds import * # Подключаем библиотеку для работы с TDS/EC-метром I2C-flash. tds = pyiArduinoI2Ctds(address = 0x09, bus = "/dev/i2c-3") # Объявляем объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, указывая адрес модуля на шине I2C. # Если объявить объект без указания адреса (tds = pyiArduinoI2Ctds() ), то адрес будет найден автоматически. tds.setKnownTDS (1, 1000) # Устанавливаем концентрацию 1 раствора для калибровки модуля с кнопки. Значение сохраняется в энергонезависимую память. tds.setKnownTDS (2, 2000) # Устанавливаем концентрацию 2 раствора для калибровки модуля с кнопки. Значение сохраняется в энергонезависимую память.
Данный скрипт не выполняет калибровку, он указывает новые значения калибровочных жидкостей, которые должны использоваться для всех последующих калибровок модуля кнопкой.
После загрузки данного скрипта, калибровка модуля кнопкой будет осуществляться при помощи растворов с концентрацией 1'000 ppm (первая жидкость) и 2'000 ppm (вторая жидкость), даже после отключения питания.
Функция setKnownTDS()
позволяет указать модулю какими
калибровочными жидкостями вы желаете пользоваться при калибровке модуля
кнопкой.
Установка коэффициентов:
Устанавливаемые параметры не сохраняются в энергонезависимую память модуля, а значит они сбрасываются в значения по умолчанию после отключения питания.
from pyiArduinoI2Ctds import * # Подключаем библиотеку для работы с TDS/EC-метром I2C-flash. tds = pyiArduinoI2Ctds(address = 0x09, bus = "/dev/i2c-3") # Объявляем объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, указывая адрес модуля на шине I2C. # Если объявить объект без указания адреса (tds = pyiArduinoI2Ctds() ), то адрес будет найден автоматически. tds.setKt ( 0.02) # Устанавливаем температурный коэффициент жидкости от 0,0000 до 6,5535. tds.setKp ( 0.50) # Устанавливаем коэффициент пересчёта от 0,01 до 2,55. tds.set_T ( 25.00) # Устанавливаем опорную температуру жидкости от 0,00 до 63,75 °С.
- Kt - Температурный коэффициент жидкости, используется в формуле: EC=S/(1+Kt*(t-T)).
- Kp - Коэффициент пересчёта, используется в формуле TDS=EC*Kp.
- T - Опорная температура при которой справедливо равенство TDS=EC*Kp.
Получение настроек модуля:
Пример выводит различные коэффициенты и постоянные используемые модулем для вычислений.
from pyiArduinoI2Ctds import * # Подключаем библиотеку для работы с TDS/EC-метром I2C-flash. tds = pyiArduinoI2Ctds(address = 0x09, bus = "/dev/i2c-3") # Объявляем объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, указывая адрес модуля на шине I2C. # Если объявить объект без указания адреса (tds = pyiArduinoI2Ctds() ), то адрес будет найден автоматически. print("F = " , end='') # print(tds.getFrequency(), end='') # Выводим частоту переменного тока используемую для измерений от 50 до 500 Гц. print("Гц.\r\nTDS1 = " , end='') # print(tds.getKnownTDS(1), end='') # Выводим требуемую концентрацию 1 раствора для калибровки модуля кнопкой от 0 до 10'000 ppm. print("ppm.\r\nTDS2 = " , end='') # print(tds.getKnownTDS(2), end='') # Выводим требуемую концентрацию 2 раствора для калибровки модуля кнопкой от 0 до 10'000 ppm. print("ppm.\r\nKt = " , end='') # print(tds.getKt() ,4, end='') # Выводим температурный коэффициент жидкости от 0,0000 до 6,5535. print("\r\nKp = " , end='') # print(tds.getKp() ,2, end='') # Выводим коэффициент пересчёта от 0,01 до 2,55. print("\r\nT = " , end='') # print(tds.get_T() ,2, end='') # Выводим опорную температуру жидкости от 0,00 до 63,75 °С. print("°С.\r\nKa = " , end='') # print(tds.getKa() ,2, end='') # Выводим множитель степеной функции от 0,01 до 167'772.15. print(".\r\nKb = " , end='') # print(tds.getKb() ,3, end='') # Выводим степень степенной функции от -0,010 до -65.535. print(".\r\n" , end='') #
- F - Частота переменного тока используемого для проведения измерений.
- TDS1 - Требуемая концентрация 1 калибровочной жидкости для калибровки кнопкой.
- TDS2 - Требуемая концентрация 2 калибровочной жидкости для калибровки кнопкой.
- Kt - Температурный коэффициент жидкости, используется в формуле: EC=S/(1+Kt*(t-T)).
- Kp - Коэффициент пересчёта, используется в формуле TDS=EC*Kp.
- T - Опорная температура при которой справедливо равенство TDS=EC*Kp.
- Ka и Kb - Коэффициенты степенной функции, они определяются регрессией в процессе калибровки и автоматически сохраняются в памяти модуля.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки pyiArduinoI2Ctds для работы с Trema модулями TDS/EC-метр, Flash-I2C на Raspberry Pi.
Подключение библиотеки:
- Если адрес модуля известен (в примере используется адрес 0x09):
# Подключаем библиотеку для работы с модулем. from pyiArduinoI2Ctds import * # Создаём объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, указав адрес модуля на шине I2C (0x09). tds = pyiArduinoI2Ctds(bus = "/dev/i2c-3", address = 0x09)
- Если адрес модуля неизвестен (адрес будет найден автоматически):
# Подключаем библиотеку для работы с модулем. from pyiArduinoI2Ctds import * # Создаём объект tds для работы с функциями и методами библиотеки pyiArduinoI2Ctds, без указания адреса. tds = pyiArduinoI2Ctds(bus = "/dev/i2c-3")
- При создании объекта без указания адреса, на шине должен находиться только один модуль.
Функция begin()
- Назначение: Инициализация работы с модулем.
- Синтаксис: begin()
- Параметры: Нет.
- Возвращаемое значение: результат инициализации (True или False).
- Примечание: По результату инициализации можно определить наличие модуля на шине.
- Пример:
if tds.begin(): print( "Модуль найден и инициирован!" ) else print( "Модуль не найден на шине I2C" )
Функция reset()
- Назначение: Перезагрузка модуля.
- Синтаксис: reset()
- Параметры: Нет.
- Возвращаемое значение: результат перезагрузки (True или False).
- Пример:
if tds.reset(): print( "Модуль перезагружен" ) else: print( "Модуль не перезагружен" )
Функция changeAddress()
- Назначение: Смена адреса модуля на шине I2C.
- Синтаксис: changeAddress( АДРЕС )
- Параметры:
- АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
- Возвращаемое значение: результат смены адреса (True или False).
- Примечание: Текущий адрес модуля можно узнать функцией getAddress().
- Пример:
if tds.changeAddress(0x12): print( "Адрес модуля изменён на 0x12" ) else: print( "Не удалось изменить адрес" )
Функция getAddress()
- Назначение: Запрос текущего адреса модуля на шине I2C.
- Синтаксис: getAddress()
- Параметры: Нет.
- Возвращаемое значение: АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
- Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
- Пример:
print( "Адрес модуля на шине I2C = ".format( tds.getAddress() ) )
Функция getVersion()
- Назначение: Запрос версии прошивки модуля.
- Синтаксис: getVersion()
- Параметры: Нет
- Возвращаемое значение: ВЕРСИЯ - номер версии прошивки от 0 до 255.
- Пример:
print( "Версия прошивки модуля {}".format( tds.getVersion() ) )
Функция setPullI2C()
- Назначение: Управление внутрисхемной подтяжкой линий шины I2C.
- Синтаксис: setPullI2C( [ФЛАГ] )
- Параметры:
- ФЛАГ требующий установить внутрисхемную подтяжку линий шины I2C (True или False).
- Возвращаемое значение:
- результат включения / отключения внутрисхемной подтяжки (True или False).
- Примечание:
- Вызов функции без параметра равносилен вызову функции с параметром True - установить.
- Флаг установки внутрисхемной подтяжки сохраняется в энергонезависимую память модуля, а значит будет действовать и после отключения питания.
- Внутрисхемная подтяжка линий шины I2C осуществляется до уровня 3,3 В, но допускает устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния внутрисхемной подтяжки модуля.
- Пример:
if tds.setPullI2C(True ): print( "Внутрисхемная подтяжка установлена." ) if tds.setPullI2C(False): print( "Внутрисхемная подтяжка отключена." )
Функция getPullI2C()
- Назначение: Запрос состояния внутрисхемной подтяжки линий шины I2C.
- Синтаксис: getPullI2C()
- Параметры: Нет.
- Возвращаемое значение: - ФЛАГ включения внутрисхемной подтяжки (True или False).
- Пример:
if tds.getPullI2C(): print( "Внутрисхемная подтяжка включена." ) else: print( "Внутрисхемная подтяжка отключена." )
Функция getRo()
- Назначение: Запрос общего измеренного сопротивления.
- Синтаксис: getRo()
- Параметры: Нет.
- Возвращаемое значение: СОПРОТИВЛЕНИЕ от 0 до 10'000'000 Ом.
- Примечание:
- Общее измеренное сопротивление Ro (Ом) является совокупностью активных Rd и реактивных Xc сопротивлений датчика (зависящих от его конструкции и частоты переменного тока), и сопротивления жидкости R.
- Ro = (R+Rd)Xc / (R+Rd+Xc) Ом.
- В формуле указано сопротивление R (Ом), а не удельное сопротивление ρ (Ом*м).
- При подключении к датчику обычного резистора (от 100 Ом до 100 кОм), значение Ro (Ом) должно быть близко к номиналам резистора.
- Пример:
print( "Общее измеренное сопротивление" " равно {} Ом.".format( tds.getRo() ) )
Функция get_S()
- Назначение: Запрос измеренной удельной электропроводности жидкости.
- Синтаксис: get_S()
- Параметры: Нет.
- Возвращаемое значение: ЭЛЕКТРОПРОВОДНОСТЬ от 0 до 65'535 мкСм/см.
- Примечание:
- Функция имеет синтаксис «get_S», а не «get_σ» для совместимости с таблицей ASCII.
- S = Kd / R, где Kd - постоянная датчика, R - сопротивление жидкости (Ом).
- S = 1 / ρ, где ρ - удельное электрическое сопротивление жидкости (Ом*см).
- Пример:
print( "Измеренная удельная" " электропроводность" " жидкости равна мкСм/см.".format( tds.get_S() ) )
Функция getEC()
- Назначение: Запрос удельной электропроводности приведённой к опорной температуре.
- Синтаксис: getEC()
- Параметры: Нет.
- Возвращаемое значение: ЭЛЕКТРОПРОВОДНОСТЬ от 0 до 65'535 мкСм/см.
- Примечание:
- Измеряемая электрическая проводимость жидкости S (мкСм/см) сильно зависит от её температуры t (°С). Чем выше температура жидкости, тем выше её электрическая проводимость. По этому удельную электрическую проводимость S (мкСм/см) измеряют при любой температуре t (°С), а затем приводят результат к опорной температуре T (°С) получая EC (мкСм/см).
- EC = S / ( 1 + Kt * (t-T) ).
- EC это значение S, если бы оно было измерено при T °С, а не t °С.
- Измеренную удельную электропроводность S можно получить функцией get_S().
- Температурный коэффициент жидкости Kt можно получить функцией getKt().
- Опорную температуру T можно получить функцией get_T().
- Текущую температуру t необходимо отправлять модулю функцией set_t().
- Пример:
print( "Приведённая удельная " "электропроводность жидкости равна {} мкСм/см.".format( tds.getEC() )
Функция getTDS()
- Назначение: Запрос количества растворённых твёрдых веществ в жидкости.
- Синтаксис: getTDS()
- Параметры: Нет.
- Возвращаемое значение: КОНЦЕНТРАЦИЯ от 0 до 65'535 ppm (мг/л воды).
- Примечание:
- TDS = EC * Kp.
- Приведённую удельную электропроводность EC можно получить функцией get_EC().
- Коэффициент пересчёта Kp можно получить функцией get_Kp().
- Для водных растворов 1 ppm = 1 мг/л.
- Пример:
print( "Концентрация раствора равна {} мг/л.".format( tds.getTDS() ) )
Функция set_t()
- Назначение: Указание текущей температуры жидкости.
- Синтаксис: set_t( ТЕМПЕРАТУРА )
- Параметры:
- ТЕМПЕРАТУРА жидкости от 0 до 63.75 °С.
- Возвращаемое значение:
- результат отправки температуры модулю (True или False).
- Примечание:
- Электрическая проводимость жидкости сильно зависит от её температуры. Чем выше температура жидкости, тем выше её электрическая проводимость. По этому модулю требуется постоянно отправлять реальную температуру жидкости.
- Зная реальную температуру жидкости t (°С), температурный коэффициент жидкости Kt и измеренную удельную электрическую проводимость жидкости S (мкСм/см), можно узнать какой будет удельная электрическая проводимость той же жидкости EC (мкСм/см) при опорной температуре T (по умолчанию 25°С).
- EC = S / ( 1 + Kt * (t-T) ).
- EC это значение S, если бы оно было измерено при T °С, а не t °С.
- Измеренную удельную электропроводность S можно получить функцией get_S().
- Температурный коэффициент жидкости Kt можно получить функцией getKt().
- Опорную температуру T можно получить функцией get_T().
- Текущую температуру t необходимо отправлять модулю функцией set_t().
- Пример:
# Указываем текущую температуру жидкости в °С. tds.set_t(20.5)
Функция setCalibration()
- Назначение: Выполнение калибровки модуля без нажатия на кнопку «калибровка».
- Синтаксис: setCalibration( СТАДИЯ , КОНЦЕНТРАЦИЯ )
- Параметры:
- СТАДИЯ калибровки 1 или 2.
- КОНЦЕНТРАЦИЯ раствора используемого для калибровки от 0 до 10'000 ppm.
- Возвращаемое значение:
- результат запуска указанной стадии калибровки (True или False). Примечание:
- Ранее описан метод калибровки модуля при помощи кнопки. Вместо первого нажатия на кнопку вызывается функция с указанием 1 стадии калибровки, а вместо второго нажатия на кнопку вызывается функция с указанием 2 стадии калибровки.
- В отличии от калибровки кнопкой, функция позволяет указывать известную концентрацию раствора используемого для калибровки на 1 и 2 стадии.
- Концентрации растворов 1 и 2 стадии должны быть разными.
- Пример:
tds.setCalibration(1, 1234 ) # Выполняем 1 стадию калибровки указав известную концентрацию 1 раствора (в примере 1234ppm ). sleep(60) # Ждём 1 минуту. tds.setCalibration(2, 4321 ) # Выполняем 2 стадию калибровки указав известную концентрацию 2 раствора (в примере 4321ppm ).
Функции настройки модуля:
В данном разделе описаны функции настройки работы модуля. Модуль использует различные коэффициенты и постоянные для вычислений. По умолчанию они установлены в стандартные значения и не требуют изменений.
Важно: Некоторые значения устанавливаемые описанными ниже функциями сохраняются и после отключения питания!
Функция setKt()
- Назначение: Установка температурного коэффициента жидкости.
- Синтаксис: setKt( ЗНАЧЕНИЕ )
- Параметры:
- ЗНАЧЕНИЕ температурного коэффициента жидкости от 0 до 6.5535.
- Возвращаемое значение:
- результат применения нового температурного коэффициента (True или False).
- Примечание:
- Значение по умолчанию 0.0200.
- Температурный коэффициент жидкости Kt показывает на сколько сильно электрическая проводимость жидкости зависит от её температуры.
- Температурный коэффициент жидкости Kt используется для приведения удельной электрической проводимости жидкости S (мкСм/см) измеренной при текущей температуре t (°C) к удельной электрической проводимости жидкости EC (мкСм/см) для опорной температуры T (°С). EC это значение S, если бы оно было измерено при T °С, а не t °С
- EC = S / ( 1 + Kt * (t-T) ).
- Приведённую удельную электропроводность EC можно получить функцией get_EC().
- Измеренную удельную электропроводность жидкости S можно получить функцией get_S().
- Температурный коэффициент жидкости Kt можно получить функцией getKt().
- Опорную температуру T можно получить функцией get_T().
- Текущую температуру t необходимо отправлять модулю функцией set_t().
- Пример:
tds.setKt(0.02) # Указываем модулю новый температурный коэффициент жидкости = 0.02
Функция getKt()
- Назначение: Запрос температурного коэффициента жидкости.
- Синтаксис: getKt()
- Параметры: Нет.
- Возвращаемое значение: ЗНАЧЕНИЕ температурного коэффициента от 0 до 6.5535.
- Пример:
print( "Модуль использует Kt = ", end='' ) print( tds.getKt() )
Функция setKp()
- Назначение: Установка коэффициента пересчёта.
- Синтаксис: setKp( ЗНАЧЕНИЕ )
- Параметры:
- ЗНАЧЕНИЕ коэффициента пересчёта от 0.01 до 2.55.
- Возвращаемое значение:
- результат применения нового коэффициента пересчёта (True или False). Примечание:
- Значение по умолчанию 0.5 (часто используются коэффициенты 0.50, 0.64 или 0.70).
- Коэффициент пересчёта Kp используется для преобразования удельной электрической проводимости жидкости EC (мкСм/см) приведённой к опорной температуре T (°С) в количество растворённых твёрдых веществ TDS (ppm или мг/л воды).
- TDS = EC * Kp.
- Количество растворённых твёрдых веществ TDS можно получить функцией get_TDS().
- Приведённую удельную электропроводность EC можно получить функцией get_EC().
- Коэффициент пересчёта Kp можно получить функцией getKp().
- Пример:
tds.setKp(0.50f)# Указываем модулю новый коэффициент пересчёта = 0.5
Функция getKp()
- Назначение: Запрос общего сопротивления датчика.
- Синтаксис: getKp()
- Параметры: Нет.
- Возвращаемое значение: ЗНАЧЕНИЕ коэффициента пересчёта от 0.01 до 2.55.
- Пример:
print( "Модуль использует Kp = ", end='' ) print( tds.getKp() )
Функция set_T()
- Назначение: Установка опорной температуры.
- Синтаксис: set_T( ТЕМПЕРАТУРА )
- Параметры:
- ТЕМПЕРАТУРА опорная от 0 до 63.75 °С.
- Возвращаемое значение:
- результат применения новой опорной температуры (True или False).
- Примечание:
- Значение по умолчанию 25 °С.
- Опорная температура T это температура жидкости при которой произведение её измеренной удельной электропроводности S = EC (мкСм/см) и коэффициента пересчёта Kp равно концентрации растворённых твёрдых веществ в жидкости TDS (ppm или мг/л воды).
- К опорной температуре T приводят удельные электропроводности жидкостей S измеренные при любых температурах t.
- EC = S / ( 1 + Kt * (t-T) ).
- Приведённую удельную электропроводность EC можно получить функцией get_EC().
- Измеренную удельную электропроводность жидкости S можно получить функцией get_S().
- Температурный коэффициент жидкости Kt можно получить функцией getKt().
- Опорную температуру T можно получить функцией get_T().
- Текущую температуру t необходимо отправлять модулю функцией set_t().
- Пример:
# Указываем модулю новую опорную температуру = 25°С. tds.set_T(25.0)
Функция get_T()
- Назначение: Запрос опорной температуры.
- Синтаксис: get_T()
- Параметры: Нет.
- Возвращаемое значение: ТЕМПЕРАТУРА опорная от 0 до 63.75 °С.
- Пример:
print( "Модуль использует опорную" " температуру {} °С.".format( tds.get_T() ) )
Функция setKnownTDS()
- Назначение: Установка концентрации растворов для калибровки модуля кнопкой.
- Синтаксис: setKnownTDS( СТАДИЯ , КОНЦЕНТРАЦИЯ )
- Параметры:
- СТАДИЯ калибровки 1 или 2.
- КОНЦЕНТРАЦИЯ раствора используемого для калибровки от 0 до 10'000 ppm.
- Возвращаемое значение:
- результат применения новой концентраций калибровочного раствора (True или False). Примечание:
- По умолчанию на 1 стадии калибровки используется раствор с концентрацией 500 ppm.
- По умолчанию на 2 стадии калибровки используется раствор с концентрацией 1'500 ppm.
- В процессе калибровки датчик опускают в 1 раствор (500 ppm), нажимают на кнопку, опускают датчик во 2 раствор (1'500 ppm) и опять нажимают на кнопку.
- Данная функция позволяет изменить концентрацию раствора используемого на 1 или 2 стадии калибровки модуля кнопкой.
- Указанная концентрация сохраняется и после отключения питания.
- Пример:
# Указываем модулю, что на 1 стадии используется раствор 3'000 ppm. tds.setKnownTDS(1, 3000) # Указываем модулю, что на 2 стадии используется раствор 7'000 ppm. tds.setKnownTDS(2, 7000)
Функция getKnownTDS()
- Назначение: Запрос требуемой концентрации раствора для калибровки кнопкой.
- Синтаксис: getKnownTDS( СТАДИЯ )
- Параметры: Нет.
- СТАДИЯ калибровки 1 или 2.
- Возвращаемое значение: требуемая КОНЦЕНТРАЦИЯ раствора от 0 до 10'000 ppm.
- Пример:
print( "Для калибровки модуля кнопкой " "требуются растворы с концентрацией {} и {} ppm.".format( tds.getKnownTDS(1), tds.getKnownTDS(2) ) )
Функция setFrequency()
- Назначение: Установка частоты переменного тока используемого для измерений.
- Синтаксис: setFrequency( ЧАСТОТА )
- Параметры:
- ЧАСТОТА переменного тока от 50 до 5000 Гц.
- Возвращаемое значение:
- результат установки частоты (True или False).
- Примечание:
- Значение по умолчанию 2000 Гц.
- Модуль использует переменный ток для измерений, что снижает эффект поляризации.
- Так как частота влияет на реактивное сопротивление датчика Xc, то после изменения частоты требуется произвести калибровку модуля.
- Указанная частота переменного тока сохраняется и после отключения питания.
- Пример:
tds.setFrequency(100) # Указываем модулю проводить измерения током с частотой 100Гц.
Функция getFrequency()
- Назначение: Запрос частоты переменного тока используемого для измерений.
- Синтаксис: getFrequency()
- Параметры: Нет.
- Возвращаемое значение: ЧАСТОТА переменного тока от 50 до 5000 Гц.
- Пример:
print( "Модуль использует переменный " "ток с частотой {} Гц.".format( tds.getFrequency() ) )
Функция setKa()
- Назначение: Установка множителя степенной функции.
- Синтаксис: setKa( МНОЖИТЕЛЬ )
- Параметры:
- МНОЖИТЕЛЬ представлен числом от 0.01 до 167772.15.
- Возвращаемое значение:
- результат применения нового множителя (True или False). Примечание:
- Значение по умолчанию 1000.00.
- Коэффициенты степенной функции Ka и Kb определяются модулем самостоятельно в процессе калибровки и автоматически сохраняются в его памяти.
- Калибровка является предпочтительным методом указания Ka.
- Указанное значение сохраняется и после отключения питания.
- Множитель степенной функции Ka можно получить функцией getKa().
- Пример:
tds.setKa(1100.0) # Указываем модулю новый множитель степенной функции.
Функция getKa()
- Назначение: Запрос множителя степенной функции.
- Синтаксис: getKa()
- Параметры: Нет.
- Возвращаемое значение: МНОЖИТЕЛЬ степенной функции от 0.01 до 167772.15.
- Пример:
print( "Модуль использует Ka = ", end='' ) print( tds.getKa() )
Функция setKb()
- Назначение: Установка степени степенной функции.
- Синтаксис: setKb( СТЕПЕНЬ )
- Параметры:
- СТЕПЕНЬ степенной функции от -0.01 до -65.535.
- Возвращаемое значение:
- результат применения новой степени (True или False). Примечание:
- Значение по умолчанию -5.000.
- Коэффициенты степенной функции Ka и Kb определяются модулем самостоятельно в процессе калибровки и автоматически сохраняются в его памяти.
- Калибровка является предпочтительным методом указания Kb.
- Указанное значение сохраняется и после отключения питания.
- Степень степенной функции Kb можно получить функцией getKb().
- Пример:
tds.setKb(5.9) # Указываем модулю новую степень степенной функции.
Функция getKb()
- Назначение: Запрос степени степенной функции.
- Синтаксис: getKb()
- Параметры: Нет.
- Возвращаемое значение: СТЕПЕНЬ степенной функции -0.01 до -65.535.
- Пример:
print( "Модуль использует Kb = {}".format( tds.getKb() ) )
Функция changeBus()
- Назначение: Установка шины I2C
- Синтаксис: changeBus( ПУТЬ К ФАЙЛУ ШИНЫ )
- Параметр:
- ПУТЬ К ФАЙЛУ ШИНЫ - строка
- Возвращаемые значения: Нет.
- Примечание:
- Пример:
# Меняем шину tds.changeBus("/dev/i2c-3")
Обсуждение