Оглавление:

Как сделать регистратор данных температуры, pH и растворенного кислорода: 11 шагов (с изображениями)
Как сделать регистратор данных температуры, pH и растворенного кислорода: 11 шагов (с изображениями)

Видео: Как сделать регистратор данных температуры, pH и растворенного кислорода: 11 шагов (с изображениями)

Видео: Как сделать регистратор данных температуры, pH и растворенного кислорода: 11 шагов (с изображениями)
Видео: Измеритель растворенного кислорода AMT08 или оксиметр AMT08  2024, Ноябрь
Anonim
Image
Image
Изображение
Изображение

Цели:

  • Сделайте регистратор данных за ≤ 500 долларов. Он хранит данные о температуре, pH и DO с отметкой времени и с использованием связи I2C.
  • Почему I2C (межинтегральная схема)? В одной строке можно разместить столько датчиков, сколько у каждого из них уникальный адрес.

Шаг 1:

Шаг 2: Купите детали ниже:

Купите детали ниже
Купите детали ниже
  1. Arduino MEGA 2560, 35 долларов США,
  2. Адаптер питания для платы Arduino, $ 5,98,
  3. ЖК-модуль I2C (дисплей), 8,99 $,
  4. Часы реального времени (RTC), $ 7,5,
  5. Коммутационная плата для карт MicroSD, $ 7,5,
  6. SD-карта 4 ГБ, $ 6,98,
  7. Водонепроницаемый цифровой датчик DS18B20, $ 9,95,
  8. pH-зонд + наборы + стандартные буферы, 149,15 долл. США,
  9. Зонд DO + наборы + стандартные буферы, 247,45 долл. США,
  10. Макетная плата, соединительный кабель, $ 7,98,
  11. (Необязательно) Изолятор напряжения, 24 доллара США,

Итого: 510,48 $

* Некоторые детали (например, стандартная плата) можно было купить у других поставщиков (eBay, китайский продавец) по более низкой цене. Датчики pH и DO рекомендуется получить в Atlas Scientific.

