Мазмуну:

Температура, PH жана эриген кычкылтек үчүн кантип маалымат жазуучу кылса болот: 11 кадам (сүрөттөр менен)
Температура, PH жана эриген кычкылтек үчүн кантип маалымат жазуучу кылса болот: 11 кадам (сүрөттөр менен)

Video: Температура, PH жана эриген кычкылтек үчүн кантип маалымат жазуучу кылса болот: 11 кадам (сүрөттөр менен)

Video: Температура, PH жана эриген кычкылтек үчүн кантип маалымат жазуучу кылса болот: 11 кадам (сүрөттөр менен)
Video: Ортаның pH көрсеткішіне байланысты есептеулер үлгілері. 11 сынып. 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 -кадам: Кабелдөө

Электр өткөргүчтөрү
Электр өткөргүчтөрү
  • Төмөндөгү эскизде көрсөтүлгөндөй тетиктерди туташтыруу үчүн jumper/DuPont кабелин колдонуңуз.
  • Өткөрүүнү текшерүү үчүн мультиметрди колдонуңуз.
  • Позитивдүү чыңалуу менен камсыздоону (VCC) жана Жерди (GND) текшериңиз (эгер сиз схеманы жакшы билбесеңиз, чаташтыруу оңой)
  • Күч адаптерин сайыңыз жана ар бир бөлүктөгү кубат көрсөткүчүн текшериңиз. Күмөн санаганда VCC менен GND ортосундагы чыңалууну текшерүү үчүн көп метрди колдонуңуз (5V)

4 -кадам: PH, DO микросхемаларын, SD картасын даярдаңыз

PH, DO микросхемаларын, SD картасын даярдаңыз
PH, DO микросхемаларын, SD картасын даярдаңыз
  1. PH жана DO микросхемалары үчүн I2Cге өтүңүз
  2. PH жана DO сыныктары демейки берүү/алуу (TX/RX) режими катары сериялык байланыш менен жеткирилет. I2C режими Саат линиясын (SCL) жана Маалымат линиясын (SDA) колдонуу үчүн, режимди которуңуз (1): VCC, TX, RX кабелдерин ажыратпаңыз, (2): TXти жерге текшерүү үчүн секирүү, PGND (GND эмес)), (3) схемага VCC сайыңыз, (4): LEDдин Жашылдан Көккө өзгөрүшүн күтүңүз. Көбүрөөк маалымат 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. Тактаны туура туташтырып жатканыңызды текшерүү үчүн, жаркыраган LED тестин иштетип көрүңүз
  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 pH схемасын башкаруу үчүн Arduino сериялык мониторуна буйруктарды териңиз.

Жогорудагы шилтемелерден, негизинен I2C кодунан Atlas-Scientific тарабынан өзгөртүлгөн

Акыркы жолу жаңыртылган: 26 -июль, 2017 -жыл Бинх Нгуен

*/

#кошуу // I2C иштетүү.

#define pH_address 99 // EZO pH Circuit үчүн I2C ID номери.

#define DO_address 97 // EZO DO Circuit үчүн демейки 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; // журналдын тартибин киргизүү үчүн id номери

#кошуу

LiquidCrystal_I2C lcd (0x27, 20, 4);

#кошуу

#кошуу

# аныктоо ONE_WIRE_BUS 9 // температура иликтөөчү үчүн пинди # аныктаңыз

OneWire oneWire (ONE_WIRE_BUS);

