Мазмұны:

Температура, PH және еріген оттегі бойынша деректерді тіркеушіні қалай жасауға болады: 11 қадам (суреттермен)
Температура, PH және еріген оттегі бойынша деректерді тіркеушіні қалай жасауға болады: 11 қадам (суреттермен)

Бейне: Температура, PH және еріген оттегі бойынша деректерді тіркеушіні қалай жасауға болады: 11 қадам (суреттермен)

Бейне: Температура, PH және еріген оттегі бойынша деректерді тіркеушіні қалай жасауға болады: 11 қадам (суреттермен)
Бейне: 03122014 Еру және ерітінді 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. 4 ГБ SD картасы, $ 6.98,
  7. Су өткізбейтін DS18B20 сандық сенсоры, $ 9.95,
  8. pH зонд + жиынтықтар + стандартты буферлер, $ 149.15,
  9. DO probe + Kits + Standard буферлері, $ 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. РН және DO тізбектері үшін I2C -ке ауысыңыз
  2. РН мен DO үзілістері жіберу/алу (TX/RX) әдепкі режимі ретінде сериялық байланыспен жеткізіледі. I2C режимін пайдалану Clock line (SCL) және Data line (SDA) режимін пайдалану үшін (1): VCC, TX, RX кабельдерін ажыратпаңыз, (2): TX-ті Жерге зонд, PGND (GND емес)), (3) VCC тізбегіне қосыңыз, (4): жарық диоды жасылдан көк түске ауысқанша күтіңіз. Толығырақ 39 -беттен қараңыз (рН тізбегінің деректер кестесі,
  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. 18B20 цифрлық температурасының MAC адресін қалай табуға болады. I2C сканерінің үлгісін Arduino IDE -де зонд қосылған кезде пайдалану. Әр құрылғыда бірегей MAC -адрес бар, сондықтан сіз бір ортақ сызықпен (#9) көптеген температуралық зондтарды пайдалана аласыз. 18B20 бір сымды I2C пайдаланады, сондықтан бұл I2C байланыс әдісінің ерекше жағдайы. Төменде MAC - Медициналық қатынауды бақылаудың бір әдісі (төмендегі процедураны орындаған кезде «ROM») берілген.

6 -қадам: кодтауды бастаңыз

Кодтауды бастау
Кодтауды бастау
  • Төмендегі кодты Arduino IDE қойыңыз:
  • Немесе кодты (.ino) жүктеңіз және Arduino IDE -де жаңа терезе пайда болады.

/*

Анықтамалық оқулықтар:

1. Температура, ORP, рН тіркеуші:

2. Қауіпсіз сандық (SD) қалқан:

Бұл код деректерді Arduino сериялық мониторына шығарады. I2C режимінде EZO рН тізбегін басқару үшін Arduino сериялық мониторына пәрмендерді енгізіңіз.

Жоғарыда келтірілген оқулықтардан, негізінен Atlas-Scientific I2C кодынан өзгертілген

Соңғы рет жаңартылған: 2017 жылдың 26 шілдесі Бинх Нгуен

*/

#қосу // I2C қосыңыз.

#pH_adress 99 анықтаңыз // EZO pH тізбегі үшін әдепкі I2C ID нөмірі.

#define DO_address 97 // EZO DO схемасы үшін әдепкі I2C ID нөмірі.

#include «RTClib.h» // I2C және Wire lib арқылы қосылған DS1307 RTC көмегімен күн мен уақыт функциялары

RTC_DS1307 rtc;

#қосу // SD либерарийі үшін

#қосу // деректерді сақтау үшін SD картасы

const int chipSelect = 53; // Adafruit SD-тің үзілуін анықтау керек //

// DO = MISO, DI = MOSI, ATmega pin#: 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);

#қосу

#қосу

ON_WIRE_BUS 9 анықтаңыз // температура датчигі үшін түйреуішті # анықтаңыз

OneWire oneWire (ONE_WIRE_BUS);

DallasTemature температура сенсорлары (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC -адрес, әр зондқа тән

String dataString; // барлық деректерді сақтаудың негізгі нұсқасы

String dataString2; // басып шығару үшін Temperature/pH/DO сақтаудың уақытша нұсқасы

char компьютерлік деректері [20]; // Atlas Scientific -тен нұсқаулық: біз компьютерден/mac/басқасынан кіретін деректерді сақтау үшін 20 байтты таңбалық массив жасаймыз.

алынған байт_компьютерден = 0; // қанша таңба алынғанын білуіміз керек.

байт serial_event = 0; // компьютерден/mac/басқа компьютерден деректер алынған кезде сигнал беретін жалауша.

байт коды = 0; // I2C жауап кодын ұстау үшін пайдаланылады.

pH pH_мәліметтері [20]; // біз рН тізбегінен кіріс мәліметтерін ұстап тұру үшін 20 байтты таңбалар массивін жасаймыз.

байт in_char = 0; // рН тізбегінен байттарда сақтау үшін 1 байтты буфер ретінде қолданылады.

байт i = 0; // есептегіш ph_data массиві үшін пайдаланылады.

int time_ = 1800; // EZO класс рН тізбегіне жіберілген командаға байланысты қажетті кідірісті өзгерту үшін қолданылады.

pH_float қалқыма; // float var рН өзгермелі мәнін ұстау үшін қолданылады.

char DO_data [20];

// өзгермелі temp_C;

void setup () // аппараттық инициализация.

{

Serial.begin (9600); // сериялық портты қосу.

Wire.begin (pH_adress); // рН зондының I2C портын қосыңыз

Wire.begin (DO_adress);

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 (logFileName);

Serial.print («…»);

Файл logFile = SD.open (logFileName, FILE_WRITE); // файлды ашыңыз. «деректер тізімі» және тақырыпты басып шығарыңыз

егер (logFile)

{

logFile.println («,,,»); // алдыңғы орында деректер бар екенін көрсетеді

Жол тақырыбы = «Date -Time, Temp (C), pH, DO»;

logFile.println (тақырып);

logFile.close ();

Serial.println («ДАЙЫН»);

//Serial.println(dataString); // сериялық портқа да басып шығарыңыз:

}

else {Serial.println («деректер каталогын ашу қатесі»); } // егер файл ашық болмаса, қатені шығарыңыз:

lcd.setCursor (0, 2);

lcd.print («Журнал файлы:»);

lcd.println (logFileName);

кешіктіру (1000);

сенсорлар.begin ();

sensors.setResolution (ProbeP, 10); // 10 - рұқсат (10 биттік)

lcd.clear ();

id = 0;

}

бос цикл ()

{// негізгі цикл.

dataString = Жол (id);

dataString = Жол (',');

DateTime now = rtc.now ();

dataString = Жол (now.year (), DEC);

dataString += Жол ('/');

dataString += Жол (now.month (), DEC);

dataString += Жол ('/');

dataString += Жол (now.day (), DEC);

dataString += Жол ('');

dataString += Жол (now.hour (), DEC);

dataString += Жол (':');

dataString += Жол (now.minute (), DEC);

dataString += Жол (':');

dataString += Жол (now.second (), DEC);

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_adress); // тізбекті оның 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_мәліметтері = 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); // тізбекті оның ID нөмірі бойынша шақырыңыз

Wire.write ('r');

Wire.endTransmission (); // I2C деректерді беруді тоқтату

кідіріс (уақыт_); // тізбек нұсқаулықты аяқтағанша дұрыс уақытты күтіңіз

Wire.requestFrom (DO_адресс, 20, 1); // тізбекті шақырыңыз және 20 байтты сұраңыз

while (Wire.available ()) // алуға болатын байттар бар ма?

{

in_char = Wire.read (); // байт алу.

if ((in_char> 31) && (in_char <127)) // таңбаның қолдануға болатынын тексеріңіз (басып шығаруға болады), әйтпесе 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 («Температура/ pH/ 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 («Жүгіру (x5м):»);

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // келесі итерацияны бір идентификаторды көбейту

dataString = «»;

кешіктіру (300000); // кешігу 5 минут = 5*60*1000 мс

lcd.clear ();

} // негізгі циклды аяқтаңыз

void display Температура (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print («Температура қатесі»);

else dataString2 = Жол (tempC);

} // код осында аяқталады

  • Құралдар/Порт астындағы Arduino IDE арқылы дұрыс COM портын таңдаңыз
  • Ардуино тақтасын таңдаңыз. Мен Mega 2560 қолдандым, себебі оның ішкі жады көбірек. Arduino Nano немесе Uno бұл орнатумен жақсы жұмыс істейді.
  • Тексеріңіз, кодтаңыз және кодты жүктеңіз

7 -қадам: Сымдарды (жақсартуға болады) және СКД дисплейіндегі нәтижелер

Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
Сымды (жақсартуға болады) және СКД дисплейдегі нәтижелер
  • Ескерту: 2-3 ай үздіксіз жұмыс істегеннен кейін мен DO зондынан рН зондына дейін шу таптым. Atlas Scientific мәліметтері бойынша, рН, өткізгіштік зондтары бірге жұмыс істегенде желідегі кернеу изоляторы ұсынылады. Толығырақ 9 -бетте (https://goo.gl/d62Rqv)
  • Журналға енгізілген деректер (біріншісінде pH мен DO деректерінің алдында басылмаған таңбалар бар). Мен кодты тек басып шығарылатын таңбаларға рұқсат беру арқылы сүздім.

8 -қадам: Деректерді импорттау және график құру

Деректерді импорттаңыз және график жасаңыз
Деректерді импорттаңыз және график жасаңыз
Деректерді импорттаңыз және график жасаңыз
Деректерді импорттаңыз және график жасаңыз
Деректерді импорттаңыз және график жасаңыз
Деректерді импорттаңыз және график жасаңыз
  1. Деректер қойындысы астындағы мәтіннен деректерді импорттау (Excel 2013)
  2. Деректерді үтірмен бөліңіз (сондықтан әр енгізілгеннен кейін үтір қою пайдалы)
  3. Деректерді сызыңыз. Төмендегі әрбір деректерде шамамен 1700 нүкте бар. Өлшеу аралығы - 5 минут (реттелетін). DO және рН тізбектері үшін деректерді оқу үшін ең төменгі мән 1,8 сек.

9 -қадам: калибрлеу

Калибрлеу
Калибрлеу
  1. Сандық температура сенсоры (18В20) айырмашылықты тікелей температураға реттеу арқылы калибрленуі мүмкін. Әйтпесе, егер өтемақы мен көлбеу калибрлеуді қажет етсе, / libraries / DallasTemperature қалтасындағы DallasTemperature.cpp #453 жолындағы мәндерді өзгерту арқылы жасауға болады.
  2. РН және DO зондтары үшін зондтарды ілеспе ерітінділермен калибрлеуге болады. Сіз Atlas Scientific кодының үлгісін қолданып, осы файлдың нұсқауларын орындауыңыз керек.
  3. Калибрлеу мен температураны өтеу үшін рН зондының (https://goo.gl/d62Rqv) 26 және 50 беттерін, сонымен қатар DO зондының 7-8 және 50 беттерін (https://goo.gl/mA32mp) орындаңыз. Алдымен, Atlas ұсынған жалпы кодты қайта жүктеңіз, сериялық мониторды ашып, тиісті пәрменді енгізіңіз.

10 -қадам: Сым тым көп пе?

  1. Сіз SD картасы мен нақты уақыт модулін Arduino тақталарына арналған Dragino Yun Shield көмегімен жоя аласыз (https://goo.gl/J9PBTH). Юн Шилдпен жұмыс істеу үшін кодты өзгерту қажет болды. Міне бастау үшін жақсы жер (https://goo.gl/c1x8Dm)
  2. Электр сымдары тым көп: Atlas Scientific EZO тізбектері үшін нұсқаулық жасады (https://goo.gl/dGyb12) және дәнекерленген тақта (https://goo.gl/uWF51n). 18B20 цифрлық температурасын біріктіру мына жерде (https://goo.gl/ATcnGd). Сіз Raspberry Pi -де жұмыс істейтін Raspbian (Debian Linux нұсқасы) командаларымен таныс болуыңыз керек (https://goo.gl/549xvk)

11 -қадам: растау:

Бұл менің микробалдырларды өсіру үшін фотобиореактормен жұмыс жасаған постдокторлық зерттеулер кезіндегі қосалқы жобам. Менің ойымша, тараптар мұны жүзеге асыру үшін жағдай жасады деп есептеймін. Біріншіден, DE-EE0007093 гранты: «СО2 атмосферасын байыту және жеткізу (ACED)», АҚШ Энергетика департаменті, Энергия тиімділігі және жаңартылатын энергия басқармасы балдырларға арналған биоотындар мен биологиялық өнімдер. Мен электроника мен Arduino -мен жұмыс жасауға мүмкіндік бергені үшін Аризона штатының университетінің Biodesign Swette орталық биотехнология орталығында доктор Брюс Э. Риттманға алғыс айтамын. Мен экологиялық инженерия бойынша оқыдым, негізінен химия, микробиология.

Ұсынылған: