Съдържание:

Как да си направим регистратор на данни за температурата, PH и разтворения кислород: 11 стъпки (със снимки)
Как да си направим регистратор на данни за температурата, PH и разтворения кислород: 11 стъпки (със снимки)

Видео: Как да си направим регистратор на данни за температурата, PH и разтворения кислород: 11 стъпки (със снимки)

Видео: Как да си направим регистратор на данни за температурата, PH и разтворения кислород: 11 стъпки (със снимки)
Видео: POE видеорегистратор ASECAM фиксация ЛИЦ определение ЧЕЛОВЕКА И АВТОМОБИЛЯ!!! 2024, Ноември
Anonim
Image
Image
Образ
Образ

Цели:

  • Направете регистратор на данни за ≤ $ 500. Той съхранява данни за температура, рН и DO с времева маркировка и използва I2C комуникация.
  • Защо I2C (интегрална схема)? Човек може да събере колкото се може повече сензори в един ред, като се има предвид, че всеки от тях има уникален адрес.

Етап 1:

Стъпка 2: Купете частите по -долу:

Купете частите по -долу
Купете частите по -долу
  1. Arduino MEGA 2560, $ 35,
  2. Захранващ адаптер за платка Arduino, $ 5,98,
  3. LCD модул I2C (дисплей), $ 8.99,
  4. Пробив на часовника в реално време (RTC), $ 7,5,
  5. Пробивна платка за MicroSD карта, $ 7,5,
  6. 4GB SD карта, $ 6.98,
  7. Водоустойчив цифров сензор DS18B20, $ 9.95,
  8. рН сонда + комплекти + стандартни буфери, $ 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 да бъде (5V)

Стъпка 4: Подгответе PH, DO вериги, SD карта

Подгответе PH, DO схеми, SD карта
Подгответе PH, DO схеми, SD карта
  1. Превключете към I2C за рН и DO вериги
  2. Пробивите на pH и DO се доставят със серийна комуникация като режим по подразбиране Предаване/Приемане (TX/RX). За да използвате режим I2C Clock line (SCL) и Data line (SDA), превключете режима чрез (1): изключете VCC, TX, RX кабелите, (2): скочете TX към земята за сонда, PGND (не GND), (3) включете VCC към веригата, (4): изчакайте LED да се промени от Зелено на Синьо. Повече подробности проверете на страница 39 (Информационен лист за рН верига,
  3. Направете същата стъпка с DO веригата
  4. (ако знаете как да качите примерния код на дъската, можете да го направите чрез сериен монитор)
  5. Форматирайте SD картата във формат FAT

Стъпка 5: Подгответе софтуера

Подгответе софтуер
Подгответе софтуер
Подгответе софтуер
Подгответе софтуер
Подгответе софтуер
Подгответе софтуер
Подгответе софтуер
Подгответе софтуер
  1. Изтеглете Arduino Integrated Development Environment (IDE),
  2. Инсталирайте библиотека в Arduino IDE:
  3. Повечето от тях идват със софтуер Arduino. LiquidCrystal_I2C.h е достъпен чрез GitHub
  4. Инсталирайте драйвера за USB. За оригиналния Arduino може да не се наложи да го инсталирате. За общ такъв трябва да инсталирате драйвер CH340 (GitHub:
  5. Проверете дали сте свързали правилно платката, като изпълните мигащ LED тест
  6. Как да намерите MAC адреса на цифровата температура 18B20. Използване на шаблон за скенер I2C в Arduino IDE с включена сонда. Всяко устройство има уникален MAC адрес, така че можете да използвате колкото се може повече температурни сонди с една споделена линия (#9). 18B20 използва едножичен I2C, така че е специален случай на I2C комуникационен метод. По -долу е един метод за намиране на MAC - Медицински контрол на достъпа („ROM“, когато изпълните процедурата по -долу).

Стъпка 6: Започнете кодирането

Стартирайте кодирането
Стартирайте кодирането
  • Копирайте поставете кода по -долу в Arduino IDE:
  • Или изтеглете кода (.ino) и трябва да се появи нов прозорец в Arduino IDE.

/*

Референтни уроци:

1. Температура, ORP, рН регистратор:

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

Този код ще извежда данни към серийния монитор на Arduino. Въведете команди в серийния монитор на Arduino, за да контролирате pH веригата на EZO в режим I2C.

Променено от посочените по-горе уроци, най-вече от I2C кода от Atlas-Scientific

Последна актуализация: 26 юли 2017 г. от Binh Nguyen

*/

#include // активирайте I2C.

#define pH_address 99 // I2C идентификационен номер по подразбиране за EZO pH верига.

#define DO_address 97 // I2C идентификационен номер по подразбиране за EZO DO Circuit.

#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, за да идентифицираме вашия експеримент, за exampe PBR_01_02, datalog1

long id = 1; // идентификационният номер за въвеждане на дневника

#включва

LiquidCrystal_I2C LCD (0x27, 20, 4);

#включва

#включва

#define ONE_WIRE_BUS 9 // дефинирайте щифта # за температурна сонда

OneWire oneWire (ONE_WIRE_BUS);

Даларски сензори за температура (& oneWire);

Сонда DeviceAddressP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC адрес, уникален за всяка сонда

Низ dataString; // основният вариант за съхраняване на всички данни

Низ dataString2; // временен вариант за съхраняване на Температура/pH/DO за разпечатване

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

байт получен_от_компютър = 0; // трябва да знаем колко знака са получени.

байт serial_event = 0; // флаг за сигнал, когато данните са получени от pc/mac/other.

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

char pH_data [20]; // правим 20 -байтов символен масив за съхраняване на входящи данни от рН веригата.

байт in_char = 0; // използва се като 1 -байтов буфер за съхраняване в свързани байтове от рН веригата.

байт i = 0; // брояч, използван за масив ph_data.

int време_ = 1800; // използва се за промяна на необходимото забавяне в зависимост от командата, изпратена до pH веригата на клас EZO.

поплавък pH_флоат; // float var, използван за поддържане на плаващата стойност на рН.

char DO_data [20];

// плаващ temp_C;

void setup () // хардуерна инициализация.

{

Serial.begin (9600); // разрешаване на сериен порт.

Wire.begin (рН_адрес); // разрешаване на 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 ("RUNNING");

Serial.print ("Часовник в реално време …");

ако (! rtc.isrunning ())

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

}

Serial.println ("РАБОТА");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("SD карта …"); // вижте дали картата е налична и може ли да се инициализира:

if (! SD.begin (chipSelect))

{Serial.println ("Неуспешно"); // не правете нищо повече:

връщане;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

lcd.println ("SD карта: OK");

Serial.print ("Лог файл:");

Serial.print (logFileName);

Serial.print ("…");

Файл logFile = SD.open (logFileName, FILE_WRITE); // отваряме файла. "datalog" и отпечатайте заглавката

if (logFile)

{

logFile.println (",,,"); // показва, че има данни в предишния цикъл

Заглавка на низ = "Дата -час, температура (C), рН, DO";

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

logFile.close ();

Serial.println ("ГОТОВ");

//Serial.println(dataString); // отпечатайте и на серийния порт:

}

else {Serial.println ("грешка при отваряне на база данни"); } // ако файлът не е отворен, изскача грешка:

lcd.setCursor (0, 2);

lcd.print ("Регистрационен файл:");

lcd.println (logFileName);

забавяне (1000);

sensors.begin ();

sensors.setResolution (ProbeP, 10); // 10 е разделителната способност (10 бита)

lcd.clear ();

id = 0;

}

void loop ()

{// основният цикъл.

dataString = Низ (id);

dataString = Низ (',');

DateTime сега = rtc.now ();

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

dataString += String ('/');

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

dataString += String ('/');

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

dataString += String ('');

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

dataString += String (':');

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

dataString += String (':');

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

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (рН_адрес); // извикваме веригата по нейния идентификационен номер

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)) // проверете дали char е използваем (за печат)

{

рН_данни = in_char; // зареждаме този байт в нашия масив.

i+= 1;

}

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

{

i = 0; // нулираме брояча i на 0.

Wire.endTransmission (); // прекратяване на предаването на данни I2C.

прекъсване; // излизане от цикъла while.

}

}

serial_event = 0; // нулира флага на серийното събитие.

dataString2 += ",";

dataString2 += Низ (pH_данни);

Wire.beginTransmission (DO_address); // извикваме веригата по нейния идентификационен номер

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; // зареждаме този байт в нашия масив

i+= 1; // поемаме брояча за елемента на масива

}