* Для проверки проводимости и напряжения рекомендуется использовать мультиметр. Стоит около 10-15 долларов (https://goo.gl/iAMDJo)

Шаг 3: Подключение

Проводка
Проводка
  • Используйте перемычки / кабели DuPont для соединения деталей, как показано на рисунке ниже.
  • Используйте мультиметр, чтобы проверить проводимость.
  • Проверьте источник положительного напряжения (VCC) и землю (GND) (это легко перепутать, если вы не знакомы с схемой)
  • Подключите адаптер питания и проверьте индикатор питания в каждой части. В случае сомнений используйте мультиметр, чтобы проверить, что напряжение между VCC и GND должно быть (5 В).

Шаг 4: Подготовьте PH, схемы DO, SD-карту

Подготовьте PH, схемы DO, SD-карту
Подготовьте PH, схемы DO, SD-карту
  1. Переключитесь на I2C для цепей pH и DO
  2. Контакты pH и DO поставляются с последовательной связью в качестве режима передачи / приема по умолчанию (TX / RX). Чтобы использовать линию синхронизации (SCL) в режиме I2C и линию передачи данных (SDA), переключите режим (1): отсоедините кабели VCC, TX, RX, (2): переместите TX на землю для датчика, PGND (не GND).), (3) подключите VCC к цепи, (4): подождите, пока светодиод не изменит цвет с зеленого на синий. Более подробную информацию см. На стр. 39 (Техническое описание контура pH,
  3. Проделайте то же самое со схемой DO.
  4. (если вы знаете, как загрузить образец кода на плату, вы можете сделать это через последовательный монитор)
  5. Отформатируйте SD-карту в формат FAT

Шаг 5: Подготовьте программное обеспечение

Подготовить программное обеспечение
Подготовить программное обеспечение
Подготовить программное обеспечение
Подготовить программное обеспечение
Подготовить программное обеспечение
Подготовить программное обеспечение
Подготовить программное обеспечение
Подготовить программное обеспечение
  1. Загрузите интегрированную среду разработки Arduino (IDE),
  2. Установите библиотеку в Arduino IDE:
  3. Большинство из них поставляются с программным обеспечением Arduino. LiquidCrystal_I2C.h доступен через GitHub
  4. Установите драйвер для USB. Для подлинной Arduino вам может не потребоваться ее установка. Для общего вам необходимо установить драйвер CH340 (GitHub:
  5. Проверьте, правильно ли вы подключили плату, запустив тест с миганием светодиода.
  6. Как найти MAC-адрес цифровой температуры 18B20. Использование шаблона сканера I2C в Arduino IDE с подключенным датчиком. Каждое устройство имеет уникальный MAC-адрес, поэтому вы можете использовать столько датчиков температуры с одной общей линией (№9). 18B20 использует однопроводной I2C, поэтому это частный случай метода связи I2C. Ниже приведен один из способов найти MAC - Управление медицинским доступом («ПЗУ» при выполнении описанной ниже процедуры).

Шаг 6. Начните кодирование

Начать кодирование
Начать кодирование
  • Скопируйте и вставьте приведенный ниже код в Arduino IDE:
  • Или загрузите код (.ino), и в Arduino IDE должно появиться новое окно.

/*

Справочные руководства:

1. Регистратор температуры, ОВП, pH:

2. Защищенный цифровой (SD) щит:

Этот код будет выводить данные на последовательный монитор Arduino. Введите команды в последовательный монитор Arduino для управления цепью pH EZO в режиме I2C.

Изменено из упомянутых выше руководств, в основном из кода I2C от Atlas-Scientific

Последнее обновление: 26 июля 2017 г., автор: Бинь Нгуен

*/

#include // включить I2C.

#define pH_address 99 // Идентификационный номер I2C по умолчанию для контура EZO pH.

#define DO_address 97 // Идентификационный номер I2C по умолчанию для цепи EZO DO.

#include "RTClib.h" // Функции даты и времени с использованием DS1307 RTC, подключенного через I2C и Wire lib

RTC_DS1307 rtc;

#include // Для библиотеки SD

#include // SD-карта для хранения данных

const int chipSelect = 53; // необходимо выяснить, что такое прорыв Adafruit SD //

// DO = MISO, DI = MOSI, на выводе ATmega №: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)

char logFileName = "dataLT.txt"; // изменяем logFileName, чтобы идентифицировать ваш эксперимент, например PBR_01_02, datalog1

длинный id = 1; // номер идентификатора для входа в порядок журнала

#включают

LiquidCrystal_I2C lcd (0x27, 20, 4);

#включают

#включают

#define ONE_WIRE_BUS 9 // определить контакт # для датчика температуры

OneWire oneWire (ONE_WIRE_BUS);

Датчики температуры Даллас (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC-адрес, уникальный для каждого зонда

String dataString; // основной вариант для хранения всех данных

String dataString2; // временный вариант для хранения температуры / pH / DO для распечатки

char computerdata [20]; // инструкция от Atlas Scientific: мы создаем 20-байтовый символьный массив для хранения входящих данных от pc / mac / other.

полученный байт_from_computer = 0; // нам нужно знать, сколько символов было получено.

byte serial_event = 0; // флаг, сигнализирующий о получении данных от pc / mac / other.

байтовый код = 0; // используется для хранения кода ответа I2C.

char pH_data [20]; // мы создаем массив символов из 20 байтов для хранения входящих данных от цепи pH.

байт in_char = 0; // используется как 1-байтовый буфер для хранения связанных байтов из схемы pH.

байт i = 0; // счетчик, используемый для массива ph_data.

int time_ = 1800; // используется для изменения необходимой задержки в зависимости от команды, отправленной в контур pH класса EZO.

float pH_float; // float var используется для хранения плавающего значения pH.

char DO_data [20];

// поплавок temp_C;

void setup () // инициализация оборудования.

{

Serial.begin (9600); // включить последовательный порт.

Wire.begin (pH_адрес); // включить порт I2C для датчика pH

Wire.begin (DO_address);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print («Привет, PBR!»);

lcd.setCursor (0, 1);

lcd.print («Инициализация…»);

Serial.print («RTC - это…»);

если (! rtc.begin ())

{

Serial.println («RTC: часы реального времени… НЕ НАЙДЕНЫ»);

while (1); // (Serial.println ("RTC: часы реального времени… НАЙДЕНО"));

}

Serial.println («РАБОТАЕТ»);

Serial.print («Часы реального времени…»);

если (! rtc.isrunning ())

{rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));

}

Serial.println («РАБОТАЕТ»);

lcd.setCursor (0, 0);

lcd.println («RTC: OK»);

Serial.print («SD-карта…»); // посмотрим, присутствует ли карта и может ли она быть инициализирована:

если (! SD.begin (chipSelect))

{Serial.println ("Ошибка"); // больше ничего не делаем:

возвращение;

}

Serial.println («ОК»);

lcd.setCursor (0, 1);

lcd.println ("SD-карта: ОК");

Serial.print ("Файл журнала:");

Serial.print (имя_файла);

Serial.print («…»);

Файл logFile = SD.open (logFileName, FILE_WRITE); // открываем файл. "журнал данных" и распечатать заголовок

если (файл журнала)

{

logFile.println (",,,"); // указываем, что в предыдущем прогоне были данные

Заголовок строки = "Дата-время, температура (C), pH, DO";

logFile.println (заголовок);

logFile.close ();

Serial.println («ГОТОВ»);

//Serial.println(dataString); // печать и в последовательный порт:

}

else {Serial.println ("ошибка открытия журнала данных"); } // если файл не открыт, выдается сообщение об ошибке:

lcd.setCursor (0, 2);

lcd.print ("Файл журнала:");

lcd.println (имя файла журнала);

задержка (1000);

sensor.begin ();

sensor.setResolution (ProbeP, 10); // 10 - разрешение (10 бит)

lcd.clear ();

id = 0;

}

пустой цикл ()

{// основной цикл.

dataString = String (id);

dataString = String (',');

DateTime now = rtc.now ();

dataString = String (now.year (), DEC);

dataString + = строка ('/');

dataString + = String (now.month (), DEC);

dataString + = строка ('/');

dataString + = String (now.day (), DEC);

dataString + = строка ('');

dataString + = String (now.hour (), DEC);

dataString + = Строка (':');

dataString + = String (now.minute (), DEC);

dataString + = Строка (':');

dataString + = String (now.second (), DEC);

lcd.home ();

lcd.print (строка данных);

sensor.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_адрес); // вызываем схему по ее ID номеру

Wire.write ('r'); // жесткий код r для непрерывного чтения

Wire.endTransmission (); // завершаем передачу данных I2C.

время задержки_); // ожидаем правильное количество времени, пока схема завершит свою инструкцию.