DallasTemperature сенсорлору (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC дареги, ар бир иликтөө үчүн уникалдуу

String dataString; // бардык маалыматтарды сактоо үчүн негизги вариант

String dataString2; // басып чыгаруу үчүн Температураны/pH/DO сактоо үчүн убактылуу вариант

char computerdata [20]; // Atlas Scientificтин көрсөтмөсү: биз компьютерден/мактан/башка келген маалыматты сактоо үчүн 20 байттык символду жасайбыз.

байт алынды_компьютерден = 0; // канча каарман алынганын билишибиз керек.

байт serial_event = 0; // маалымат pc/mac/otherден алынганда сигнал берүүчү желек.

байт коду = 0; // I2C жооп кодун кармоо үчүн колдонулат.

char pH_data [20]; // биз рН схемасынан келген маалыматтарды кармап туруу үчүн 20 байттык символ массивин түзөбүз.

байт in_char = 0; // pH Районунан байланган байттарда сактоо үчүн 1 байт буфер катары колдонулат.

байт i = 0; // эсептегич ph_data массиви үчүн колдонулат.

int time_ = 1800; // EZO Class pH Районуна жөнөтүлгөн буйрукка жараша керектүү кечигүүнү өзгөртүү үчүн колдонулат.

сүзүү pH_float; // float var рНнын өзгөрүлмө маанисин кармоо үчүн колдонулат.

char DO_data [20];

// float temp_C;

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

{

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

Wire.begin (pH_address); // рН иликтөө үчүн I2C портун иштетүү

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 is…");

if (! rtc.begin ())

{

Serial.println ("RTC: Реалдуу убакыт сааты… ТАБЫЛБАЙТ");

while (1); // (Serial.println ("RTC: Реалдуу убакыт сааты… ТАБЫЛДЫ"));

}

Serial.println ("ЧЫГУУ");

Serial.print ("Реалдуу убакыт сааты …");

if (! 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 ("OK");

lcd.setCursor (0, 1);

lcd.println ("SD карта: макул");

Serial.print ("Log File:");

Serial.print (logFileName);

Serial.print ("…");

Файл logFile = SD.open (logFileName, FILE_WRITE); // файлды ачуу. "datalog" жана башын басып чыгаруу

эгер (logFile)

{

logFile.println (",,,"); // мурунку иштөөдө маалыматтар болгонун көрсөтөт

String header = "Date -Time, Temp (C), pH, DO";

logFile.println (header);

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 = 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 (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // чынжырын ID номери менен чакырыңыз

Wire.write ('r'); // тынымсыз окуу үчүн катуу код r

Wire.endTransmission (); // I2C маалыматтарды берүүнү токтотуу.

кечиктирүү (time_); // райондук көрсөтмөсүн аягына чыгаруу үчүн туура убакытты күтө туруңуз.

Wire.requestFrom (pH_address, 20, 1); // схемага чалып, 20 байт сураңыз (бул бизге керек болгондон да көп болушу мүмкүн)

while (Wire.available ()) // алуу үчүн байттар барбы

{

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

if ((in_char> 31) && (in_char <127)) // char колдонулаарын текшериңиз (басып чыгарылуучу)

{

pH_data = in_char; // бул байтты биздин массивге жүктөңүз.

i+= 1;

}

if (in_char == 0) // эгерде бизге нөлдүк буйрук жөнөтүлгөнүн көрсөк.

{

i = 0; // i эсептегичти баштапкы абалга келтир.

Wire.endTransmission (); // I2C маалыматтарды берүүнү токтотуу.

тыныгуу; // while циклинен чыгуу.

}

}

serial_event = 0; // сериялык окуя желегин кайра коюу.

dataString2 += ",";

dataString2 += String (pH_data);

Wire.beginTransmission (DO_address); // чынжырын ID номери менен чакырыңыз

Wire.write ('r');

Wire.endTransmission (); // I2C маалыматтарды берүүнү токтотуу

кечиктирүү (time_); // райондук көрсөтмөсүн аягына чыгаруу үчүн туура убакытты күтө туруңуз

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; // эсептегичти 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;

FileFile = SD.open (logFileName, FILE_WRITE); // файлды ачуу. Белгилей кетсек, бир эле учурда бир гана файл ачыла алат, андыктан экинчисин ачуудан мурун аны жабышыңыз керек.

if (dataFile) // эгерде файл жеткиликтүү болсо, ага жазыңыз:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // сериялык портко да басып чыгаруу:

}

else {Serial.println ("datalog файлын ачууда ката кетти"); } // эгерде файл ачык болбосо, ката кетиңиз:

lcd.setCursor (0, 3);

lcd.print ("Running (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // кийинки итерацияны бир ID жогорулатуу

dataString = "";

кечигүү (300000); // кечиктирүү 5 мүнөт = 5*60*1000 мс

lcd.clear ();

} // негизги циклди аяктоо

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

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

else dataString2 = Сап (tempC);

} // код ушул жерде аяктайт

  • Куралдар/Порт астындагы Arduino IDE аркылуу туура COM портун тандаңыз
  • Туура Arduino тактасын тандаңыз. Мен Mega 2560 колдондум, анткени анын ички эси көбүрөөк. Arduino Nano же Uno бул орнотуу менен жакшы иштейт.
  • Текшерүү жана коддоо жана кодду жүктөө

7 -кадам: Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей

Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
Өткөрүү жыйынтыктары (жакшыртылышы мүмкүн) жана ЖК дисплей
  • Эскертүү: Мен 2-3 ай үзгүлтүксүз иштөөдөн кийин рН иликтөөчүгө DO зондунан ызы-чууга туш болдум. Atlas Scientificтин айтымында, рН, өткөргүчтүк зонддору чогуу иштеп жатканда, чыңалуу изолятору сунушталат. Көбүрөөк маалымат 9 -бетте (https://goo.gl/d62Rqv)
  • Катталган маалыматтар (биринчисинде рН жана DO маалыматтарына чейин басылбаган белгилер бар). Мен кодду фильтрлеп, басып чыгарылуучу символдорго гана уруксат бердим.

8 -кадам: маалыматтарды импорттоо жана график түзүү

Маалыматтарды импорттоо жана график түзүү
Маалыматтарды импорттоо жана график түзүү
Маалыматтарды импорттоо жана график түзүү
Маалыматтарды импорттоо жана график түзүү
Маалыматтарды импорттоо жана график түзүү
Маалыматтарды импорттоо жана график түзүү
  1. Маалыматты DATA өтмөгүнүн астындагы тексттен импорттоо (Excel 2013)
  2. Берилиштерди үтүр менен ажыратыңыз (ошондуктан ар бир маалымат киргизилгенден кийин үтүр коюлушу пайдалуу)
  3. Маалыматты пландаңыз. Төмөндөгү ар бир маалыматта болжол менен 1700 пункт бар. Өлчөө аралыгы 5 мүнөт (жөнгө салынат). DO жана рН схемаларынын маалыматтарды окуу үчүн минимуму 1,8 сек.

9 -кадам: Калибрлөө

Калибрлөө
Калибрлөө
  1. Санарип температура сенсору (18B20) түздөн -түз айырманы тууралоо аркылуу калибрлениши мүмкүн. Болбосо, эгерде компенсация жана эңкейиш калибрлөөнү талап кылса, анда / libraries / DallasTemperature папкасындагы #453, DallasTemperature.cpp саптарындагы маанилерди өзгөртүү менен жасай аласыз.
  2. РН жана DO зонддору үчүн, зонддорду коштоочу чечимдер менен калибрлей аласыз. Сиз Atlas Scientific үлгүсүндөгү кодду колдонушуңуз жана бул файлдын көрсөтмөсүн аткарышыңыз керек.
  3. Сураныч, калибрлөө жана температуранын компенсациясы үчүн рН иликтөө үчүн 26 жана 50-беттерди (https://goo.gl/d62Rqv), ошондой эле DO иликтөө үчүн 7-8 жана 50-беттерди караңыз (https://goo.gl/mA32mp). Биринчиден, Atlas тарабынан берилген жалпы кодду кайра жүктөп бериңиз, Serial Monitorду ачыңыз жана тиешелүү буйрукту киргизиңиз.

10 -кадам: Өтө көп зым?

  1. Сиз SD картаны жана реалдуу убакыт саатынын модулун Arduino такталары үчүн Dragino Yun Shield аркылуу жок кыла аласыз (https://goo.gl/J9PBTH). Юн Шилд менен иштөө үчүн кодду өзгөртүү керек болчу. Бул жерде баштоо үчүн жакшы жер (https://goo.gl/c1x8Dm)
  2. Дагы эле өтө көп зым: Atlas Scientific алардын EZO микросхемалары үчүн колдонмо жасады (https://goo.gl/dGyb12) жана solderless board (https://goo.gl/uWF51n). 18B20 санарип температурасын интеграциялоо бул жерде (https://goo.gl/ATcnGd). Сиз Raspberry Piде иштеген Raspbian (Debian Linuxтун версиясы) буйруктары менен тааныш болушуңуз керек (https://goo.gl/549xvk)

11 -кадам: Ыраазычылык:

Бул менин докторлуктан кийинки изилдөөмдөгү менин кошумча долбоорум, ал микробалдырларды өстүрүү үчүн алдын ала фотобиореактордо иштеген. Ошондуктан мен муну ишке ашыруу үчүн тараптар шарттарды түзүштү деп эсептедим. Биринчиден, грант, DE-EE0007093: "Атмосфералык CO2 байытуу жана жеткирүү (ACED)", АКШнын Энергетика департаментинин, Энергия эффективдүүлүгү жана кайра жаралуучу энергия бюросунун максаттуу балыр биоотунуна жана биопродуктыларына. Доктор Брюс Э. Риттманга Biotesign Swette Environmental Bioteechnology борборунда, Аризона штатынын университетинде, мага электроника жана Arduino менен иштөө мүмкүнчүлүгүн бергени үчүн ыраазычылык билдирем. Мен экологиялык инженерия, негизинен химия, бир аз микробиология боюнча билим алдым.

Сунушталууда: