Mundarija:
- 1 -qadam:
- 2 -qadam: Quyidagi qismlarni sotib oling:
- 3 -qadam: simlarni ulash
- 4 -qadam: PH, DO davrlarini, SD -kartani tayyorlang
- 5 -qadam: dasturiy ta'minotni tayyorlang
- 6 -qadam: Kodlashni boshlang
- 7 -qadam: Simlarni ulash natijalari (yaxshilanishi mumkin) va LCD displey
- 8 -qadam: Ma'lumotlarni import qiling va grafik qiling
- 9 -qadam: Kalibrlash
- 10 -qadam: simlar juda ko'pmi?
- 11 -qadam: Tan olish:
2025 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2025-01-13 06:58
Maqsadlar:
- ≤ 500 dollarga ma`lumotlarni yozish vositasini yarating. U harorat, pH va DO ma'lumotlarini vaqt tamg'asi va I2C aloqasi yordamida saqlaydi.
- Nima uchun I2C (Inter-Integrated Circuit)? Har birining o'ziga xos manzili borligini hisobga olsak, bir qatorda bir nechta sensorlar to'planishi mumkin.
1 -qadam:
2 -qadam: Quyidagi qismlarni sotib oling:
- Arduino MEGA 2560, $ 35,
- Arduino kartasi uchun quvvat adapteri, $ 5.98,
- LCD modul I2C (displey), $ 8.99,
- Haqiqiy vaqtda soat (RTC) buzilishi, $ 7,5,
- MicroSD karta kartasi, 7,5 dollar,
- 4 Gb SD -karta, 6,98 dollar,
- Suv o'tkazmaydigan DS18B20 raqamli sensori, 9,95 dollar,
- pH probi + to'plamlar + standart buferlar, $ 149.15,
- DO probi + to'plamlari + standart buferlari, $ 247,45,
- Non paneli, o'tish kabeli, $ 7.98,
- (Ixtiyoriy) kuchlanish izolatori, $ 24,
Hammasi: $ 510,48
* Ba'zi qismlarni (umumiy karta kabi) boshqa sotuvchilardan (eBay, xitoy sotuvchisi) arzonroq narxda sotib olish mumkin edi. pH va DO problarini ularni Atlas Scientific dan olish tavsiya etiladi.
* O'tkazuvchanlik va kuchlanishni tekshirish uchun multimetrdan foydalanish tavsiya etiladi. Taxminan 10-15 dollar turadi (https://goo.gl/iAMDJo)
3 -qadam: simlarni ulash
- Quyidagi eskizda ko'rsatilgandek qismlarni ulash uchun jumper/DuPont kabellaridan foydalaning.
- O'tkazuvchanlikni tekshirish uchun multimetrdan foydalaning.
- Ijobiy kuchlanish manbasini (VCC) va erni (GND) tekshiring (agar siz sxemani yaxshi bilmasangiz, chalkashtirib yuborish oson)
- Quvvat adapterini ulang va har bir qismdagi quvvat ko'rsatkichini tekshiring. Shubha tug'ilganda, ko'p o'lchagichdan foydalanib, VCC va GND o'rtasidagi kuchlanishni tekshiring (5V)
4 -qadam: PH, DO davrlarini, SD -kartani tayyorlang
- PH va DO davrlari uchun I2C ga o'ting
- PH va DO uzilishlari uzatish/qabul qilish (TX/RX) standart rejimi sifatida ketma -ket aloqa bilan yuboriladi. I2C rejimida Soat chizig'i (SCL) va Ma'lumot liniyasi (SDA) rejimidan foydalanish uchun rejimni (1) bilan almashtiring: VCC, TX, RX kabellarini ajratib oling, (2): TX-ni zond uchun erga o'tkazing, PGND (GND emas)), (3) zanjirga VCC ulang, (4): LEDning yashil rangdan ko'k ranggacha o'zgarishini kuting. Batafsil ma'lumotni 39 -betda tekshiring (pH davri uchun ma'lumotlar jadvali,
- DO sxemasi bilan bir xil qadamni bajaring
- (agar siz namuna kodini taxtaga qanday yuklashni bilsangiz, buni ketma -ket monitor orqali qilishingiz mumkin)
- SD -kartani FAT formatiga formatlash
5 -qadam: dasturiy ta'minotni tayyorlang
- Arduino Integrated Development Environment (IDE) ni yuklab oling,
- Kutubxonani Arduino IDE -ga o'rnating:
- Ularning aksariyati Arduino dasturi bilan ta'minlangan. LiquidCrystal_I2C.h GitHub orqali mavjud
- USB uchun haydovchini o'rnating. Haqiqiy Arduino uchun siz uni o'rnatishingiz shart emas. Umumiy foydalanish uchun siz CH340 drayverini o'rnatishingiz kerak (GitHub:
- Yonib -o'chib turadigan LED sinovini o'tkazib, taxtani to'g'ri ulaganingizni tekshiring
- 18B20 raqamli haroratining MAC manzilini qanday topish mumkin. I2C skaner shablonini Arduino IDE -da zond ulangan holda ishlatish. Har bir qurilmaning o'ziga xos MAC -manzili bor, shuning uchun siz bitta umumiy chiziqli (#9) harorati o'lchagichlardan foydalanishingiz mumkin. 18B20 bitta simli I2C dan foydalanadi, shuning uchun bu I2C aloqa usulining alohida holati. Quyida MAC - Tibbiy kirishni boshqarish usullarini topishingiz mumkin (quyida ko'rsatilgan tartibni bajarganingizda "ROM").
6 -qadam: Kodlashni boshlang
- Quyidagi kodni Arduino IDE -ga joylashtiring:
- Yoki kodni (.ino) yuklab oling va Arduino IDE -da yangi oyna ochiladi.
/*
Malumot qo'llanmalari:
1. Harorat, ORP, pH yozuvchisi:
2. Himoyalangan raqamli (SD) qalqoni:
Bu kod ma'lumotlarni Arduino seriyali monitoriga chiqaradi. I2C rejimida EZO pH davrini boshqarish uchun Arduino seriyali monitoriga buyruqlar kiriting.
Yuqoridagi havola qilingan darsliklar, asosan Atlas-Scientific tomonidan I2C kodidan o'zgartirilgan
Oxirgi yangilangan: 2017 yil 26 -iyul, Binx Nguyen
*/
#include // I2C -ni yoqing.
#define pH_address 99 // EZO pH davri uchun standart I2C identifikator raqami.
#define DO_address 97 // EZO DO davri uchun standart I2C identifikator raqami.
#"RTClib.h" ni qo'shing // I2C va Wire lib orqali ulangan DS1307 RTC yordamida sana va vaqt funktsiyalari.
RTC_DS1307 rtc;
#include // SD libarary uchun
#kiritish // SD -karta ma'lumotlarni saqlash uchun
const int chipSelect = 53; // Adafruit SD-ning buzilishini aniqlash kerak //
// DO = MISO, DI = MOSI, ATmega pin#: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)
char logFileName = "dataLT.txt"; // tajribangizni aniqlash uchun logFileName -ni o'zgartiring, masalan, PBR_01_02, datalog1
uzoq id = 1; // jurnal tartibini kiritish uchun id raqami
#qo'shing
LiquidCrystal_I2C lcd (0x27, 20, 4);
#qo'shing
#qo'shing
ON_WIRE_BUS 9 ni aniqlang // harorat o'lchagichi uchun pinni belgilang
OneWire OneWire (ONE_WIRE_BUS);
Dallas harorat sensori (& oneWire);
DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC manzili, har bir prob uchun o'ziga xos
String dataString; // barcha ma'lumotlarni saqlashning asosiy varianti
String dataString2; // chop etish uchun Temperatur/pH/DO saqlash uchun vaqtinchalik variant
char ma'lumotlari [20]; // Atlas Scientific -dan ko'rsatma: biz kompyuter/mac/boshqasidan kiruvchi ma'lumotlarni saqlash uchun 20 baytli belgilar majmuasini tuzamiz.
olingan bayt_from_kompyuter = 0; // qancha belgi olinganligini bilishimiz kerak.
bayt serial_event = 0; // kompyuter/mac/boshqasidan ma'lumotlar qabul qilinganda signal beruvchi bayroq.
bayt kodi = 0; // I2C javob kodini ushlab turish uchun ishlatiladi.
char pH_data [20]; // biz pH zanjiridan kiruvchi ma'lumotlarni saqlash uchun 20 baytli belgilar majmuasini tuzamiz.
bayt in_char = 0; // pH zanjiridan bog'langan baytlarda saqlash uchun 1 baytli bufer sifatida ishlatiladi.
bayt i = 0; // ph_data qatori uchun hisoblagich ishlatiladi.
int vaqti_ = 1800; // EZO Class pH davriga yuborilgan buyruqqa qarab, kerakli kechikishni o'zgartirish uchun ishlatiladi.
suzuvchi pH_float; // float var pH qiymatini ushlab turish uchun ishlatiladi.
char DO_data [20];
// float temp_C;
void setup () // apparatni ishga tushirish.
{
Serial.begin (9600); // ketma -ket portni yoqish.
Wire.begin (pH_adress); // pH probi uchun I2C portini yoqing
Wire.begin (DO_adress);
lcd.init ();
lcd.begin (20, 4);
lcd.backlight ();
lcd.home ();
lcd.print ("Salom PBR!");
lcd.setCursor (0, 1);
lcd.print ("Boshlanmoqda …");
Serial.print ("RTC bu …");
agar (! rtc.begin ())
{
Serial.println ("RTC: Haqiqiy vaqt… topilmadi");
while (1); // (Serial.println ("RTC: Haqiqiy vaqtda soat … topildi"));
}
Serial.println ("KO'CHIRISH");
Serial.print ("Haqiqiy vaqtda soat …");
agar (! rtc.isrunning ())
{rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)))));
}
Serial.println ("ISHLASH");
lcd.setCursor (0, 0);
lcd.println ("RTC: OK");
Serial.print ("SD -karta …"); // karta mavjudligini va uni ishga tushirish mumkinligini ko'ring:
agar (! SD.begin (chipSelect))
{Serial.println ("Muvaffaqiyatsiz"); // boshqa hech narsa qilmang:
qaytish;
}
Serial.println ("OK");
lcd.setCursor (0, 1);
lcd.println ("SD -karta: OK");
Serial.print ("Jurnal fayli:");
Serial.print (logFileName);
Serial.print ("…");
Fayl logFile = SD.open (logFileName, FILE_WRITE); // faylni oching. "Ma'lumotlar katalogi" va sarlavhani chop eting
agar (logFile)
{
logFile.println (",,,"); // oldingi ishda ma'lumotlar borligini bildiring
String header = "Date -Time, Temp (C), pH, DO";
logFile.println (sarlavha);
logFile.close ();
Serial.println ("Tayyor");
//Serial.println(dataString); // ketma -ket portga ham chop eting:
}
else {Serial.println ("ma'lumotlar katalogini ochishda xato"); } // agar fayl ochiq bo'lmasa, xato paydo bo'ladi:
lcd.setCursor (0, 2);
lcd.print ("Jurnal fayli:");
lcd.println (logFileName);
kechikish (1000);
sensorlar.begin ();
sensorlar.setResolution (ProbeP, 10); // 10 - o'lcham (10bit)
lcd.clear ();
id = 0;
}
bo'sh halqa ()
{// asosiy tsikl.
dataString = String (id);
dataString = String (',');
DateTime now = 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);
sensorlar.requestTemperatures ();
displey harorati (ProbeP);
Wire.beginTransmission (pH_adress); // elektron raqamni uning raqamiga qo'ng'iroq qiling
Wire.write ('r'); // doimiy o'qish uchun qattiq kod r
Wire.endTransmission (); // I2C ma'lumot uzatishni tugatish.
kechikish (vaqt_); // sxema o'z ko'rsatmalarini bajarishi uchun to'g'ri vaqtni kuting.
Wire.requestFrom (pH_adress, 20, 1); // sxemaga qo'ng'iroq qiling va 20 baytni so'rang (bu bizga kerak bo'lgandan ko'proq bo'lishi mumkin)
while (Wire.available ()) // olish uchun baytlar bormi
{
in_char = Wire.read (); // bayt olish.
if ((in_char> 31) && (in_char <127)) // belgining mavjudligini tekshiring (chop etish mumkin)
{
pH_data = in_char; // bu baytni qatorimizga yuklang.
i+= 1;
}
if (in_char == 0) // agar bizga null buyruq yuborilganini ko'rsak.
{
i = 0; // i hisoblagichini 0 ga qaytaring.
Wire.endTransmission (); // I2C ma'lumot uzatishni tugatish.
tanaffus; // while loopidan chiqish.
}
}
serial_event = 0; // ketma -ket voqea bayrog'ini tiklash.
dataString2 += ",";
dataString2 += String (pH_data);
Wire.beginTransmission (DO_adress); // elektron raqamni uning raqamiga qo'ng'iroq qiling
Wire.write ('r');
Wire.endTransmission (); // I2C ma'lumot uzatishni tugatish
kechikish (vaqt_); // sxema o'z ko'rsatmalarini bajarishi uchun to'g'ri vaqtni kuting
Wire.requestFrom (DO_adress, 20, 1); // sxemani chaqiring va 20 bayt talab qiling
while (Wire.available ()) // olish uchun baytlar bormi.
{
in_char = Wire.read (); // bayt olish.
if ((in_char> 31) && (in_char <127)) // char ishlatilishini tekshiring (chop etish mumkin), aks holda in_char.txt fayli boshida belgini o'z ichiga oladi
{DO_data = in_char; // bu baytni qatorimizga yuklang
i+= 1; // qator elementi uchun hisoblagich paydo bo'ladi
}
agar (in_char == 0)
{// agar bizga null buyruq yuborilganini ko'rsak
i = 0; // i hisoblagichini 0 ga qaytaring.
Wire.endTransmission (); // I2C ma'lumot uzatishni tugatish.
tanaffus; // while loopidan chiqish.
}
}
serial_event = 0; // ketma -ket voqea bayrog'ini tiklash
pH_float = atof (pH_data);
dataString2 += ",";
dataString2 += String (DO_data);
lcd.setCursor (0, 1);
lcd.print ("Harorat/ pH/ DO");
lcd.setCursor (0, 2);
lcd.print (dataString2);
dataString += ',';
dataString += dataString2;
Fayl dataFile = SD.open (logFileName, FILE_WRITE); // faylni oching. E'tibor bering, bir vaqtning o'zida faqat bitta fayl ochilishi mumkin, shuning uchun boshqasini ochishdan oldin uni yopish kerak.
if (dataFile) // agar fayl mavjud bo'lsa, unga yozing:
{
dataFile.println (dataString);
dataFile.close ();
Serial.println (dataString); // ketma -ket portga ham chop eting:
}
else {Serial.println ("ma'lumotlar katalogi faylini ochishda xato"); } // agar fayl ochiq bo'lmasa, xato paydo bo'ladi:
lcd.setCursor (0, 3);
lcd.print ("Yugurish (x5m):");
lcd.setCursor (15, 3);
lcd.print (id);
id ++; // keyingi identifikatsiyani bitta identifikatorni oshirish
ma'lumotlarString = "";
kechikish (300000); // kechikish 5 daqiqa = 5*60*1000 milodiy
lcd.clear ();
} // asosiy tsiklni tugatish
bo'sh displey harorati (DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC (deviceAddress);
if (tempC == -127.00) lcd.print ("Harorat xatosi");
else dataString2 = String (tempC);
} // kod shu erda tugaydi
- Asboblar/port ostida Arduino IDE orqali to'g'ri COM portini tanlang
- To'g'ri Arduino kartasini tanlang. Men Mega 2560 -dan foydalandim, chunki u ko'proq ichki xotiraga ega. Arduino Nano yoki Uno bu sozlash bilan yaxshi ishlaydi.
- Kodni tekshiring va kodlang va yuklang
7 -qadam: Simlarni ulash natijalari (yaxshilanishi mumkin) va LCD displey
- E'tibor bering: 2-3 oylik uzluksiz ishlashdan so'ng men DO probidan pH probigacha bo'lgan shovqinga duch keldim. Atlas Scientific ma'lumotlariga ko'ra, pH, o'tkazuvchanlik problari birgalikda ishlaganda, chiziqli kuchlanish izolyatori tavsiya etiladi. Batafsil ma'lumot 9 -betda (https://goo.gl/d62Rqv)
- Jurnalga yozilgan ma'lumotlar (birinchisi pH va DO ma'lumotlaridan oldin bosilmagan belgilarga ega). Men faqat chop etiladigan belgilarga ruxsat berish orqali kodni filtrladim.
8 -qadam: Ma'lumotlarni import qiling va grafik qiling
- Ma'lumotlar ko'rinishidagi matndan ma'lumotlarni import qilish (Excel 2013)
- Ma'lumotlarni vergul bilan ajrating (shuning uchun har bir ma'lumot kiritilgandan keyin vergul qo'yish foydali bo'ladi)
- Ma'lumotlarni chizish. Quyidagi har bir ma'lumotda taxminan 1700 ball bor. O'lchov oralig'i 5 minut (sozlanishi). DO va pH davrlarining ma'lumotlarni o'qishi uchun minimal 1,8 soniya.
9 -qadam: Kalibrlash
- Raqamli harorat sensori (18B20) to'g'ridan -to'g'ri farqni sozlash orqali sozlanishi mumkin. Aks holda, agar kompensatsiya va qiyalik kalibrlashni talab qilsa, siz / libraries / DallasTemperature papkasidagi DallasTemperature.cpp #453 -satridagi qiymatlarni o'zgartirib qilishingiz mumkin.
- PH va DO problari uchun siz problarni hamrohlik qiladigan eritmalar bilan sozlashingiz mumkin. Siz Atlas Scientific kodini ishlatishingiz va ushbu fayl ko'rsatmalariga amal qilishingiz kerak.
- Iltimos, kalibrlash va haroratni qoplash uchun pH probini (https://goo.gl/d62Rqv) 26 va 50-sahifalarga, shuningdek DO probining 7-8 va 50-sahifalariga (https://goo.gl/mA32mp) rioya qiling. Birinchidan, iltimos, Atlas tomonidan taqdim etilgan umumiy kodni qayta yuklang, Serial monitorni oching va tegishli buyruqni kiriting.
10 -qadam: simlar juda ko'pmi?
- Siz SD kartani va real vaqtda soat modulini Arduino platalari uchun Dragino Yun Shield yordamida yo'q qilishingiz mumkin (https://goo.gl/J9PBTH). Yun Shild bilan ishlash uchun kodni o'zgartirish kerak edi. Bu erda boshlash uchun yaxshi joy (https://goo.gl/c1x8Dm)
- Hali ham simlar juda ko'p: Atlas Scientific EZO sxemalari uchun qo'llanma tayyorladi (https://goo.gl/dGyb12) va lehimsiz taxta (https://goo.gl/uWF51n). 18B20 raqamli haroratini birlashtirish bu erda (https://goo.gl/ATcnGd). Siz Raspberry Pi -da ishlaydigan Raspbian (Debian Linux versiyasi) buyruqlari bilan tanish bo'lishingiz kerak (https://goo.gl/549xvk)
11 -qadam: Tan olish:
Doktorlikdan keyingi tadqiqotlarim davomida bu mening yon loyiham, men mikroalglarni etishtirish uchun oldindan fotobioreaktor ustida ishlaganman. Shunday qilib, men buni amalga oshirish uchun tomonlar shart -sharoitlar yaratgan deb hisoblayman. Birinchidan, DE-EE0007093: AQSh energetika vazirligi, energiya samaradorligi va qayta tiklanadigan energiya byurosi, algli bioyoqilg'i va biologik mahsulotlar uchun mo'ljallangan "CO2 atmosferasini boyitish va etkazib berish (ACED)" granti. Men Arizona shtati universiteti atrof -muhit biotexnologiyasi bo'yicha Biodesign Swette markazida doktor Bryus E. Rittmannga menga elektronika va Arduino bilan shug'ullanish imkoniyatini bergani uchun minnatdorchilik bildiraman. Men atrof -muhit muhandisligi, asosan kimyo, ozgina mikrobiologiya bo'yicha o'qiganman.