Wire.requestFrom (pH_адрес, 20, 1); // вызываем схему и запрашиваем 20 байт (это может быть больше, чем нам нужно)

while (Wire.available ()) // есть ли байты для приема

{

in_char = Wire.read (); // получаем байт.

if ((in_char> 31) && (in_char <127)) // проверяем, можно ли использовать символ (можно распечатать)

{

pH_data = in_char; // загружаем этот байт в наш массив.

я + = 1;

}

if (in_char == 0) // если мы видим, что нам отправили нулевую команду.

{

я = 0; // сбрасываем счетчик i в 0.

Wire.endTransmission (); // завершаем передачу данных I2C.

перерыв; // выход из цикла while.

}

}

serial_event = 0; // сбросить флаг серийного события.

dataString2 + = ",";

dataString2 + = String (pH_data);

Wire.beginTransmission (DO_address); // вызываем схему по ее ID номеру

Wire.write ('r');

Wire.endTransmission (); // завершаем передачу данных I2C

время задержки_); // ожидаем правильное количество времени, пока схема завершит свою инструкцию

Wire.requestFrom (DO_address, 20, 1); // вызываем схему и запрашиваем 20 байт

while (Wire.available ()) // есть ли байты для приема.

{

in_char = Wire.read (); // получаем байт.

if ((in_char> 31) && (in_char <127)) // проверяем, можно ли использовать char (распечатать), иначе in_char содержит символ в начале в файле.txt

{DO_data = in_char; // загружаем этот байт в наш массив

я + = 1; // снимаем счетчик для элемента массива

}

если (in_char == 0)

{// если мы видим, что нам отправили нулевую команду

я = 0; // сбрасываем счетчик i в 0.

Wire.endTransmission (); // завершаем передачу данных I2C.

перерыв; // выход из цикла while.

}

}

serial_event = 0; // сбрасываем флаг серийного события

pH_float = atof (pH_data);

dataString2 + = ",";

dataString2 + = String (DO_data);

lcd.setCursor (0, 1);

lcd.print («Температура / pH / DO»);

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString + = ',';

dataString + = dataString2;

Файл dataFile = SD.open (logFileName, FILE_WRITE); // открываем файл. обратите внимание, что одновременно может быть открыт только один файл, поэтому вам нужно закрыть этот, прежде чем открывать другой.

if (dataFile) // если файл доступен, пишем в него:

{

dataFile.println (строка данных);

dataFile.close ();

Serial.println (строка данных); // печать и в последовательный порт:

}

