Общие сведения:
Датчик минерализации (TDS/EC-метр) RS485 / Modbus (с дисплеем и без дисплея) - является устройством для измерения общего количества растворённых твердых веществ в воде и её приведённой удельной электрической проводимости. По количеству растворенных веществ можно судить об общей минерализации, жёсткости и солёности воды. Чувствительность датчика позволяет «заметить» 2-3 крупинки мелкозерновой пищевой соли (NaCl) растворённой в стакане дистиллированной воды. Рассчитанные значения можно получать по протоколу Modbus шины RS485.
Датчик обеспечивает гальваническую развязку разъема щупа и разъема шины с питанием, что гарантирует отсутствие влияния и реакции щупа на другие устройства измерения жидкости.
Устройство можно использовать для анализа качества дистиллированной воды, для контроля за оставшимся ресурсом мембранных фильтров воды, слежения за жёсткостью воды в аквариумах, бассейнах, системах водоснабжения, гидропонных установках и т.д. По изменениям показаний минерализации воды на входе и выходе из трубы, можно судить о степени её износа. Но датчик нельзя использовать для определения качества питьевой воды, так как питьевая вода может содержать и полезные для организма минералы. Датчик легко подключается сетевым кабелем через разъем RJ45.
В соответствии с протоколом Modbus, широко применяемому в промышленности, к одной шине RS485 можно подключить до 247 TDS/EC-метров. Адрес устройства (по умолчанию 0x05) назначается программно и хранится в его энергонезависимой памяти. Все устройства на шине должны иметь уникальный адрес.
Видео:
Спецификация:
- Напряжение питания: от 12 до 24 В постоянного тока (разъем RJ45).
- Ток потребляемый датчиком: до 100 мА (при свечении всех сегментов дисплея).
- Интерфейс: RS485 / Modbus.
- Скорость шины: 4800 / 9600 / 19200 / 38400 / 57600 бит/с.
- Адрес на шине: устанавливается программно (по умолчанию 0x05).
- Диапазон измерений TDS: от 5 до 10'000 ppm (мг/л воды).
- Диапазон измерений ЕС: от 0.01 до 20.00 мСм/см.
- Диапазон измерений Ro: от 20 до 20'000 Ом.
- Частота тока используемого для измерений: от 50Гц до 5кГц (по умолчанию 2кГц).
- Точность показаний: ±5% (для растворов NaCl до 3'000 ppm).
- Рабочая температура: от 5 до +55 °С.
- Габариты: 100 x 70 x 40 мм.
- Вес: ? г.
Подключение:
Важно: Перед подключением устройства к шине RS485 нужно отключить питание.
Так называемое «горячее подключение» может повредить устройство!
На корпусе датчика TDS/EC-метра имеется 2 разъёма: RJ45 и CWF-2:
- Разъем RJ45 - для подключения датчика к контроллеру по шине RS485.
- Разъем CWF-2 - для подключения измерительного щупа.
Назначение выводов разъема RJ45:
- 1: «A» - Линия данных (неинвертирующая).
- 2: «B» - Линия данных (инвертирующая).
- 3: «NC» - Не используется.
- 4: «PWR» - Вывод питания от +12 до +24В.
- 5: «PWR» - Вывод питания от +12 до +24В.
- 6: «NC» - Не используется.
- 7: «GND» - Общий вывод питания.
- 8: «GND» - Общий вывод питания.
- HL-1: «BLINK» - Индикатор включения (мигает если подано питание).
- HL-2: «DATA» - Индикатор получения запроса и обнаружения устройства.
Назначение индикаторов разъёма RJ45:
- HL-1 «BLINK» Индикатор включения:
- Индикатор коротко мигает раз в две секунды -
значит устройство работает, но не получило ни 1 запроса с подачи питания. - Индикатор медленно мигает раз в секунду -
значит устройство работает, но последний запрос принят более 10 сек. назад. - Индикатор часто мигает пять раз в секунду -
значит устройство работает и последний запрос принят менее 10 сек. назад. - HL-2 «DATA» Индикатор получения запроса и обнаружения устройства:
- Индикатор включается при получении запросов, что позволяет визуально отследить их поступление.
- Устройству можно отправить команду на постоянное свечение индикатора, что позволит визуально найти устройство с известным адресом среди одинаковых устройств на шине.
Назначение выводов разъёма CWF-2 (DS1069-02M):
- 1: «Vo» - Вывод щупа на котором устанавливается напряжение виртуального ноля (0,5Vcc).
- 2: «Vsens» - Вывод щупа на который датчик подаёт меандр (переменный потенциал).
- Потенциалы разъема CWF-2 гальванически развязаны с потенциалами разъема RJ45.
Изменение сопротивления жидкости (Rщупа) подведённое к выводам 1 и 2 разъема, приводит к изменению напряжения (Vout) на выходе ОУ, так как используемая схема пытается сохранить напряжение виртуального ноля (Vo) на выводе 1.
Vout = Vo * (1+Ky) - Vsens * Ky, где Ky = - Rooc / Rщупа.
Так как потенциал Vsens является переменным, то датчик проводит измерения только при положительных полуволнах.
Стоит учесть, что характеристики измерительного щупа меняются со временем. Калибровка позволяет датчику определить коэффициенты Ka и Kb степенной функции соответствующие параметрам щупа для дальнейших расчетов удельной электропроводности по значению напряжения Vout на выходе ОУ.
S = Ka * Vout-Kb.
Питание:
Входное напряжение питания датчика от 12 до 24В постоянного тока подаётся через разъем PJ45. Датчик сохраняет работоспособность при снижении питания до 5В. Не подавайте питание выше 24В.
Подробнее о датчике:
Датчик минерализации (TDS/EC-метр) RS485 / Modbus построен на базе микроконтроллера STM32F030F4, операционного усилителя LMC7101, конвертера SN65HVD3082EDR с цепями защиты шины RS485 и встроенным терминатором, который можно отключать переключателем на плате. В устройстве используется несколько DC-DC преобразователей и стабилизаторы питания. Наличие гальванической развязки по линиям питания и линиям данных гарантирует, что измерительный щуп не будет реагировать и влиять на другие устройства измерения жидкости подключённые к той же шине RS485.
Датчик с дисплеем оснащен четырёхразрядным LED дисплеем для отображается значений в режиме реального времени (по умолчанию - на дисплей выводится приведённая удельная электропроводность в мСм/см). Но на дисплей можно выводить и другие рассчитанные данные. Так же на дисплей выводятся ошибки и информация о стадиях калибровки.
Датчик без дисплея оснащен зуммером для подачи сигналов о ошибках и стадиях калибровки.
Датчик способен работать как TDS-метр (Total Dissolved Solids) для определения общего количества растворённых твердых веществ в воде от 5 до 10'000 ppm (1ppm = 1мг/л воды). Способен работать в качестве EC-метра (Electrical Conductivity) для определения приведённой удельной электрической проводимости от 0.01 до 20.00 мСм/см. И может выполнять роль Ом-метра для определения общего сопротивления между выводами щупа от 20 Ом до 20 кОм. Датчик способен работать с различными щупами, калибровка которых осуществляется всего одним нажатием на кнопку.
Проводимые датчиком расчеты основаны на прямой зависимости электропроводности от количества растворенных в воде веществ, а электропроводность жидкости является величиной обратно пропорциональной её сопротивлению. Так как электропроводность и сопротивление жидкости сильно зависят от температуры, датчику TDS/EC-метра нужно указывать реальную температуру жидкости в °С.
Датчик измеряет сопротивление жидкости, используя переменный ток, для снижения поляризации. Значение сопротивления определяется по напряжению считанному с выхода ОУ, которое преобразуется в электропроводность, после чего оно приводится от реальной температуры к опорной температуре и переводится в общее количество растворённых твердых веществ. Каждый измеренный в этом процессе показатель доступен для чтения и вывода на дисплей датчика.
Датчик позволяет:
- Менять свой адрес на шине.
- Менять тип протокола Modbus (RTU/ASCII).
- Менять скорость передачи данных.
- Сохранять одно двухбайтное слово в энергонезависимую память и читать его.
- Читать гальванически развязанные напряжения с разных узлов схемы.
- Управлять светодиодом обнаружения устройства на разъеме RJ45.
- Запускать и контролировать процесс калибровки измерительного щупа.
- Получать результаты калибровки и менять их вручную.
- Менять частоту переменного тока используемую для измерения электропроводности.
- Указывать минерализацию или электропроводность калибровочных жидкостей.
- Читать и менять температурный коэффициент жидкости.
- Читать и менять коэффициент пересчёта (для перевода проводимости в ppm).
- Указывать температуру жидкости и опорную температуру к которой приводится проводимость.
- Читать общее сопротивление между электродами щупа (как Ом-метр).
- Читать приведённую удельную электрическую проводимость жидкости (как EC-метр).
- Читать количество растворённых твердых веществ в жидкости (как TDS-Метр).
Для работы с датчиками минерализации (TDS/EC-метр) RS485 / Modbus с дисплеем и без дисплея, предлагаем воспользоваться разработанными нами библиотеками iarduino_Modbus и iarduino_MB_TDS. Первая позволяет работать по протоколу Modbus на шине RS485, а вторая предназначена для работы с датчиком TDS/EC-метра.
Подробнее про установку библиотек читайте в нашей инструкции.
Примеры:
- Предложенные библиотеки содержат больше примеров, доступных из меню Arduino IDE:
- Файл / Примеры / iarduino Modbus (протокол) / ModbusClient / HardwareSerial.
- Файл / Примеры / iarduino Modbus (протокол) / ModbusClient / SoftwareSerial.
- Файл / Примеры / iarduino Modbus TDS (TDS/EC-метр) / HardwareSerial.
- Файл / Примеры / iarduino Modbus TDS (TDS/EC-метр) / SoftwareSerial.
Так как у большинства плат Arduino и ESP нет шины RS485, то библиотека iarduino_Modbus использует аппаратную или программную шину UART, сигналы которой преобразуются в сигналы шины RS485 при помощи конвертирующего модуля UART-RS485, например, на базе микросхемы MAX485. Конвертер подключается к выводам TX и RX шины UART, а так же назначается вывод разрешающий работу передатчика DE.
Для более удобного подключения, можно воспользоваться Trema конвертером UART-RS485, как показано на картинке ниже. У этого конвертера имеется порт RJ-45, который позволяет подключать датчик при помощи стандартного 8-жильного кабеля витой пары патч-корд.
Обратите внимание на то, что вывод TX конвертера подключается к выводу RX Arduino, вывод RX конвертера к выводу TX Arduino, вывод разрешения работы передатчика D (DE) подключается к любому выводу Arduino (назначается в скетче).
Trema конвертер UART-RS485 позволяет использовать датчик с дисплеем, без подключения к контроллеру (Arduino). Нужно подать питание на колодку Vin конвертера, а выводы TX, RX, G, V, D оставить без подключения. Получается схема визуального контроля за минерализацией жидкости.
В примерах ниже, для создания шины RS485, будет использована аппаратная шина UART1 (класс Serial1). Если у вашей платы Arduino нет свободных аппаратных шин UART, используйте программную шину UART при помощи входящей в состав Arduino IDE библиотеки SoftwareSerial.
Смена адреса датчика на шине:
Пример меняет текущий адрес датчика (nowAddress) на новый (newAddress) и сохраняет его в энергонезависимую память датчика, значит адрес сохранится и после отключения питания.
uint8_t nowAddress = 5; // Текущий адрес TDS/EC-метра ( 1 - 247 ). uint8_t newAddress = 10; // Новый адрес TDS/EC-метра ( 1 - 247 ). uint8_t pinDE = 2; // Вывод DE конвертера UART-RS485. // #include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. #include <iarduino_MB_TDS.h> // Подключаем библиотеку для работы с датчиком TDS/EC-метра. // ModbusClient modbus(Serial1, pinDE); // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE. iarduino_MB_TDS sensor(modbus); // Создаём объект для работы с TDS/EC-метром указав объект протокола Modbus. // void setup(){ // int f; // Serial.begin(9600); while(!Serial); // Инициируем передачу данных в монитор последовательного порта, указав его скорость. Serial1.begin(9600); while(!Serial1); // Инициируем работу с шиной UART подключённой к конвертеру UART-RS485. modbus.begin(); // Инициируем работу по протоколу Modbus. // modbus.setTimeout(10); // Указываем максимальное время ожидания ответа по протоколу Modbus. // modbus.setDelay(4); // Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus. // modbus.setTypeMB( MODBUS_RTU ); // Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII. Serial.print("Инициализация "); // f = sensor.begin(nowAddress); // Инициируем работу с датчиком TDS/EC-метра, указав его текущий адрес nowAddress. if(f){ Serial.println("OK"); } // Если f=true значит инициализация пройдена успешно. else { Serial.println("ERR"); } // Если f=false значит инициализация не пройдена. Serial.print("Смена адреса "); // f = sensor.changeID(newAddress); // Меняем адрес датчика TDS/EC-метра на новый newAddress. if(f){ Serial.println("OK"); } // Если f=true значит адрес изменён. else { Serial.println("ERR"); } // Если f=false значит адрес не изменён. Serial.print("Текущий адрес "); // Serial.println(sensor.getID()); // Выводим текущий адрес датчика TDS/EC-метра. Serial.print("Версия прошивки "); // Serial.println(sensor.getVersion()); // Выводим версию прошивки датчика TDS/EC-метра. } // // void loop(){ // Визуально показываем у какого устройства был изменён адрес. sensor.setIDLED(true ); delay(1000); // Включаем светодиодом обнаружения устройства (на разъёме RJ45). sensor.setIDLED(false); delay(1000); // Выключаем светодиодом обнаружения устройства (на разъёме RJ45). } //
Пример будет более коротким, если убрать вывод данных в монитор последовательного порта и обращаться к функциям sensor.begin()
, sensor.changeID()
без проверки f
. Если при обращении к функции sensor.begin()
не указывать текущий адрес датчика nowAddress
, то он будет найден автоматически, но это займёт некоторое время.
Чтение электропроводности и минерализации жидкости:
Пример выводит прочитанные показания в монитор последовательного порта.
uint8_t pinDE = 2; // Вывод DE конвертера UART-RS485. // #include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. #include <iarduino_MB_TDS.h> // Подключаем библиотеку для работы с датчиком TDS/EC-метра. // ModbusClient modbus(Serial1, pinDE); // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE. iarduino_MB_TDS sensor(modbus); // Создаём объект для работы с TDS/EC-метром указав объект протокола Modbus. // void setup(){ // Serial.begin(9600); while(!Serial); // Инициируем передачу данных в монитор последовательного порта, указав его скорость. Serial1.begin(9600); while(!Serial1); // Инициируем работу с шиной UART-RS485 указав её скорость. modbus.begin(); // Инициируем работу по протоколу Modbus. // modbus.setTimeout(10); // Указываем максимальное время ожидания ответа по протоколу Modbus. // modbus.setDelay(4); // Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus. // modbus.setTypeMB( MODBUS_RTU ); // Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII. bool f = sensor.begin(5); // Инициируем работу с датчиком TDS/EC-метра, указав его адрес. if( !f ){ // Если функция begin() вернула false, значит датчик TDS/EC-метра с адресом 5 не найден. Serial.print("TDS/EC-метр не найден");// while(1); // Запрещаем дальнейшее выполнение скетча. } // } // // void loop(){ // // Передаём данные датчику: // sensor.set_t(25.0); // Указываем температуру жидкости в которую погружен щуп. delay(1000); // // Получаем данные от датчика: // int32_t tds = sensor.getTDS(); // Получаем количество растворённых твёрдых веществ в жидкости. float ec = sensor.getEC(); // Получаем приведённую удельную электропроводность жидкости. // Информируем о отсутствии ответа: // if( tds<0 || ec<0 ){ // Если не получен любой из параметров, то ... Serial.println(F("Нет ответа.")); // Сообщаем о ошибке чтения. return; // } // // Выводим результат: // Serial.print ( tds ); // Выводим количество растворённых твёрдых веществ в жидкости. Serial.print ("ppm, " ); // Выводим единицу измерения. Serial.print ( ec ); // Выводим приведённую удельную электропроводность жидкости. Serial.println("мСм/см."); // Выводим единицу измерения. } //
Обратите внимание на то, что мы постоянно информируем датчик о текущей температуре исследуемой жидкости, так как она сильно влияет на её электропроводность.
Этот пример кажется большим, но если убрать все проверки и некоторые комментарии, то код будет более компактным.
Пример выводит показания как в предыдущем примере, но без проверок:
#include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. #include <iarduino_MB_TDS.h> // Подключаем библиотеку для работы с датчиком TDS/EC-метра. // ModbusClient modbus(Serial1, 2); // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE. iarduino_MB_TDS sensor(modbus); // Создаём объект для работы с TDS/EC-метром указав объект протокола Modbus. // void setup(){ // Serial.begin(9600); while(!Serial); // Инициируем передачу данных в монитор последовательного порта, указав его скорость. Serial1.begin(9600); while(!Serial1); // Инициируем работу с шиной UART-RS485 указав её скорость. modbus.begin(); // Инициируем работу по протоколу Modbus. sensor.begin(5); // Инициируем работу с TDS/EC-метром, указав его адрес. } // Если адрес не указан sensor.begin(), то он будет найден, но это займёт некоторое время. // void loop(){ // sensor.set_t(25.0); // Указываем температуру жидкости в которую погружен щуп. delay(1000); // Serial.print ( sensor.getTDS() ); // Выводим количество растворённых твёрдых веществ в жидкости. Serial.print ("ppm, " ); // Выводим единицу измерения. Serial.print ( sensor.getEC() ); // Выводим приведённую удельную электропроводность жидкости. Serial.println("мСм/см." ); // Выводим единицу измерения. } //
Несмотря на то, что код без проверок кажется более понятным, рекомендуется выполнять проверки, так как это помогает отслеживать ошибки в процессе работы устройства.
Выбор данных выводимых на дисплей датчика:
Пример позволяет выбрать данные для вывода на дисплей в реальном времени. Только для датчиков с дисплеем.
uint8_t pinDE = 2; // Вывод DE конвертера UART-RS485. // #include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. #include <iarduino_MB_TDS.h> // Подключаем библиотеку для работы с датчиком TDS/EC-метра. // ModbusClient modbus(Serial1, pinDE); // Создаём объект для работы по протоколу Modbus указав шину UART-RS485 и вывод DE. iarduino_MB_TDS sensor(modbus); // Создаём объект для работы с TDS/EC-метром указав объект протокола Modbus. // void setup(){ // Serial.begin(9600); while(!Serial); // Инициируем передачу данных в монитор последовательного порта, указав его скорость. Serial1.begin(9600); while(!Serial1); // Инициируем работу с шиной UART-RS485 указав её скорость. modbus.begin(); // Инициируем работу по протоколу Modbus. // modbus.setTimeout(10); // Указываем максимальное время ожидания ответа по протоколу Modbus. // modbus.setDelay(4); // Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus. // modbus.setTypeMB( MODBUS_RTU ); // Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII. bool f = sensor.begin(5); // Инициируем работу с датчиком TDS/EC-метра, указав его адрес. if( !f ){ // Если функция begin() вернула false, значит датчик TDS/EC-метра с адресом 5 не найден. Serial.print("TDS-метр не найден");// while(1); // Запрещаем дальнейшее выполнение скетча. } // // Настраиваем работу дисплея: // // sensor.print(MB_TDS_Ro); // Выводить общее измеренное сопротивление между выводами щупа. // sensor.print(MB_TDS_S); // Выводить измеренную удельную электропроводность. sensor.print(MB_TDS_EC); // Выводить приведённую удельную электропроводность (по умолчанию). // sensor.print(MB_TDS_TDS); // Выводить общее количество растворённых твёрдых веществ. // sensor.print(MB_TDS_5V); // Выводить напряжение питания на шине +5V. Должно быть равно 5,0 В ± 0,3. // sensor.print(MB_TDS_Vo); // Выводить напряжение виртуального 0 на входе ОУ. Должно быть в равно 1,65 В ± 0,05. // sensor.print(MB_TDS_Vout); // Выводить напряжение Vout на выходе ОУ. Должно быть в диапазоне 0...3,3 В. // sensor.print(MB_TDS_Vsen); // Выводить напряжение Vsen на входе щупа. Должно быть в диапазоне 1,65...1,98 В. } // // void loop(){ // // Передаём данные датчику: // sensor.set_t(25.0); // Указываем температуру жидкости в которую погружен щуп. delay(1000); // } //
Этот пример однократно настраивает работу дисплея на вывод электропроводности, а потом постоянно отправляет датчику температуру исследуемой жидкости, так как она сильно влияет на её электропроводность.
Дисплей датчика не только выводит выбранные данные (по умолчанию EC), но и сообщает о ошибках самодиагностики, которую датчик выполняет в режиме реального времени.
Дисплей:
Данный раздел относится только с датчику с дисплеем.
Кнопкой можно выбирать один из трех параметров для вывода на дисплей:
- R - Рассчитанное сопротивление между выводами щупа.
Значение выводится в Ом целым числом. - EC - Приведённую удельную электропроводность (приведённую к опорной температуре).
Значение выводится в мСм/см с двумя знаками после запятой. - TDS - Общее количество растворённых твёрдых веществ (минерализация).
Значение выводится в ppm "pro pro mille" целым числом.
Для выбора требуемого параметра нужно удерживать кнопку «Калибровка». Через 10 секунд на дисплее начнут сменяться надписи "R", "EC", "TDS". Отпускание кнопки подтверждает выбор.
Функция print() библиотеки iarduino_MB_TDS, позволяет выбирать один из восьми параметров для вывода на дисплей:
- R - Рассчитанное сопротивление между выводами щупа.
Значение выводится в Ом целым числом. - S - Измеренную удельную электропроводность (при текущей температуре).
Значение выводится в мСм/см с двумя знаками после запятой. - EC - Приведённую удельную электропроводность (приведённую к опорной температуре).
Значение выводится в мСм/см с двумя знаками после запятой. - TDS - Общее количество растворённых твёрдых веществ (минерализация).
Значение выводится в ppm "pro pro mille" целым числом. - 5V - Измеренное напряжения питания на шине +5V.
Значение выводится в В, с тремя знаками после запятой. - Vo - Измеренное напряжение виртуального ноля.
Значение выводится в В, с тремя знаками после запятой. - Vout - Измеренное напряжение на выходе ОУ.
Значение выводится в В, с тремя знаками после запятой. - Vsens - Измеренное напряжение на входе щупа при положительной полярности.
Значение выводится в В, с тремя знаками после запятой.
Четырёхразрядный LED дисплей выводит выбранное показание и информирует о ошибках.
Стабилизация показаний после подачи питания (3 сек). Удержание кнопки «Калибровка». | |
Основной режим работы. Дисплей выводит (по умолчанию) приведённую удельную электропроводность в мСм/см. | |
Ошибка 0. Ошибка возникает при низком напряжении питания. Проверьте питание и разъем RJ-45. | |
Ошибка 1. Ошибка информирует о низком напряжении виртуального ноля. Датчик неисправен. | |
Ошибка 2. Ошибка информирует о высоком напряжении виртуального ноля. Датчик неисправен. | |
Ошибка 3. Ошибка информирует о низком напряжении на выходе ОУ. Возможно щуп не подключён или неисправен. | |
Ошибка 4. Ошибка информирует о высоком напряжении на выходе ОУ. Возможно щуп не подключён или неисправен. | |
Ошибка 5. Показания считаны при отрицательной полуволне Vsens. Датчик неисправен. | |
Ошибка С (Error Calibration). Ошибка калибровки. Не запустилась, выполнена с ошибкой или прервана. | |
Ошибка D (Error Display). Дисплей некорректно настроен функцией print(). |
Зуммер:
Датчик без дисплея позволяет информировать о ошибках подачей звуковых сигналов.
Ошибка 0 | • | Низкое напряжение питания. Каждую секунду датчик издаёт один короткий звуковой сигнал. |
Ошибка 1 | ─ | Низкое напряжение виртуального ноля. Каждую секунду датчик издаёт один длинный звуковой сигнал. |
Ошибка 2 | • • | Высокое напряжение виртуального ноля. Каждую секунду датчик издаёт два коротких звуковых сигнала. |
Ошибка 3 | ─ ─ | Низкое напряжение на выходе ОУ. Каждую секунду датчик издаёт два длинных звуковых сигнала. |
Ошибка 4 | • ─ | Высокое напряжение на выходе ОУ. Каждую секунду датчик издаёт два сигнала, короткий, потом длинный. |
Ошибка 5 | ─ • | Показания считаны при отрицательной полуволне Vsens. Каждую секунду датчик издаёт два сигнала, длинный, потом короткий. |
Ошибка С | ─ ─ ─ | Калибровка выполнена с ошибкой или прервана. Датчик издаёт три очень длинных звуковых сигнала. |
У датчика без дисплея, нет ошибки D, как у датчика с дисплеем.
Сигналы о ошибках генерируются на низкой (500Гц) частоте.
Длительность короткого сигнала составляет 0,1 сек, длинного 1 сек, а очень длинного 2 сек.
Калибровка:
Для калибровки потребуются две калибровочные (буферные) жидкости, с общим количеством растворённых твердых веществ 500 ppm (1.00 мСм/см при 25°С) и 1500 ppm (3.00 мСм/см при 25°С), а так же дистиллированная вода. Все жидкости должны иметь температуру при которой планируется выполнять дальнейшие измерения.
Примечание: Для калибровки датчика можно использовать другие жидкости, если предварительно указать их параметры функцией setKnownTDS(), или setKnownEC() библиотеки iarduino_MB_TDS. Параметры калибровочных жидкостей должны отличаться не менее чем на 200 ppm или 0,4 мСм/см.
Калибровка датчика с дисплеем:
- Если до начала калибровки на дисплее выводилась удельная электропроводность в мСм/см, то и в процессе калибровки, на дисплее будет отображаться информация в мСм/см.
- Если до начала калибровки выводилась минерализация в ppm, то и в процессе калибровки, на дисплее будет отображаться информация в ppm.
- Изменить тип выводимых на дисплей данных, можно удержанием кнопки «Калибровка».
Важно: Если на дисплее выводилось сопротивление (в Ом) или напряжение (в В),
то калибровка не запустится, т.к. датчик не знает в каких единицах выводить данные.
На дисплее появится надпись "Err.C".
Перед калибровкой очистите щуп от жидкости в которой он был ранее. Для этого протрите электроды щупа спиртом или дистиллированной водой и дайте им высохнуть.
Запуск калибровки. Опустите щуп в первую жидкость (500ppm = 1.00мСм/см). Удерживайте кнопку «Калибровка» до появления «----». | |
1 стадия калибровки (ожидание). Появится требуемое значение 1 жидкости (500ppm = 1.00мСм/см). Датчик ждёт стабилизации показаний измерительного щупа. | |
1 стадия калибровки (выполнение). Датчик считывает показания измерительного щупа и выводит на дисплей анимацию кругового включения сегментов | |
Ожидание смены жидкости. Мигает требуемое значение 2 жидкости (1500ppm = 3.00мСм/см). Достаньте щуп из первой жидкости и опустите во вторую. Датчик сам определит смену жидкости. | |
2 стадия калибровки (ожидание). Требуемое значение второй жидкости перестанет мигать. Датчик ждёт стабилизации показаний измерительного щупа. | |
2 стадия калибровки (выполнение). Датчик считывает показания измерительного щупа и выводит на дисплей анимацию кругового включения сегментов. | |
Успешное завершение калибровки. Если на дисплее появилась надпись «Good», значит калибровка выполнена успешно и все рассчитанные показания сохранены в энергонезависимую память датчика. | |
Ошибка калибровки. Если на дисплее появилась надпись «Err.C», значит калибровка не выполнена и данные не сохранены. |
Калибровка датчика без дисплея:
Очистите щуп от жидкости в которой он был ранее. Для этого протрите электроды щупа спиртом или дистиллированной водой и дайте им высохнуть.
• | Запуск калибровки. Опустите щуп в первую калибровочную жидкость (500 ppm = 1.00 мСм/см). Нажмите и удерживайте кнопку «Калибровка». Датчик издаст короткий звуковой сигнал при нажатии на кнопку и такой же сигнал через секунду её удержания, тогда кнопку можно отпустить. |
• | 1 стадия калибровки. Каждую секунду датчик издаёт один короткий звуковой сигнал. На этой стадии датчик ждёт стабилизации показаний щупа, а потом считывает их. |
─ ─ | Ожидание смены жидкости. Каждую секунду датчик издаёт два длинных звуковых сигнала. Достаньте щуп из первой калибровочной жидкости и опустите во вторую. |
• • | 2 стадия калибровки. Каждую секунду датчик издаёт два коротких звуковых сигнала. На этой стадии датчик ждёт стабилизации показаний щупа, а потом считывает их. |
─ | Успешное завершение калибровки. Если датчик издал один очень длинный звуковой сигнал, значит калибровка выполнена успешно и все рассчитанные показания сохранены в энергонезависимую память. |
─ ─ ─ | Ошибка калибровки. Если датчик издал три очень длинных звуковых сигнала, значит калибровка не выполнена и данные не сохранены. |
Сигналы о стадиях и успехе калибровки генерируются на высокой (3кГц) частоте, а сигнал о ошибке, на низкой (500Гц) частоте.
Длительность короткого сигнала составляет 0,1 сек, длинного 1 сек, а очень длинного 2 сек.
Правила калибровки общие для датчиков с дисплеем и без:
Запустить калибровку можно не только удержанием кнопки «Калибровка», но и обращением к функции setCalibration() библиотеки iarduino_MB_TDS.
После запуска калибровки, требуется только сменить первую калибровочную жидкость на вторую. Датчик самостоятельно зафиксирует смену жидкости и перейдёт ко второй стадии.
После извлечения щупа из первой калибровочной жидкости, рекомендуется его встряхнуть избавившись от крупных капель, а при погружении щупа в жидкость, поводить им в стороны избавившись от возможного образования воздушных пузырьков.
Процесс ожидания стабилизации показаний щупа занимает не менее 10 секунд.
Калибровку можно отменить, в любой момент, повторным нажатием на кнопку «Калибровка». Калибровка автоматически отменяется, если любая из стадий калибровки выполняется дольше 1 мин. Отмена калибровки расценивается как ошибка с соответствующим уведомлением.
Приготовление калибровочных жидкостей:
Данный пример позволяет приготовить два раствора с концентрации 500 ppm и 1'500 ppm.
Нам понадобятся: хлорид калия (KCl), дистиллированная вода (H2O) - продаётся в универсальных и автомагазинах, 3 чистых стакана, шприц, и весы.
Рекомендуется взять хлорид калия в пакетах по 1 грамму, тогда весы не понадобятся.
Если хлорида калия (KCl) нет, можно взять хлорид натрия (NaCl) - это обычная пищевая соль.
- Пронумеруйте стаканы цифрами «0», «1» и «2» соответственно.
- В стакане «0» приготовим эталонный раствор хлорида калия с концентрацией 10'000 ppm:
- В стакан «0» насыпьте 1 г (1'000 мг) калиевой соли (KCl).
- В стакан «0» налейте 50-70 мл дистиллированной воды.
Перемешайте содержимое стакана до полного растворения соли. - В стакан «0» долейте дистиллированной воды до получения 100 мл раствора.
Перемешайте содержимое стакана до полного растворения соли. - В итоге в стакане «0» мы получили эталонный раствор 10'000 ppm.
(1'000 мг / 100 мл = 10'000 мг/л = 10'000 ppm).
- В стакане «1» приготовим первую калибровочную жидкость 500 ppm:
- В стакан «1» перелейте 5 мл эталонного раствора из стакана «0» с помощью шприца.
Теперь в стакане «1» находится 5 мл начального раствора.
(1'000 мг / 100 мл = 50 мг / 5 мл). - В стакан «1» долейте дистиллированной воды до получения 100 мл раствора.
Перемешайте содержимое стакана. - В итоге в стакане «1» мы получили первую калибровочную жидкость 500 ppm.
(50 мг / 100 мл = 500 мг/л = 500 ppm).
- В стакан «1» перелейте 5 мл эталонного раствора из стакана «0» с помощью шприца.
- В стакане «2» приготовим вторую калибровочную жидкость 1'500 ppm:
- В стакан «2» перелейте 15 мл эталонного раствора из стакана «0» с помощью шприца.
Теперь в стакане «2» находится 15 мл начального раствора.
(1'000 мг / 100 мл = 150 мг / 15 мл). - В стакан «2» долейте дистиллированной воды до получения 100 мл раствора.
Перемешайте содержимое стакана. - В итоге в стакане «2» мы получили вторую калибровочную жидкость 1'500 ppm.
(150 мг / 100 мл = 1'500 мг/л = 1'500 ppm).
- В стакан «2» перелейте 15 мл эталонного раствора из стакана «0» с помощью шприца.
- Эталонный раствор в стакане «0» больше не понадобится. А калибровочные растворы в стаканах «1» и «2» должны настояться не менее 2 часов.
- Формула: ШПРИЦ = КОНЦЕНТРАЦИЯ * КОЛИЧЕСТВО / ЭТАЛОН
Эта формула позволяет определить, сколько эталонной жидкости (из стакана «0») нужно взять в шприц для приготовления калибровочной жидкости в любых концентрациях.
- Пример: Нужно создать 100 мл калибровочной жидкости 1'500 ppm из эталонной 10'000 ppm.
- КОНЦЕНТРАЦИЯ = 1'500 ppm.
- КОЛИЧЕСТВО = 100 мл.
- ЭТАЛОН = 10'000 ppm.
- ШПРИЦ = КОНЦЕНТРАЦИЯ * КОЛИЧЕСТВО / ЭТАЛОН = 1'500 * 100 / 10'000 = 15 мл.
Этот пример показывает почему на 4 пункте инструкции, для приготовления 100 мл жидкости с концентрацией 1'500 ppm, мы переливали шприцом именно 15 мл эталонного раствора.
Библиотека iarduino_MB_TDS позволяет запускать калибровку, определять стадии калибровки, получать результат калибровки, читать и менять данные рассчитанные при калибровке, а так же указывать минерализацию используемых калибровочных жидкостей.
Описание функций библиотеки:
В данном разделе описаны функции библиотеки iarduino_MB_TDS для работы с датчиками минерализации (TDS/EC-метр) RS485 / Modbus с дисплеем и без дисплея. Эта библиотека работает совместно с библиотекой iarduino_Modbus, описание функций которой доступно по ссылке Wiki - Работа с протоколом Modbus RTU/ASCI по шине RS485.
Подключение библиотек:
В примерах вход DE конвертера UART-RS485 подключён к выводу D2 Arduino. Вместо вывода D2 можно использовать любой выход Arduino, номер выхода указывается при создании объекта для работы по протоколу Modbus.
- Если используется аппаратная шина UART:
#include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. #include <iarduino_MB_TDS.h> // Подключаем библиотеку для работы с датчиком TDS/EC-метра. // ModbusClient modbus(Serial,2); // Создаём объект для работы по протоколу Modbus указав класс Serial и номер вывода DE конвертера UART-RS485. iarduino_MB_TDS sensor(modbus); // Создаём объект для работы с TDS/EC-метром указав объект протокола Modbus. // void setup(){ // ... // Serial.begin(9600); // Указываем скорость шины RS485. Она равна скорости шины UART подключённой к конвертеру UART-RS485. while(!Serial); // sensor.begin(5); // Инициируем работу с TDS/EC-метром, указав его адрес. ... // Если адрес не указан sensor.begin(), то он будет найден, но это займёт некоторое время. } //
Если используется аппаратная шина UART-1, то вместо класса Serial указываем Serial1, для шины UART2 указываем Serial2 и т.д.
- Если используется программная реализация шины UART:
#include <SoftwareSerial.h> // Подключаем библиотеку для работы с программной шиной UART. #include <iarduino_Modbus.h> // Подключаем библиотеку для работы по протоколу Modbus. #include <iarduino_MB_TDS.h> // Подключаем библиотеку для работы с датчиком TDS/EC-метра. // SoftwareSerial rs485(8, 9); // Создаём объект для работы с программной шиной UART указывая выводы RX, TX. ModbusClient modbus(rs485,2); // Создаём объект для работы по протоколу Modbus указав объект программной шины UART и номер вывода DE конвертера UART-RS485. iarduino_MB_TDS sensor(modbus); // Создаём объект для работы с TDS/EC-метром указав объект протокола Modbus. // void setup(){ // ... // rs485.begin(9600); // Указываем скорость шины RS485. Она равна скорости программной шины UART подключённой к конвертеру UART-RS485. while(!rs485); // sensor.begin(5); // Инициируем работу с TDS/EC-метром, указав его адрес. ... // Если адрес не указан sensor.begin(), то он будет найден, но это займёт некоторое время. } //
Для программной реализации шины UART необходимо указать выводы которые будут использоваться как RX и TX, в примере указаны выводы 8, и 9 соответственно. При создании объекта modbus указывается не класс Serial, а объект для работы с программной шиной UART.
Скорость передачи данных по шине Modbus равна скорости шины UART.
Функция begin();
- Назначение: Инициализация работы с датчиком минерализации (TDS/EC-метр).
- Синтаксис: begin( [ АДРЕС_ДАТЧИКА ] );
- Параметр: uint8_t АДРЕС_ДАТЧИКА - значение от 1 до 247.
- Возвращаемое значение: bool - результат инициализации (true или false).
- Примечание:
- Если вызвать функцию без параметра, то адрес TDS/EC-метра будет найден автоматически. На это уйдёт некоторое время и на шине долен быть только один датчик минерализации (TDS/EC-метр).
- Функцию достаточно вызвать 1 раз в коде Setup(), до обращения к остальным функциям библиотеки.
- Датчики минерализации (TDS/EC-метры) поставляются с адресом 5 на шине, но этот адрес можно изменить.
- Пример:
sensor.begin(5); // Инициируем работу с TDS/EC-метром, указав его адрес на шине.
Функция reset();
- Назначение: Программная перезагрузка датчика минерализации (TDS/EC-метра).
- Синтаксис: reset();
- Параметры: Нет.
- Возвращаемое значение: bool - результат перезагрузки (true или false).
- Пример:
sensor.reset(); // Выполняем программную перезагрузку.
Функция changeID();
- Назначение: Установка нового адреса на шине.
- Синтаксис: changeID( АДРЕС_ДАТЧИКА );
- Параметр: uint8_t АДРЕС_ДАТЧИКА - значение от 1 до 247.
- Возвращаемое значение: bool - результат изменения адреса (true или false).
- Примечание:
- Новый адрес сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
- Выполнение функции занимает более 120 миллисекунд.
- Пример:
sensor.changeID(10); // Изменить адрес датчика на значение 10.
Функция setSpeedMB();
- Назначение: Установка новой скорости передачи данных.
- Синтаксис: setSpeedMB( СКОРОСТЬ );
- Параметр: uint32_t СКОРОСТЬ - может принимать одно из значений:
4800 / 9600 / 19200 / 38400 / 57600. - Возвращаемое значение: bool - результат изменения скорости (true или false).
- Примечание:
- Новая скорость применяется на 2 секунды, в течении которых её нужно подтвердить.
- Если скорость не подтвердить в течении 2 секунд, датчик вернёт прежнюю скорость.
- Скорость подтверждается функцией ackSpeedMB() на новой скорости шины.
Функция ackSpeedMB();
- Назначение: Подтверждение смены скорости передачи данных.
- Синтаксис: ackSpeedMB();
- Параметры: Нет.
- Возвращаемое значение: bool - результат подтверждения скорости (true или false).
- Примечание:
- Подтверждение скорости выполняется после установки новой скорости датчика функцией setSpeedMB() и установки той же скорости для шины UART-RS485.
- Если скорость не подтвердить в течении 2 секунд, датчик вернёт прежнюю скорость.
- Подтверждённая скорость сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setSpeedMB(9600); // Изменить скорость датчика на 9600 бит/сек. Serial.begin(9600); // Изменить скорость шины UART-RS485 на 9600 бит/сек. sensor.ackSpeedMB(); // Подтвердить скорость датчика.
Функция setTypeMB();
- Назначение: Установка нового типа протокола Modbus.
- Синтаксис: setTypeMB( ТИП );
- Параметр: uint8_t ТИП - может принимать значение MODBUS_RTU или MODBUS_ASCII.
- Возвращаемое значение: bool - результат изменения типа протокола (true или false).
- Примечание:
- Новый тип протокола применяется на 2 секунды, в течении которых его нужно подтвердить.
- Если тип протокола не подтвердить в течении 2 секунд, датчик вернёт прежний тип.
- Тип протокола подтверждается функцией ackTypeMB() по новому типу протокола на шине.
Функция ackTypeMB();
- Назначение: Подтверждение смены типа протокола Modbus.
- Синтаксис: ackTypeMB();
- Параметры: Нет.
- Возвращаемое значение: bool - результат подтверждения типа протокола (true или false).
- Примечание:
- Подтверждение типа протокола Modbus выполняется после установки нового типа протокола датчика функцией setTypeMB() и установки того-же типа протокола для передачи данных по шине UART-RS485.
- Если тип протокола не подтвердить в течении 2 секунд, датчик вернёт прежний тип.
- Подтверждённый тип протокола Modbus сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setTypeMB(MODBUS_RTU); // Изменить тип протокола датчика на Modbus RTU. modbus.setTypeMB(MODBUS_RTU); // Изменить тип протокола шины UART-RS485 на Modbus RTU. sensor.ackTypeMB(); // Подтвердить тип протокола датчика.
Функция writeFlash();
- Назначение: Запись пользовательского значения в Flash память.
- Синтаксис: writeFlash( ЧИСЛО );
- Параметр: uint16_t ЧИСЛО - любое значение от 0 до 65535.
- Возвращаемое значение: bool - результат записи (true или false).
- Примечание:
- Записываемое число сохраняется в энергонезависимую память, а значит остаётся после отключения питания.
- Выполнение функции занимает более 50 миллисекунд.
- Для чтения числа из Flash памяти воспользуйтесь функцией readFlash().
- Число хранится в регистре "Holding Registers" [0x0120] «USER_DATA».
- Пример:
sensor.writeFlash(12345); // Записать число в энергонезависимую память.
Функция readFlash();
- Назначение: Чтение пользовательского значения из Flash памяти.
- Синтаксис: readFlash();
- Параметры: Нет.
- Возвращаемое значение: int32_t - число из памяти (0...65535) , или -1 при провале чтения.
- Примечание:
- Для записи числа в Flash память воспользуйтесь функцией writeFlash().
- Число хранится в регистре "Holding Registers" [0x0120] «USER_DATA».
- Пример:
i = sensor.readFlash(); // Читаем число из энергонезависимой памяти. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим прочитанное значение.
Функция getID();
- Назначение: Чтение адреса устройства на шине.
- Синтаксис: getID();
- Параметры: Нет.
- Возвращаемое значение: uint8_t - адрес (1...247), или 0 если устройство не инициировано.
- Примечание:
- Данная функция может пригодиться если инициализация устройства выполнена функцией begin() без указания адреса (адрес найден автоматически).
- Пример:
i = sensor.getID(); // Читаем адрес устройства на шине. if(i==0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим адрес устройства на шине.
Функция getVersion();
- Назначение: Чтение версии прошивки устройства.
- Синтаксис: getVersion();
- Параметры: Нет.
- Возвращаемое значение: uint8_t - версия прошивки, или 0 если устройство не инициировано.
- Пример:
i = sensor.getVersion(); // Читаем версию прошивки устройства. if(i==0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим версию прошивки устройства.
Функция setIDLED();
- Назначение: Управление индикатором обнаружения устройства.
- Синтаксис: setIDLED( СОСТОЯНИЕ );
- Параметр: bool СОСТОЯНИЕ - флаг включения индикатора (true или false).
- Возвращаемое значение: bool - результат применения состояния индикатора (true или false).
- Примечание:
- Индикатор обнаружения устройства - это светодиод на разъеме RJ-45.
- Если индикатор включён, то светодиод постоянно светится. Так можно визуально определить устройство, если на шине имеются несколько одинаковых устройств.
- Если индикатор отключен, то светодиод информирует о получении запросов, адресованных этому устройству.
- Пример:
sensor.setIDLED(true ); // Включаем индикатор обнаружения устройства. sensor.setIDLED(false); // Отключаем индикатор обнаружения устройства.
Функция getPWR();
- Назначение: Чтение напряжения питания на шине 5V.
- Синтаксис: getPWR();
- Параметры: Нет.
- Возвращаемое значение: float - напряжение (00,000...65,535 В), или -1 при провале чтения.
- Примечание:
- Данная функция позволяет узнать напряжение питания на гальванически развязанной шине питания 5V.
- У других модулей iarduino, не имеющих гальванической развязки по питанию, данная функция возвращает напряжение питания получаемое с разъема RJ45.
- Пример:
i = sensor.getPWR(); // Читаем гальванически развязанное напряжение питания 5V. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим напряжение питания шины 5V в вольтах.
Функция getErr();
- Назначение: Чтение флагов ошибок из регистра диагностики.
- Синтаксис: getErr();
- Параметры: Нет.
- Возвращаемое значение: int32_t - регистр диагностики (2 байта), или -1 при провале чтения.
- Примечание:
- Функция возвращает двухбайтное значение из регистра диагностики.
- Каждый бит регистра диагностики информирует о ошибке.
- Датчик постоянно проводит самодиагностику в режиме реального времени.
- Пример:
i = sensor.getErr(); // Получаем значение регистра диагностики. if(i ){ Serial.print("Есть ошибки: " ); } if(i & ERR_MB_TDS_Power){ Serial.print("Стабилизация после подачи питания. " ); } if(i & ERR_MB_TDS_ADC ){ Serial.print("Данные считаны при обратной полярности Vsen. "); } if(i & ERR_MB_TDS_Vout ){ Serial.print("Некорректное напряжение Vout на выходе ОУ. " ); } if(i & ERR_MB_TDS_Vo ){ Serial.print("Некорректное напряжение виртуального ноля. " ); } if(i & ERR_MB_TDS_5V ){ Serial.print("Низкое напряжение питания 5В шины. " ); }
Функция setCalibration();
- Назначение: Запуск калибровки.
- Синтаксис: setCalibration();
- Параметры: Нет.
- Возвращаемое значение: bool - результат запуска калибровки (true или false).
- Примечание:
- Обращение к функции равносильно нажатию на кнопку "Калибровка".
- Перед запуском нужно очистить щуп и опустить его в 1 калибровочную жидкость.
- Узнать текущую стадию калибровки можно функцией getCalibration().
- Пример:
sensor.setCalibration(); // Запускаем калибровку.
Функция getCalibration();
- Назначение: Чтение текущей стадии калибровки.
- Синтаксис: getCalibration();
- Параметры: Нет.
- Возвращаемое значение: int8_t - стадия калибровки (0,1,2,3), или -1 при провале чтения.
- Примечание:
- Подробно о стадиях калибровки написано выше, в разделе "Калибровка".
- Актуальные значения возвращаемые функцией:
- 0 - Калибровка не выполняется.
- 1 - Выполняется первая стадия калибровки.
- 2 - Выполняется вторая стадия калибровки.
- 3 - Датчик ожидает смены первой калибровочной жидкости на вторую.
- Результат калибровки можно узнать функцией getResultCalib().
- Пример:
i = sensor.setCalibration(); // Запускаем калибровку. do{ j = sensor.getCalibration(); delay(1000); // Читаем текущую стадию калибровки. if( j==1 ){ Serial.println("1 стадия..." ); } // Выполняется 1 стадия калибровки. if( j==3 ){ Serial.println("смените жидкость"); } // Датчик ждёт смены жидкости. if( j==2 ){ Serial.println("2 стадия..." ); } // Выполняется 2 стадия калибровки. }while( j ); // Выполняем цикл пока выполняется калибровка. Serial.println("Калибровка завершена"); } // Эта строка выполнится если j==0.
Функция getResultCalib();
- Назначение: Чтение результата последней калибровки.
- Синтаксис: getResultCalib();
- Параметры: Нет.
- Возвращаемое значение: int8_t - результат (true или false), или -1 при провале чтения.
- Примечание:
- Результат калибровки устанавливается в true при запуске калибровки.
- Результат калибровки сбрасывается в false если калибровка выполнена с ошибкой.
- Датчик считает калибровку выполненной с ошибкой, если коэффициент Kb рассчитанный датчиком в ходе калибровки меньше 0,2. В таком случае результаты калибровки не сохраняются, а функция getResultCalib() возвращает false.
- Пример:
sensor.setCalibration(); // Запускаем калибровку. while( sensor.getCalibration() ) // Выполняем цикл пока выполняется калибровка. { delay(1000); } // Не перегружаем шину. i = sensor.getResultCalib(); // Получаем результат калибровки. if(i<0){ Serial.print("?" ); }else // Датчик не ответил. if( i ){ Serial.print("OK" ); }else // Калибровка завершена успешно. { Serial.print("ERR"); } // Калибровка завершена с ошибкой.
Функция getStability();
- Назначение: Чтение флага нормализации показаний.
- Синтаксис: getStability();
- Параметры: Нет.
- Возвращаемое значение: int8_t - флаг нормализации (true/false), или -1 при провале чтения.
- Примечание:
- Функция возвращает true если показания электропроводности жидкости стабильны.
- Функция возвращает false если показания увеличивается или уменьшается.
- Показания электропроводности считаются стабильными если её среднее значение за последние 10 секунд не сместилось на процент допустимой флуктуации.
- Показания электропроводности считаются нестабильными (увеличиваются или уменьшаются, если её среднее значение за последние 10 секунд сместилось на процент высокой флуктуации.
- Функции setFluctuation() / getFluctuation() позволяют задавать / получать проценты допустимой и высокой флуктуации.
- Пример:
i = sensor.getStability(); // Читаем флаг нормализации показаний. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим флаг.
Функция getRo();
- Назначение: Чтение общего электрического сопротивления между выводами щупа.
- Синтаксис: getRo();
- Параметры: Нет.
- Возвращаемое значение: int32_t - сопротивление (20...20'000 Ом), или -1 при провале чтения.
- Пример:
i = sensor.getRo(); // Читаем общее электрическое сопротивление. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим общее электрическое сопротивление.
Функция getS();
- Назначение: Чтение удельной электропроводности исследуемой жидкости.
- Синтаксис: getS();
- Параметры: Нет.
- Возвращаемое значение: float - электропроводность (0.01...20.00 мСм/см), или -1 при провале чтения.
- Примечание:
- Удельная электропроводность (S) сильно зависит от температуры жидкости (t). Чем выше температура жидкости, тем выше её электрическая проводимость.
- Пример:
i = sensor.getS(); // Читаем удельную электропроводность исследуемой жидкости. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим удельную электропроводность.
Функция getEC();
- Назначение: Чтение приведённой удельной электропроводности.
- Синтаксис: getEC();
- Параметры: Нет.
- Возвращаемое значение: float - электропроводность (0.01...20.00 мСм/см), или -1 при провале чтения.
- Примечание:
- S - удельная электропроводность измеренная при любой температуре t (°С).
EC - удельная электропроводность измеренная при температуре T (°С). - На практике неудобно доводить жидкость до температуры T (°C) для проведения измерений (EC), по этому удельную электрическую проводимость (S) измеряют при любой температуре t (°С), отправляют эту температуру датчику функцией set_t(), а датчик, зная опорную температуру (T) и температурный коэффициент жидкости (Kt), приводит (S) к значению (EC). EC это S приведённая от текущей температуры t к опорной температуре T.
- Приведённая удельная электропроводность (EC) не меняется от реальной температуры (t), если последняя точно измерена и отправлена датчику функцией set_t().
- Пример:
i = sensor.getEC(); // Читаем приведённую удельную электропроводность. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим приведённую удельную электропроводность.
Функция getTDS();
- Назначение: Чтение общего количества растворённых твёрдых веществ в жидкости.
- Синтаксис: getTDS();
- Параметры: Нет.
- Возвращаемое значение: int32_t - минерализация (5...10'000 ppm), или -1 при провале чтения.
- Пример:
i = sensor.getTDS(); // Читаем общее количество растворённых твёрдых веществ. if(i<0){ Serial.print("ERR"); } // Сообщаем о ошибке. else { Serial.print( i ); } // Выводим общее количество растворённых твёрдых веществ.
Функция set_t();
- Назначение: Указание текущей температуры исследуемой жидкости.
- Синтаксис: set_t( °C );
- Параметр: float °C - измеренная температура жидкости.
- Возвращаемое значение: bool - результат отправки температуры (true или false).
- Примечание:
- Датчику нужно знать текущую температуру жидкости для приведения измеренной удельной электропроводности (S) от текущёй температуры (t) к опорной температуре (T).
- Приведённая удельная электропроводность (EC) не меняется от реальной температуры (t), если последняя точно измерена и отправлена датчику функцией set_t().
- Пример:
sensor.set_t( 23.45f ); // Указываем текущую температуру исследуемой жидкости 23,45°С.
Функция print();
- Назначение: Выбор данных для вывода на дисплей датчика.
- Синтаксис: print( ТИП );
- Параметр: uint8_t ТИП - может принимать одно из следующих значений:
- MB_TDS_Ro - выводить общее измеренное сопротивление между выводами щупа.
- MB_TDS_S - выводить измеренную удельную электропроводность.
- MB_TDS_EC - выводить приведённую удельную электропроводность.
- MB_TDS_TDS - выводить общее количество растворённых твёрдых веществ.
- MB_TDS_5V - выводить напряжение питания на шине +5V.
- MB_TDS_Vo - выводить напряжение виртуального 0 на входе ОУ.
- MB_TDS_Vout - выводить напряжение Vout на выходе ОУ.
- MB_TDS_Vsen - выводить напряжение Vsen на входе щупа.
- Возвращаемое значение: bool - результат применения команды (true или false).
- Примечание:
- Функция предназначена только для датчиков минерализации (TDS/EC-метр) с дисплеем.
- По умолчанию датчик выводит на дисплей приведённую удельную электропроводность исследуемой жидкости. При желании, на дисплей можно выводить и другие показания.
- Значения Ro, S, EC, TDS отражают параметры исследуемой жидкости.
- Значения напряжений отражают состояние датчика.
- 5V должно находится в пределах 5,0 В ± 0,3.
- Vo должно находится в пределах 1,65 В ± 0,05.
- Vout должно находится в диапазоне 0...3,3 В.
- Vsen должно находится в диапазоне 1,65...1,98 В.
- Датчик сохраняет выбор функции print() в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.print( MB_TDS_EC ); // Указываем выводить общее количество растворённых твёрдых веществ.
Функции настройки датчика:
В данном разделе описаны функции настройки работы датчика. Датчик использует различные коэффициенты и значения для вычислений. По умолчанию они установлены в стандартные значения и не требуют изменений.
Важно: Некоторые значения устанавливаемые функциями настройки датчика сохраняются в энергонезависимую память, а значит действуют и после отключения питания!
Функция setFrequency();
- Назначение: Установка частоты переменного тока используемого для измерений.
- Синтаксис: setFrequency( ЧАСТОТА );
- Параметр: uint16_t ЧАСТОТА - переменного тока, от 50 до 5'000 Гц.
- Возвращаемое значение: bool - результат записи значения (true или false).
- Примечание:
- Использование переменного тока при измерении электрического сопротивления жидкости снижает эффект поляризации при проведении этих измерений.
- Так как частота влияет на реактивное сопротивление щупа Xc, то после изменения частоты требуется произвести калибровку датчика.
- Указанная частота сохраняется в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Значение по умолчанию: 2'000 Гц.
- Пример:
sensor.setFrequency(2000); // Использовать для измерений ток с частотой 2 кГц.
Функция getFrequency();
- Назначение: Чтение частоты переменного тока используемого для измерений.
- Синтаксис: getFrequency();
- Параметры: Нет.
- Возвращаемое значение: int32_t - Частота (50...5'000 Гц), или -1 при провале чтения.
- Примечание:
- Использование переменного тока при измерении электрического сопротивления жидкости снижает эффект поляризации при проведении этих измерений.
- Значение по умолчанию: 2'000 Гц.
- Пример:
i = sensor.getFrequency(); // Читаем частоту переменного тока. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "F = "+i+" Гц." ); }
Функция setKnownTDS();
- Назначение: Установка минерализации калибровочных жидкостей.
- Синтаксис: setKnownTDS( СТАДИЯ , TDS );
- Параметры:
- uint8_t СТАДИЯ - может принимать значение 1 или 2.
- uint16_t TDS - может принимать значения от 50 до 10'000 ppm.
- Возвращаемое значение: bool - результат записи значения (true или false).
- Примечание:
- Калибровка производится с использованием двух калибровочных жидкостей, c количеством твердых растворимых веществ 500 и 1'500 ppm (по умолчанию). Данная функция позволяет указать датчику, что для калибровки будут использоваться другие жидкости.
- Первый параметр указывает номер жидкости (1 или 2) первая или вторая.
- Второй параметр указывает минерализацию этой жидкости в ppm.
- Минерализация первой калибровочной жидкости должна отличатся от второй не менее чем на 200 ppm (в любую сторону).
- Вместо функции setKnownTDS() можно использовать функцию setKnownEC().
- Указанные параметры сохраняются в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setKnownTDS(1, 1000); // На 1 стадии калибровки будет жидкость 1'000 ppm. sensor.setKnownTDS(2, 2000); // На 2 стадии калибровки будет жидкость 2'000 ppm.
Функция getKnownTDS();
- Назначение: Чтение минерализации жидкостей требуемых для калибровки.
- Синтаксис: getKnownTDS( СТАДИЯ );
- Параметр: uint8_t СТАДИЯ - может принимать значение 1 или 2.
- Возвращаемое значение: int32_t - минерализация в ppm, или -1 при провале чтения.
- Примечание:
- Функция позволяет узнать требуемые минерализации калибровочных жидкостей.
- Параметр функции указывает, значение какой жидкости (1 или 2) требуется вернуть.
- По умолчанию, для 1 стадии калибровки, требуется жидкость 500 ppm.
- По умолчанию, для 2 стадии калибровки, требуется жидкость 1'500 ppm.
- Вместо функции getKnownTDS() можно использовать функцию getKnownEC().
- Пример:
i = sensor.getKnownTDS( 1 ); // Читаем минерализацию требуемую на 1 стадии калибровки. j = sensor.getKnownTDS( 2 ); // Читаем минерализацию требуемую на 2 стадии калибровки. if( i<0 || j<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "1="+i+"ppm, 2="+j+"ppm." ); }
Функция setKnownEC();
- Назначение: Установка приведённой удельной электропроводности калибровочных жидкостей.
- Синтаксис: setKnownEC( СТАДИЯ , EC );
- Параметры:
- uint8_t СТАДИЯ - может принимать значение 1 или 2.
- float EC - может принимать значения от 0,01 до 20,00 мСм/см.
- Возвращаемое значение: bool - результат записи значения (true или false).
- Примечание:
- Данная функция является аналогом функции setKnownTDS(), позволяя указывать не минерализацию (TDS) калибровочной жидкости в ppm, а её приведённую удельную электропроводность (EC) в мСм/см.
- Отношение TDS к EC зависит от используемого датчиком коэффициента пересчёта Kp.
- Указанные параметры сохраняются в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setKnownEC(1, 2.0); // На 1 стадии калибровки будет жидкость 2.0 мСм/см. sensor.setKnownEC(2, 4.0); // На 2 стадии калибровки будет жидкость 4.0 мСм/см.
Функция getKnownEC();
- Назначение: Чтение приведённой электропроводности жидкостей требуемых для калибровки.
- Синтаксис: getKnownEC( СТАДИЯ );
- Параметр: uint8_t СТАДИЯ - может принимать значение 1 или 2.
- Возвращаемое значение: float - приведённая электропроводность в мСм/см, или -1 при провале чтения.
- Примечание:
- Данная функция является аналогом функции getKnownTDS(), позволяя узнать не минерализацию (TDS) калибровочной жидкости в ppm, а её приведённую удельную электропроводность (EC) в мСм/см.
- Отношение TDS к EC зависит от используемого датчиком коэффициента пересчёта Kp.
- По умолчанию, для 1 стадии калибровки, требуется жидкость 1.0 мСм/см.
- По умолчанию, для 2 стадии калибровки, требуется жидкость 3.0 мСм/см.
- Пример:
i = sensor.getKnownEC( 1 ); // Читаем приведённой электропроводности требуемой на 1 стадии калибровки. j = sensor.getKnownEC( 2 ); // Читаем приведённой электропроводности требуемой на 2 стадии калибровки. if( i<0 || j<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "1="+i+"мСм/см, 2="+j+"мСм/см." ); }
Функция setFluctuation();
- Назначение: Установка процента флуктуации электропроводности жидкостей.
- Синтаксис: setFluctuation( ТИП , ПРОЦЕНТ );
- Параметры:
- uint8_t ТИП - может принимать значение STABLE_S или UNSTABLE_S.
- float ПРОЦЕНТ - может принимать значения от 0,1 до 100,0 %.
- Возвращаемое значение: bool - результат записи значения (true или false).
- Примечание:
- Функция позволяет задать процент допустимой и высокой флуктуации.
- Первый параметр позволяет указать тип устанавливаемого процента:
- STABLE_S - задать процент допустимой флуктуации.
- UNSTABLE_S - задать процент высокой флуктуации.
- Второй параметр является устанавливаемым процентом.
- Если среднее значение электропроводности за последние 10 секунд не сместилось на процент допустимой флуктуации, то показания считаются стабильными.
При таких показаниях, функция getStability() возвращает true. - Если среднее значение электропроводности за последние 10 секунд сместилось на процент высокой флуктуации, то показания считаются не стабильными.
При таких показаниях, функция getStability() возвращает false. - Процент допустимой флуктуации должен быть ниже процента высокой флуктуации.
- Во время калибровки датчик проверяет нормализацию показаний электропроводности, значит меняя проценты флуктуаций можно ускорить или замедлить процесс калибровки.
- Указанные проценты сохраняются в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setFluctuation(STABLE_S , 0.5); // Показания будут считаться стабильными, если среднее значение электропроводности за последние 10 секунд не смещается более чем на ±0.5 %. sensor.setFluctuation(UNSTABLE_S, 1.0); // Показания будут считаться не стабильными, если среднее значение электропроводности за последние 10 секунд сместится более чем на ±1.0 %.
Функция getFluctuation();
- Назначение: Чтение установленных процентов флуктуации электропроводности.
- Синтаксис: getFluctuation( ТИП );
- Параметр: uint8_t ТИП - может принимать значение STABLE_S или UNSTABLE_S.
- Возвращаемое значение: float - процент флуктуации в %, или -1 при провале чтения.
- Примечание:
- Функция позволяет получить установленные пределы флуктуации электропроводности.
- Параметр позволяет указать тип читаемого процента флуктуаций.
- STABLE_S - получить процент допустимой флуктуации.
- UNSTABLE_S - получить процент высокой флуктуации.
- Если среднее значение электропроводности за последние 10 секунд не сместилось на процент допустимой флуктуации, то показания считаются стабильными.
При таких показаниях, функция getStability() возвращает true. - Если среднее значение электропроводности за последние 10 секунд сместилось на процент высокой флуктуации, то показания считаются не стабильными.
При таких показаниях, функция getStability() возвращает false. - По умолчанию, процент допустимой флуктуации электропроводности равен ±0.5 %.
- По умолчанию, процент высокой флуктуации электропроводности равен 1.0 %.
- Пример:
i = sensor.getFluctuation( STABLE_S ); // Читаем процент допустимой флуктуации электропроводности. j = sensor.getFluctuation( UNSTABLE_S ); // Читаем процент высокой флуктуации электропроводности.
Функция setKa();
- Назначение: Установка множителя степенной функции.
- Синтаксис: setKy( Ka );
- Параметры:
- float Ka - множитель степенной функции от 0,001 до 4'294'967,295.
- Возвращаемое значение:
- bool - результат применения нового множителя (true или false).
- Примечание:
- Значение по умолчанию 500,000.
- Степенная функция используется датчиком для вычисления электропроводности.
- Датчик самостоятельно определяет и сохраняет значение Ka в процессе калибровки.
- Множитель степенной функции сохраняется в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setKa( 501.234f ); // Корректируем значение множителя степенной функции.
Функция getKa();
- Назначение: Запрос множителя степенной функции.
- Синтаксис: getKa();
- Параметры: Нет.
- Возвращаемое значение: float - множитель (0,001...4'294'967,295), или -1 при провале чтения.
- Пример:
i = sensor.getKa(); // Читаем множитель степенной функции. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Ka = "+i+"." ); }
Функция setKb();
- Назначение: Установка модуля степени степенной функции.
- Синтаксис: setKb( Kb );
- Параметры:
- float Kb - модуль степени степенной функции от 0,001 до 65,535.
- Возвращаемое значение:
- bool - результат применения новой степени (true или false).
- Примечание:
- Значение по умолчанию 5,000.
- Степенная функция используется датчиком для вычисления электропроводности.
- Датчик самостоятельно определяет и сохраняет значение Kb в процессе калибровки.
- Значение степени степенной функции сохраняется в энергонезависимую память.
- Выполнение функции занимает более 50 миллисекунд.
- Пример:
sensor.setKb( 5.123f ); // Корректируем значение степени степенной функции.
Функция getKb();
- Назначение: Запрос модуля степени степенной функции.
- Синтаксис: getKb();
- Параметры: Нет.
- Возвращаемое значение: float - модуль степени (0,001...65,535), или -1 при провале чтения.
- Пример:
i = sensor.getKb(); // Читаем модуль степени степенной функции. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Kb = "+i+"." ); }
Функция setKp();
- Назначение: Установка коэффициента пересчёта.
- Синтаксис: setKp( Kp );
- Параметры:
- float Kp - коэффициент пересчёта от 0,01 до 655,35.
- Возвращаемое значение:
- bool - результат применения нового коэффициента пересчёта (true или false).
- Примечание:
- Значение по умолчанию 0,50.
- Чаще всего используют коэффициенты 0.50, 0.64, 0.70.
- Коэффициент пересчёта используется для получения TDS из EC.
- Пример:
sensor.setKp( 0.7f ); // Указываем новый коэффициент пересчёта.
Функция getKp();
- Назначение: Запрос используемого коэффициента пересчёта.
- Синтаксис: getKp();
- Параметры: Нет.
- Возвращаемое значение: float - коэффициент (0,01...655,35), или -1 при провале чтения.
- Пример:
i = sensor.getKp(); // Читаем используемый коэффициент пересчёта. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Kp = "+i+"." ); }
Функция setKt();
- Назначение: Установка температурного коэффициента жидкости.
- Синтаксис: setKt( Kt );
- Параметры:
- float Kt - температурный коэффициент жидкости от 0,0001 до 6,5535.
- Возвращаемое значение:
- bool - результат применения нового температурного коэффициента (true или false).
- Примечание:
- Значение по умолчанию 0,02.
- Значение зависит от химического состава жидкости и берётся из табличных данных.
- Температурный коэффициент жидкости используется для приведения S к значению EC.
- Пример:
sensor.setKt( 0.021f ); // Корректируем температурный коэффициент жидкости.
Функция getKt();
- Назначение: Запрос температурного коэффициента жидкости.
- Синтаксис: getKt();
- Параметры: Нет.
- Возвращаемое значение: float - коэффициент (0,0001...6,5535), или -1 при провале чтения.
- Пример:
i = sensor.getKt(); // Читаем температурный коэффициент жидкости. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Kt = "+i+"." ); }
Функция set_T();
- Назначение: Указание опорной температуры жидкости.
- Синтаксис: set_T( °C );
- Параметр: float °C - опорная температура жидкости.
- Возвращаемое значение: bool - результат отправки температуры (true или false).
- Примечание:
- Датчик приводит удельную электропроводность (S) измеренную при любой температуре (t), к опорной температуре (T), получая приведённую удельную электропроводность (EC).
- Опорная температура (T) выбирается такой, при которой приведённую электропроводность (EC) можно умножить на коэффициент пересчёта (Kp) для получения точного количества растворённых твёрдых веществ (TDS) в жидкости.
- По умолчанию, опорная температура жидкости равна 25°С.
- Пример:
sensor.set_T( 25.0f ); // Указываем опорную температуру для исследуемой жидкости 25,0°С.
Функция get_T();
- Назначение: Чтение опорной температуры жидкости.
- Синтаксис: get_T();
- Параметры: Нет.
- Возвращаемое значение: float - температура (0...100,00 °С), или -1 при провале чтения.
- Пример:
i = sensor.get_T(); // Читаем опорную температуру жидкости. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "T = "+i+" °C." ); }
Функция getVsens();
- Назначение: Чтение напряжения на входе щупа.
- Синтаксис: getVsens();
- Параметры: Нет.
- Возвращаемое значение: float напряжение (0...6,5535 В), или -1 при провале чтения.
- Примечание:
- На вход щупа подаётся переменное напряжение, по этому датчик считывает значение Vsens при положительной полуволне меандра.
- Датчик постоянно корректирует амплитуду Vsens. Чем выше сопротивление жидкости, тем больше амплитуда напряжения Vsens используемого для измерений.
- Допустимые значения: 0,5Vcc...0,6Vcc = 1,65...1,98 В.
- Пример:
i = sensor.getVsens(); // Читаем напряжение на входе щупа. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Vsens = "+i+" В." ); }
Функция getVo();
- Назначение: Чтение напряжения виртуального ноля на входе ОУ.
- Синтаксис: getVo();
- Параметры: Нет.
- Возвращаемое значение: float напряжение (0...6,5535 В), или -1 при провале чтения.
- Примечание:
- Напряжение виртуального ноля на входе операционного усилителя поддерживается датчиком на уровне 0,5Vcc = 0,5*3,3 = 1,65 В.
- Указанное напряжение равно потенциалу подаваемому на второй вход щупа, значит реальное напряжение между выводами щупа равно Vsens-Vo.
- Пример:
i = sensor.getVo(); // Читаем напряжение виртуального ноля на входе ОУ. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Vo = "+i+" В." ); }
Функция getVout();
- Назначение: Чтение напряжения на выходе операционного усилителя.
- Синтаксис: getVout();
- Параметры: Нет.
- Возвращаемое значение: float напряжение (0...6,5535 В), или -1 при провале чтения.
- Примечание: Напряжение на выходе ОУ используется для вычисления электропроводности.
- Пример:
i = sensor.getVout(); // Читаем напряжение на выходе операционного усилителя. if( i<0 ){ Serial.print("Err"); }else{ Serial.print( (String) "Vout = "+i+" В." ); }
Обработка ошибок:
Рассмотренные выше функции библиотеки iarduino_MB_TDS возвращают не только результат чтения, но и ошибки при записи или чтении. Причину ошибок можно выяснить функцией lastError() библиотеки iarduino_Modbus.
Функция lastError();
- Назначение: Получение кода причины последней ошибки.
- Синтаксис: lastError(); // Функция библиотеки iarduino_Modbus.
- Параметры: Нет.
- Возвращаемое значение: uint8_t - код причины последней ошибки.
- ERROR_ILLEGAL_FUNCTION - Команда запроса не поддерживается датчиком.
- ERROR_ILLEGAL_ADDRESS - У датчика отсутствует регистр с указанным адресом.
- ERROR_ILLEGAL_VALUE - Недопустимое значение в поле данных запроса.
- ERROR_DEVICE_FAILURE - Любая невосстановимая ошибка кроме первых трёх.
- ERROR_ACKNOWLEDGE - Датчик принял запрос, но на обработку требуется время.
- ERROR_DEVICE_BUSY - Ведомый занят, запрос проигнорирован.
- ERROR_MEMORY_PARITY - Ошибка чтения/записи файла.
- ERROR_GATEWAY_UNAVAILABLE - Шина перегружена данными или не настроена.
- ERROR_GATEWAY_NO_DEVICE - Ведомого устройства нет или от него нет ответа.
- ERROR_SYNTAX - Ошибка синтаксиса.
- ERROR_ADR_IARDUINO - Ошибка назначения или сортировки адресов устройств iarduino.
- ERROR_ADR_RESPONSE - Несовпадение адреса регистра в ответе.
- ERROR_VAL_RESPONSE - Несовпадение данных в ответе.
- ERROR_CRC_RESPONSE - Несовпадение CRC в принятом ответе.
- ERROR_LEN_REQUEST - Размер отправляемого запроса превышает размер буфера.
- ERROR_LEN_RESPONSE - Размер полученного ответа превышает размер буфера.
- Пример:
float i = sensor.getTDS(); // Читаем минерализацию исследуемой жидкости. if(i>=0){ // Если значение прочитано без ошибок... Serial.print("Минерализация "); // Serial.print( i ); // Выводим прочитанное значение. Serial.println(" ppm."); // }else{ // Если чтение выполнено с ошибкой... switch( modbus.lastError() ){ // Получаем код последней ошибки. case ERROR_ILLEGAL_FUNCTION: Serial.println( F("Датчик не поддерживает команду или функцию запроса") ); break; case ERROR_ILLEGAL_ADDRESS: Serial.println( F("Запрос содержит недопустимый адрес регистра") ); break; case ERROR_ILLEGAL_VALUE: Serial.println( F("Запрос содержит недопустимое значение в поле данных") ); break; case ERROR_DEVICE_FAILURE: Serial.println( F("Ошибка запроса не связана с командой, адресом или данными") ); break; case ERROR_ACKNOWLEDGE: Serial.println( F("Датчик сообщает что занят и обработает запрос позже") ); break; case ERROR_DEVICE_BUSY: Serial.println( F("Датчик сообщает что занят и не будет обрабатывать запрос") ); break; case ERROR_MEMORY_PARITY: Serial.println( F("Датчик сообщает что произошла ошибка чтения/записи файла") ); break; case ERROR_GATEWAY_UNAVAILABLE: Serial.println( F("Шлюз неправильно настроен или перегружен запросами") ); break; case ERROR_GATEWAY_NO_DEVICE: Serial.println( F("Датчик которому адресован запрос не отвечает") ); break; case ERROR_SYNTAX: Serial.println( F("Ошибка синтаксиса") ); break; case ERROR_ADR_IARDUINO: Serial.println( F("Ошибка назначения или сортировки адресов устройств iarduino") ); break; case ERROR_ADR_RESPONSE: Serial.println( F("Ответ от датчика содержит недопустимый адрес регистра") ); break; case ERROR_VAL_RESPONSE: Serial.println( F("Ответ от датчика содержит недопустимое значение в поле данных") ); break; case ERROR_CRC_RESPONSE: Serial.println( F("Несовпадение CRC в ответе датчика") ); break; case ERROR_LEN_REQUEST: Serial.println( F("Размер запроса к датчику превышает буфер обмена или ADU") ); break; case ERROR_LEN_RESPONSE: Serial.println( F("Размер ответа от датчика превышает буфер обмена") ); break; default: Serial.println( F("Неизвестная ошибка") ); break; } }
- Зная причину ошибки, можно принять меры к её устранению:
- ERROR_GATEWAY_NO_DEVICE - нет ответа от датчика, означает что устройство отсутствует на шине. Причиной данной ошибки может быть, как физическое отключение устройства, так и плохой контакт, или недостаточное питание.
- ERROR_SYNTAX - ошибка синтаксиса, означает наличие ошибки в коде, например функция вызвавшая данную ошибку была вызвана с некорректными параметрами, или вызвана до инициализации датчика.
Ссылки:
- Датчик минерализации (TDS/EC-метр) RS485 / Modbus с дисплеем.
- Датчик минерализации (TDS/EC-метр) RS485 / Modbus без дисплея.
- Trema конвертер UART-RS485.
- Wiki - Датчик минерализации (TDS/EC-метр) RS485 / Modbus - Datasheet.
- Wiki - Работа с протоколом Modbus RTU/ASCI по шине RS485.
- Библиотека iarduino_Modbus.
- Библиотека iarduino_MB_TDS.
- Wiki - Установка библиотек в Arduino IDE.
Обсуждение