В данной статье мы рассмотрим как сделать свой собственный измеритель растворенного кислорода с помощью аналогового датчика растворенного кислорода от компании DfRobot и платы Arduino. Растворенный кислород относится к количеству свободного, не связанного кислорода, присутствующего в воде или других жидкостях. Это один из важнейших параметров при оценке качества воды из-за его влияния на организмы, живущие в водоеме. Слишком высокий или слишком низкий уровень растворенного кислорода (РК) может нанести вред водной флоре и фауне и повлиять на качество воды.
Поскольку измерение параметра качества воды является сложной задачей, измерение растворенного кислорода в воде также является непростой задачей. Вот почему измеритель растворенного кислорода (DO Meter), доступный на рынке, стоит очень дорого. В данной ситуации является актуальной задача изготовления своего собственного измерителя растворенного кислорода. Таким образом, гравитационный аналоговый датчик растворенного кислорода от DfRobot является одним из самых популярных и лучших датчиков растворенного кислорода, доступных на рынке. Комплект аналогового датчика растворенного кислорода от DfRobot совместим с Arduino, ESP8266, ESP32, микроконтроллерами STM32 и Raspberry Pi. Изделие используется для измерения растворенного кислорода в воде, чтобы отразить качество воды. Он широко применяется во многих приложениях по качеству воды, таких как аквакультура , мониторинг окружающей среды, естественные науки и т. д.
В этом проекте мы соединим гравитационный аналоговый датчик растворенного кислорода с платой Arduino и 0,96-дюймовым OLED-дисплеем. Сначала мы подготовим датчик DO (растворенного кислорода), заполнив его 0,5N раствором гидроксида натрия. Затем мы подготовим датчик к тестированию. После подготовки датчика мы запустим калибровочный код датчика растворенного кислорода на Arduino и откалибруем датчик. И, наконец, мы создадим собственный измеритель растворенного кислорода и отобразим значение растворенного кислорода на OLED-дисплее.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Датчик гравитационного растворенного кислорода (купить на AliExpress).
- Модуль OLED дисплея с диагональю 0.96 дюйма и интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Помимо этих электронных деталей вам может понадобиться раствор для заполнения, например, 0,5N раствор гидроксида натрия, а также мерная колба для измерения объема жидкости.
Растворенный кислород в воде
Что такое растворенный кислород?
Растворенный кислород относится к уровню свободного, не связанного кислорода, присутствующего в воде или любых других жидкостях. Не связанный кислород, или свободный кислород (O2) , — это кислород, который не связан ни с каким другим элементом. Растворенный кислород — это наличие свободных молекул O2 в воде. Связанная молекула кислорода в воде (H2O) находится в соединении и не учитывается в уровнях растворенного кислорода. Можно представить, что свободные молекулы кислорода растворяются в воде примерно так же, как соль или сахар при перемешивании.
Растворенный кислород попадает в воду через воздух или как побочный продукт фотосинтеза растений. Из воздуха кислород может медленно диффундировать по поверхности воды из окружающей атмосферы или быстро смешиваться с ней посредством аэрации. Растворенный кислород также вырабатывается как побочный продукт фотосинтеза из фитопланктона, водорослей, морских водорослей и других водных растений.
На уровень растворенного кислорода могут влиять различные природные факторы, некоторые из которых включают:
1. Водная жизнь (больше водной жизни = меньше РК ).
2. Уровни разложения (процессы разложения потребляют кислород, что приводит к меньшему уровню РК).
3. Тип водоема (текучие ручьи растворяют больше кислорода, чем стоячая вода).
4. Высота (большая высота = меньше РК).
Что такое измеритель растворенного кислорода?
Измеритель растворенного кислорода (измеритель DO - Dissolved Oxygen) измеряет количество растворенного кислорода в водном растворе. Измеритель растворенного кислорода бывает 3 различных типов и изготавливается с использованием следующих датчиков:
1. Гальванические датчики растворенного кислорода.
2. Полярографические датчики растворенного кислорода.
3. Оптические датчики растворенного кислорода.
Расчет растворенного кислорода
Растворенный кислород может быть выражен как концентрация на единицу объема или как процент. В водной среде насыщение кислородом представляет собой отношение концентрации растворенного кислорода (O2) к максимальному количеству кислорода, которое растворится в этом водоеме при температуре и давлении, которые составляют условия устойчивого равновесия.
Уровни концентрации растворенного кислорода могут быть выражены в миллиграммах на литр (мг/л) или частях на миллион (ppm). 1 мг/л равен 1 ppm. Насыщение растворенным кислородом выражается в процентах.
Гравитационный аналоговый датчик растворенного кислорода
Обзор датчика
Это набор датчиков Gravity Analog Dissolved Oxygen от компании DfRobot, который можно легко соединить с Arduino и любыми другими микроконтроллерами. Датчик используется для измерения растворенного кислорода в воде, чтобы можно было узнать качество воды. Он широко применяется во многих приложениях по качеству воды, таких как аквакультура, рыболовство, мониторинг окружающей среды, естественные науки и лабораторные приложения.
Датчик растворенного кислорода DfRobot имеет зонд гальванического типа. Зонду гальванического типа не требуется время поляризации, и он остается доступным в любое время. Рабочий механизм датчика растворенного кислорода гальванического типа поясняется ниже.
Плата преобразования сигнала имеет разъем BNC, который можно напрямую подключить к гальваническому зонду. Платы преобразователя сигнала в основном усиливают незначительную разницу напряжения до считываемого сигнала, который может быть обнаружен Arduino. Плата преобразователя сигнала подключается и работает и имеет хорошую совместимость.
Наконечник датчика закрыт мембранным колпачком, в который залит раствор. Кислородпроницаемая мембрана в мембранном колпачке чувствительна и хрупка. Будьте осторожны при обращении с ней. Следует избегать ногтей и других острых предметов. Ее можно легко интегрировать в любую систему контроля или обнаружения.
Характеристики датчика:
- Рабочее напряжение : 3,3~5,5 В.
- Выходное напряжение : аналоговое 0~3,0 В.
- Тип датчика: гальванический зонд.
- Диапазон обнаружения: 0~20 мг/л.
- Время отклика: до 98% полного отклика в течение 90 секунд (25℃).
Если вы хотите узнать больше о технических характеристиках и сроке службы датчика, вы можете посетить сайт производителя здесь:
Работа датчика растворенного кислорода
Гальванические датчики растворенного кислорода состоят из двух электродов: анода и катода. Оба этих электрода погружены в электролиты (внутри корпуса датчика). Кислородпроницаемая мембрана отделяет анод и катод от измеряемой воды.
Проницаемая мембрана позволяет кислороду из образца воды диффундировать в датчик, где он восстанавливается на катоде. Эта химическая реакция производит электрический сигнал, который проходит от катода к аноду, а затем в прибор для измерения растворенного кислорода. Потребление кислорода на катоде создает разницу давления на мембране, которая изменяется в зависимости от парциального давления кислорода в образце. Поэтому по мере увеличения концентрации кислорода парциальное давление и скорость диффузии также увеличиваются, и ток на прибор увеличивается пропорционально.
Приготовление раствора NaOH 0,5 моль/л
Перед тем, как зонд датчика растворенного кислорода заработает, вам необходимо подготовить зонд. Для подготовки зонда вам необходимо подготовить раствор NaOH 0,5 моль/л. Вам понадобятся кристаллы гидроксида натрия (NaOH). Кристаллы NaOH можно легко купить в любом химическом магазине.
Чтобы приготовить 0,5 М раствор NaOH, отмерьте 20 г гидроксида натрия и растворите его в 1000 мл воды.
При смешивании кристалла NaOH с водой раствор будет выделять тепло из-за химической реакции. Поэтому смешайте раствор и дайте ему раствориться и остыть в течение 30 минут .
Подготовка сенсорного зонда
Для нового зонда растворенного кислорода сначала следует добавить в мембранный колпачок раствор NaOH 0,5 моль/л в качестве заполняющего раствора. Для этого выполните следующие шаги.
Открутите мембранный колпачок от зонда и заполните примерно 2/3 объема колпачка раствором NaOH 0,5 моль/л. Убедитесь, что зонд находится в вертикальном положении по отношению к горизонтальной плоскости. Осторожно прикрутите колпачок обратно к зонду. Было бы неплохо, если бы немного раствора вылилось из колпачка, чтобы убедиться, что зонд полностью заполнен раствором NaOH.
При завинчивании крышки зонда зонд должен находиться в вертикальном положении по отношению к горизонтальной плоскости, чтобы избежать образования пузырьков в заполняющем растворе.
Если колпачок полностью заполнен раствором NaOH, при закручивании колпачка обратно к зонду будет вытекать слишком много раствора. Если заполнения раствора слишком мало, внутри колпачка могут образоваться пузырьки. В общем, лучше всего заполнять колпачок примерно на 2/3 объема. Небольшой перелив при закручивании колпачка обратно к зонду допустим.
Схема подключения датчика растворенного кислорода к Arduino
Принципиальная схема подключения датчика растворенного кислорода к плате Arduino представлена на следующем рисунке. Сначала подключите зонд к разъему BNC на плате преобразователя сигнала .
Датчик работает при напряжении от 3,3 В до 5 В. Поэтому подключите его вывод VCC к выводу 3,3 В платы Arduino. Подключите его вывод GND к контакту GND платы. Аналогично подключите выходной аналоговый вывод датчика к контакту A1 платы Arduino.
Калибровка датчика растворенного кислорода
Если вы используете датчик впервые или датчик используется в течение длительного времени, вам необходимо откалибровать датчик для обеспечения точности его работы.
Существует два метода калибровки датчика:
- Одноточечная калибровка: калибровка насыщенного растворенного кислорода только при фиксированной температуре, подходит для использования при стабильной температуре.
- Двухточечная калибровка: калибровка насыщенного растворенного кислорода при разных температурах, можно рассчитать температурную компенсацию, используемую при изменении температуры
Но я предпочитаю первый метод, т. е. калибровку по одной точке, так как это самый простой метод.
Код калибровки датчика растворенного кислорода Arduino
Скопируйте следующий код и загрузите его на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <Arduino.h> #define VREF 5000//VREF(mv) #define ADC_RES 1024//ADC Resolution uint32_t raw; void setup() { Serial.begin(115200); } void loop() { raw=analogRead(A1); Serial.println("raw:\t"+String(raw)+"\tVoltage(mv)"+String(raw*VREF/ADC_RES)); delay(1000); } |
Теперь выполните следующие шаги для калибровки зонда:
- Подготовьте зонд (объяснение выше).
- Смочите зонд чистой водой и стряхните лишние капли воды.
- Выставьте зонд на воздух и поддерживайте надлежащую циркуляцию воздуха (не используйте вентилятор для обдува).
- После того, как выходное напряжение стабилизируется, запишите напряжение, которое представляет собой напряжение насыщенного растворенного кислорода при текущей температуре.
Когда показания станут стабильными, запишите показания напряжения. Эти показания напряжения требуются в окончательном коде. Я выполнил калибровку при температуре 25 градусов Цельсия. Поэтому по умолчанию в коде назначено 25°C.
Если вы хотите узнать больше о методе калибровки датчика растворенного кислорода и воспользоваться другим способом калибровки, вы можете прочитать статью здесь - калибровка датчика растворенного кислорода.
При фиксированной температуре напряжение линейно связано с концентрацией растворенного кислорода . Насыщенный растворенный кислород сильно зависит от изменений температуры. Для повышения точности необходимо учитывать изменения растворенного кислорода и напряжения насыщения, вызванные изменениями температуры. В следующей таблице показано изменение его концентрации в зависимости от температуры.
Код Arduino для измерения растворенного кислорода
После того, как калибровочный коэффициент будет достигнут, вы сможете изготовить свой собственный измеритель растворенного кислорода.
Следующий код ниже можно загрузить на плату Arduino, чтобы создать свой собственный измеритель растворенного кислорода. Измените следующую строку в коде, например, температуру и напряжение калибровки. Калибровка выполняется при 25°C, и предпочтительно выполнять калибровку при этой температуре.
1 2 |
#define CAL1_V (131) //mv #define CAL1_T (25) //℃ |
Поскольку мы следуем методу калибровки по одной точке, мы определяем эту линию.
1 |
#define TWO_POINT_CALIBRATION 0 |
Если вы собираетесь выполнить калибровку по двум точкам, то вам нужно определить линию как
1 |
#define TWO_POINT_CALIBRATION 1 |
Также измените параметры напряжения и температуры в этих строках, если вы собираетесь выполнить калибровку по двум точкам.
1 2 3 4 |
#define CAL1_V (131) //mv #define CAL1_T (25) //℃ #define CAL2_V (1300) //mv #define CAL2_T (15) //℃ |
Вот полный окончательный код, вы можете загрузить его непосредственно на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#include <Arduino.h> #define DO_PIN A1 #define VREF 5000 //VREF (mv) #define ADC_RES 1024 //ADC Resolution //Single-point calibration Mode=0 //Two-point calibration Mode=1 #define TWO_POINT_CALIBRATION 0 #define READ_TEMP (25) //Current water temperature ℃, Or temperature sensor function //Single point calibration needs to be filled CAL1_V and CAL1_T #define CAL1_V (131) //mv #define CAL1_T (25) //℃ //Two-point calibration needs to be filled CAL2_V and CAL2_T //CAL1 High temperature point, CAL2 Low temperature point #define CAL2_V (1300) //mv #define CAL2_T (15) //℃ const uint16_t DO_Table[41] = { 14460, 14220, 13820, 13440, 13090, 12740, 12420, 12110, 11810, 11530, 11260, 11010, 10770, 10530, 10300, 10080, 9860, 9660, 9460, 9270, 9080, 8900, 8730, 8570, 8410, 8250, 8110, 7960, 7820, 7690, 7560, 7430, 7300, 7180, 7070, 6950, 6840, 6730, 6630, 6530, 6410}; uint8_t Temperaturet; uint16_t ADC_Raw; uint16_t ADC_Voltage; uint16_t DO; int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c) { #if TWO_POINT_CALIBRATION == 00 uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35; return (voltage_mv * DO_Table[temperature_c] / V_saturation); #else uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V; return (voltage_mv * DO_Table[temperature_c] / V_saturation); #endif } void setup() { Serial.begin(115200); } void loop() { Temperaturet = (uint8_t)READ_TEMP; ADC_Raw = analogRead(DO_PIN); ADC_Voltage = uint32_t(VREF) * ADC_Raw / ADC_RES; Serial.print("Temperaturet:\t" + String(Temperaturet) + "\t"); Serial.print("ADC RAW:\t" + String(ADC_Raw) + "\t"); Serial.print("ADC Voltage:\t" + String(ADC_Voltage) + "\t"); Serial.println("DO:\t" + String(readDO(ADC_Voltage, Temperaturet)) + "\t"); delay(1000); } |
После загрузки кода вы можете открыть окно монитора последовательной связи и увидеть в нем следующее зарегистрированное значение.
Измеритель растворенного кислорода своими руками
Теперь, если вы хотите сделать свой собственный измеритель растворенного кислорода, вы можете добавить дисплей к плате. 0,96″ I2C OLED дисплей является лучшим дисплеем для этого приложения, поскольку он имеет 4-контактный интерфейс I2C и простой код. Схема подключения с OLED дисплеем приведена на следующем рисунке.
Теперь скопируйте следующий код и загрузите его на плату Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#include <Arduino.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define DO_PIN A1 #define VREF 5000 //VREF (mv) #define ADC_RES 1024 //ADC Resolution //Single-point calibration Mode=0 //Two-point calibration Mode=1 #define TWO_POINT_CALIBRATION 0 #define READ_TEMP (25) //Current water temperature ℃, Or temperature sensor function //Single point calibration needs to be filled CAL1_V and CAL1_T #define CAL1_V (131) //mv #define CAL1_T (25) //℃ //Two-point calibration needs to be filled CAL2_V and CAL2_T //CAL1 High temperature point, CAL2 Low temperature point #define CAL2_V (1300) //mv #define CAL2_T (15) //℃ const uint16_t DO_Table[41] = { 14460, 14220, 13820, 13440, 13090, 12740, 12420, 12110, 11810, 11530, 11260, 11010, 10770, 10530, 10300, 10080, 9860, 9660, 9460, 9270, 9080, 8900, 8730, 8570, 8410, 8250, 8110, 7960, 7820, 7690, 7560, 7430, 7300, 7180, 7070, 6950, 6840, 6730, 6630, 6530, 6410 }; uint8_t Temperaturet; uint16_t ADC_Raw; uint16_t ADC_Voltage; uint16_t DO; int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c) { #if TWO_POINT_CALIBRATION == 00 uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35; return (voltage_mv * DO_Table[temperature_c] / V_saturation); #else uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V; return (voltage_mv * DO_Table[temperature_c] / V_saturation); #endif } void setup() { Serial.begin(115200); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64) display.clearDisplay(); delay(10); } void loop() { Temperaturet = (uint8_t)READ_TEMP; ADC_Raw = analogRead(DO_PIN); ADC_Voltage = uint32_t(VREF) * ADC_Raw / ADC_RES; Serial.print("Temperaturet:\t" + String(Temperaturet) + "\t"); Serial.print("ADC RAW:\t" + String(ADC_Raw) + "\t"); Serial.print("ADC Voltage:\t" + String(ADC_Voltage) + "\t"); Serial.println("DO:\t" + String(readDO(ADC_Voltage, Temperaturet)) + "\t"); display.clearDisplay(); display.setCursor(10, 0); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Dissolved Oxygen"); display.setCursor(30, 20); //oled display display.setTextSize(2); display.setTextColor(WHITE); display.print((readDO(ADC_Voltage, Temperaturet))/1000); display.setTextSize(1); display.print(" mg/L"); display.display(); delay(1000); } |
Теперь, если вы хотите проверить датчик, вы можете окунуть зонд в воду и начать проверять показания.
Если вы хотите сделать воду с нулевым содержанием растворенного кислорода, вы можете добавить в воду сульфит натрия (Na2SO3) до насыщения. Это может израсходовать весь кислород в воде, чтобы получить жидкость с нулевым содержанием растворенного кислорода .
Значение растворенного кислорода может отличаться в зависимости от таких параметров, как водная жизнь, высота, соленость, температура, турбулентность и растительность . Для измерения качества воды вы также можете измерить pH, мутность, TDS и температуру воды. Вы можете добавить датчик pH, датчик мутности и TDS датчик к этой схеме.