else {Serial.println ("ошибка открытия файла журнала данных"); } // если файл не открыт, выдается сообщение об ошибке:

lcd.setCursor (0, 3);

lcd.print ("Бег (x5м):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // увеличиваем один ID на следующей итерации

dataString = "";

задержка (300000); // задержка 5 минут = 5 * 60 * 1000 мс

lcd.clear ();

} // завершаем основной цикл

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sizes.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print ("Ошибка температуры");

иначе dataString2 = String (tempC);

} // здесь заканчивается код

  • Выберите правильный COM-порт через Arduino IDE в разделе Инструменты / Порт.
  • Выберите подходящую плату Arduino. Я использовал Mega 2560, потому что у него больше внутренней памяти. Arduino Nano или Uno отлично работают с этой настройкой.
  • Проверьте, закодируйте и загрузите код

Шаг 7. Результаты подключения (можно улучшить) и ЖК-дисплея

Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
Результаты по подключению (можно улучшить) и ЖК-дисплею
  • Примечание: я столкнулся с шумом от датчика DO к датчику pH после 2-3 месяцев непрерывной работы. Согласно Atlas Scientific, при совместной работе датчиков pH и проводимости рекомендуется использовать линейный изолятор напряжения. Более подробная информация на странице 9 (https://goo.gl/d62Rqv).
  • Зарегистрированные данные (в первом из них не напечатаны символы перед данными pH и DO). Я отфильтровал код, разрешив только печатные символы.

Шаг 8: Импортируйте данные и создайте график

Импортировать данные и построить график
Импортировать данные и построить график
Импортировать данные и построить график
Импортировать данные и построить график
Импортировать данные и построить график
Импортировать данные и построить график
  1. Импортировать данные из текста на вкладке ДАННЫЕ (Excel 2013)
  2. Разделите данные запятыми (поэтому полезно иметь запятые после каждого ввода данных)
  3. Постройте данные. Каждые данные ниже имеют около 1700 точек. Интервал измерения 5 минут (регулируется). Минимальное время для считывания данных контурами DO и pH составляет 1,8 секунды.

Шаг 9: Калибровка

Калибровка
Калибровка
  1. Цифровой датчик температуры (18B20) можно откалибровать, установив разницу непосредственно на. В противном случае, если для компенсации и крутизны требуется калибровка, вы можете сделать это, изменив значения в строке № 453, DallasTemperature.cpp в папке / libraries / DallasTemperature.
  2. Для датчиков pH и DO вы можете откалибровать датчики с соответствующими растворами. Вы должны использовать образец кода от Atlas Scientific и следовать инструкциям в этом файле.
  3. Просмотрите страницы 26 и 50 для датчика pH (https://goo.gl/d62Rqv) для калибровки и температурной компенсации, а также страницы 7-8 и 50 для датчика DO (https://goo.gl/mA32mp). Во-первых, повторно загрузите общий код, предоставленный Atlas, откройте Serial Monitor и введите правильную команду.

Шаг 10: слишком много проводов?

  1. Вы можете удалить SD-карту и модуль часов реального времени, используя Dragino Yun Shield для плат Arduino (https://goo.gl/J9PBTH). Код нужно было изменить для работы с Yun Shield. Вот хорошее место для начала (https://goo.gl/c1x8Dm)
  2. По-прежнему слишком много проводки: Atlas Scientific разработала руководство для своих схем EZO (https://goo.gl/dGyb12) и беспаечной платы (https://goo.gl/uWF51n). Интегрированная цифровая температура 18B20 находится здесь (https://goo.gl/ATcnGd). Вы должны быть знакомы с командами Raspbian (версия Debian Linux), работающими на Raspberry Pi (https://goo.gl/549xvk)

Шаг 11: Подтверждение:

Это мой побочный проект во время моего постдокторского исследования, в котором я работал над передовым фотобиореактором для выращивания микроводорослей. Поэтому я подумал, что необходимо отдать должное сторонам, которые предоставили условия, чтобы это произошло. Во-первых, это грант DE-EE0007093: «Обогащение и доставка атмосферного CO2 (ACED)» Министерства энергетики США, Управление энергоэффективности и целевого использования возобновляемых источников энергии для биотоплива и биопродуктов из водорослей. Я благодарю доктора Брюса Э. Риттмана из Центра экологической биотехнологии Biodesign Swette Университета штата Аризона за предоставленную мне возможность поработать с электроникой и Arduino. Я обучался экологической инженерии, в основном химии, немного микробиологии.

Рекомендуемые: