Оглавление:
- Шаг 1:
- Шаг 2: Купите детали ниже:
- Шаг 3: Подключение
- Шаг 4: Подготовьте PH, схемы DO, SD-карту
- Шаг 5: Подготовьте программное обеспечение
- Шаг 6. Начните кодирование
- Шаг 7. Результаты подключения (можно улучшить) и ЖК-дисплея
- Шаг 8: Импортируйте данные и создайте график
- Шаг 9: Калибровка
- Шаг 10: слишком много проводов?
- Шаг 11: Подтверждение:
Видео: Как сделать регистратор данных температуры, pH и растворенного кислорода: 11 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
Цели:
- Сделайте регистратор данных за ≤ 500 долларов. Он хранит данные о температуре, pH и DO с отметкой времени и с использованием связи I2C.
- Почему I2C (межинтегральная схема)? В одной строке можно разместить столько датчиков, сколько у каждого из них уникальный адрес.
Шаг 1:
Шаг 2: Купите детали ниже:
- Arduino MEGA 2560, 35 долларов США,
- Адаптер питания для платы Arduino, $ 5,98,
- ЖК-модуль I2C (дисплей), 8,99 $,
- Часы реального времени (RTC), $ 7,5,
- Коммутационная плата для карт MicroSD, $ 7,5,
- SD-карта 4 ГБ, $ 6,98,
- Водонепроницаемый цифровой датчик DS18B20, $ 9,95,
- pH-зонд + наборы + стандартные буферы, 149,15 долл. США,
- Зонд DO + наборы + стандартные буферы, 247,45 долл. США,
- Макетная плата, соединительный кабель, $ 7,98,
- (Необязательно) Изолятор напряжения, 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-карту
- Переключитесь на I2C для цепей pH и DO
- Контакты pH и DO поставляются с последовательной связью в качестве режима передачи / приема по умолчанию (TX / RX). Чтобы использовать линию синхронизации (SCL) в режиме I2C и линию передачи данных (SDA), переключите режим (1): отсоедините кабели VCC, TX, RX, (2): переместите TX на землю для датчика, PGND (не GND).), (3) подключите VCC к цепи, (4): подождите, пока светодиод не изменит цвет с зеленого на синий. Более подробную информацию см. На стр. 39 (Техническое описание контура pH,
- Проделайте то же самое со схемой DO.
- (если вы знаете, как загрузить образец кода на плату, вы можете сделать это через последовательный монитор)
- Отформатируйте SD-карту в формат FAT
Шаг 5: Подготовьте программное обеспечение
- Загрузите интегрированную среду разработки Arduino (IDE),
- Установите библиотеку в Arduino IDE:
- Большинство из них поставляются с программным обеспечением Arduino. LiquidCrystal_I2C.h доступен через GitHub
- Установите драйвер для USB. Для подлинной Arduino вам может не потребоваться ее установка. Для общего вам необходимо установить драйвер CH340 (GitHub:
- Проверьте, правильно ли вы подключили плату, запустив тест с миганием светодиода.
- Как найти 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: Импортируйте данные и создайте график
- Импортировать данные из текста на вкладке ДАННЫЕ (Excel 2013)
- Разделите данные запятыми (поэтому полезно иметь запятые после каждого ввода данных)
- Постройте данные. Каждые данные ниже имеют около 1700 точек. Интервал измерения 5 минут (регулируется). Минимальное время для считывания данных контурами DO и pH составляет 1,8 секунды.
Шаг 9: Калибровка
- Цифровой датчик температуры (18B20) можно откалибровать, установив разницу непосредственно на. В противном случае, если для компенсации и крутизны требуется калибровка, вы можете сделать это, изменив значения в строке № 453, DallasTemperature.cpp в папке / libraries / DallasTemperature.
- Для датчиков pH и DO вы можете откалибровать датчики с соответствующими растворами. Вы должны использовать образец кода от Atlas Scientific и следовать инструкциям в этом файле.
- Просмотрите страницы 26 и 50 для датчика pH (https://goo.gl/d62Rqv) для калибровки и температурной компенсации, а также страницы 7-8 и 50 для датчика DO (https://goo.gl/mA32mp). Во-первых, повторно загрузите общий код, предоставленный Atlas, откройте Serial Monitor и введите правильную команду.
Шаг 10: слишком много проводов?
- Вы можете удалить SD-карту и модуль часов реального времени, используя Dragino Yun Shield для плат Arduino (https://goo.gl/J9PBTH). Код нужно было изменить для работы с Yun Shield. Вот хорошее место для начала (https://goo.gl/c1x8Dm)
- По-прежнему слишком много проводки: 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. Я обучался экологической инженерии, в основном химии, немного микробиологии.
Рекомендуемые:
КАЛИБРОВКА ДАТЧИКА РАСТВОРЕННОГО КИСЛОРОДА ARDUINO: 4 шага
КАЛИБРОВКА ДАТЧИКА РАСТВОРЕННОГО КИСЛОРОДА ARDUINO: В этом руководстве мы будем калибровать датчик растворенного кислорода (D.O) Atlas Scientific с помощью Arduino Uno. ТЕОРИЯ КАЛИБРОВКИ Самая важная часть калибровки - это наблюдение за показаниями во время процесса калибровки. Калибровать проще всего
Регистратор данных GPS Cap: 7 шагов (с изображениями)
GPS Cap Data Logger: это отличный проект выходного дня, если вы занимаетесь треккингом или длительными велосипедными прогулками и вам нужен регистратор данных GPS, чтобы отслеживать все ваши походы / поездки, которые вы совершили … После того, как вы завершили сборку и скачал данные с GPS-модуля тр
Как сделать регистратор данных влажности и температуры в реальном времени с Arduino UNO и SD-картой - Моделирование регистратора данных DHT11 в Proteus: 5 шагов
Как сделать регистратор данных влажности и температуры в реальном времени с Arduino UNO и SD-картой | Моделирование регистратора данных DHT11 в Proteus: Введение: привет, это Liono Maker, вот ссылка на YouTube. Мы делаем творческий проект с Arduino и работаем над встраиваемыми системами. Регистратор данных: Регистратор данных (также регистратор данных или регистратор данных) - это электронное устройство, которое записывает данные с течением времени
Регистратор данных GPS DIY для вас, следующая поездка / пешеходная тропа: 11 шагов (с изображениями)
Самодельный регистратор данных GPS для вас. Следующая поездка / пешеходная тропа: это регистратор данных GPS, который вы можете использовать для нескольких целей, скажем, если вы хотите записать свою долгую поездку, которую вы совершили на выходных, чтобы проверить цвета осени. или у вас есть любимая тропа, которую вы посещаете осенью каждый год, и вы
Регистратор данных температуры и влажности с Arduino на телефон Android с модулем SD-карты через Bluetooth: 5 шагов
Регистратор данных температуры и влажности с Arduino на телефон Android с модулем SD-карты через Bluetooth: Привет всем, это моя первая инструкция, надеюсь, я помогу сообществу производителей, так как она мне очень понравилась. Часто мы используем датчики в наших проектах, но находим способ собирать данные, хранить их и немедленно передавать на телефоны или другие устройства