ако (in_char == 0)

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

i = 0; // нулираме брояча i на 0.

Wire.endTransmission (); // прекратяване на предаването на данни I2C.

прекъсване; // излизане от цикъла while.

}

}

serial_event = 0; // нулира флага на серийното събитие

pH_float = atof (pH_data);

dataString2 += ",";

dataString2 += Низ (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Температура/ рН/ DO");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

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

if (dataFile) // ако файлът е наличен, пишете му:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // отпечатайте и на серийния порт:

}

else {Serial.println ("грешка при отваряне на файл с данни"); } // ако файлът не е отворен, изскача грешка:

lcd.setCursor (0, 3);

lcd.print ("Тичане (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // увеличаване на един идентификатор при следваща итерация

dataString = "";

забавяне (300000); // забавяне 5 минути = 5*60*1000 ms

lcd.clear ();

} // край на главния цикъл

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print ("Температурна грешка");

else dataString2 = Низ (tempC);

} // кодът завършва тук

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

Стъпка 7: Резултати от окабеляването (може да се подобри) и LCD дисплея

Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
Резултати от окабеляването (може да се подобри) и LCD дисплея
  • Забележка: Срещнах шума от DO сондата до pH сондата след 2-3 месеца непрекъсната работа. Според Atlas Scientific се препоръчва вграден изолатор на напрежение, когато рН, сондите за проводимост работят заедно. Повече подробности са на страница 9 (https://goo.gl/d62Rqv)
  • Регистрираните данни (първият има неразпечатани знаци преди данните за pH и DO). Филтрирах към код, като разреших само печатни знаци.

Стъпка 8: Импортирайте данни и направете графика

Импортирайте данни и направете графика
Импортирайте данни и направете графика
Импортирайте данни и направете графика
Импортирайте данни и направете графика
Импортирайте данни и направете графика
Импортирайте данни и направете графика
  1. Импортиране на данни от раздела Text Under DATA (Excel 2013)
  2. Разделете данните със запетая (ето защо запетаите след всяко въвеждане на данни са полезни)
  3. Начертайте данните. Всички по -долу данни имат около 1700 точки. Интервалът на измерване е 5 минути (регулируем). Минимумът за DO и рН вериги за четене на данните е 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. Бях обучен по инженерство по околна среда, предимно по химия, малко по микробиология.

Препоръчано: