Mündəricat:
- Addım 1:
- Addım 2: Aşağıdakı hissələri satın alın:
- Addım 3: Kabel çəkmə
- Addım 4: PH, DO Circuits, SD Card hazırlayın
- Addım 5: Proqram hazırlayın
- Addım 6: Kodlaşdırmağa başlayın
- Addım 7: Kablolama (Təkmilləşdirilə bilər) və LCD Ekranda Nəticələr
- Addım 8: Məlumatları idxal edin və Qrafik yaradın
- Addım 9: Kalibrləmə
- Addım 10: Çox Çox Kablolama?
- Addım 11: Təsdiq:
2025 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2025-01-13 06:56
Məqsədlər:
- ≤ 500 ABŞ dolları üçün məlumat qeydiyyatçısı olun. İstilik, pH və DO məlumatlarını bir zaman möhürü ilə və I2C ünsiyyətindən istifadə edərək saxlayır.
- Niyə I2C (İnteqrasiya edilmiş Dövrə)? Hər birinin özünəməxsus bir ünvanı olduğu nəzərə alınmaqla eyni sətirdə çox sayda sensor yığmaq olar.
Addım 1:
Addım 2: Aşağıdakı hissələri satın alın:
- Arduino MEGA 2560, 35 dollar,
- Arduino lövhəsi üçün güc adapteri, 5.98 dollar,
- LCD modulu I2C (ekran), $ 8.99,
- Real vaxt saatı (RTC), 7,5 dollar,
- MicroSD kart kəsmə lövhəsi, 7,5 dollar,
- 4GB SD kart, 6.98 dollar,
- Suya davamlı DS18B20 Rəqəmsal sensor, 9.95 dollar,
- pH probu + Kitlər + Standart tamponlar, 149.15 dollar,
- DO probu + Kitlər + Standart tamponlar, 247,45 dollar,
- Çörək taxtası, tullanan kabel, 7.98 dollar,
- (İsteğe bağlı) Gərginlik İzolatoru, 24 dollar,
Cəmi: 510.48 dollar
* Bəzi hissələr (ümumi lövhə kimi) digər satıcılardan (eBay, Çinli satıcı) daha aşağı qiymətə alına bilər. pH və DO problarını Atlas Scientific -dən əldə etmək tövsiyə olunur.
* İletkenlik və gərginliyi yoxlamaq üçün bir multimetr tövsiyə olunur. Təxminən 10-15 dollara başa gəlir (https://goo.gl/iAMDJo)
Addım 3: Kabel çəkmə
- Parçaları aşağıdakı eskizdə göstərildiyi kimi bağlamaq üçün jumper/DuPont kabellərindən istifadə edin.
- İletimi yoxlamaq üçün multimetrdən istifadə edin.
- Müsbət Gərginlik Təchizatını (VCC) və Toprağı (GND) yoxlayın (dövrə ilə tanış deyilsinizsə qarışdırmaq asandır)
- Güc adapterini qoşun və hər bir hissədəki güc göstəricisini yoxlayın. Şübhə olduqda, VCC və GND arasındakı gərginliyi (5V) yoxlamaq üçün multimetrdən istifadə edin.
Addım 4: PH, DO Circuits, SD Card hazırlayın
- PH və DO sxemləri üçün I2C -ə keçin
- PH və DO qırılmaları Varsayılan Göndərmə/Alma (TX/RX) rejimi olaraq Serial rabitə ilə göndərilir. I2C rejimində Saat xətti (SCL) və Məlumat xəttini (SDA) istifadə etmək üçün rejimi (1) ilə dəyişdirin: VCC, TX, RX kabellərini ayırın, (2): TX-dən Zəminə keçin, PGND (GND deyil)), (3) VCC -ni dövrə qoşun, (4): LED -in Yaşıldan Mavi rəngə dəyişməsini gözləyin. Daha ətraflı məlumatı 39 -cu səhifədə yoxlayın (pH dövrəsi üçün məlumat cədvəli,
- DO dövrə ilə eyni addımı edin
- (nümunə kodu lövhəyə necə yükləməyi bilirsinizsə, bunu Serial monitor vasitəsilə edə bilərsiniz)
- SD kartı FAT formatına formatlayın
Addım 5: Proqram hazırlayın
- Arduino İnteqrasiya İnkişaf Mühitini (IDE) yükləyin,
- Kitabxananı Arduino IDE -yə quraşdırın:
- Əksəriyyəti Arduino proqramı ilə gəlir. LiquidCrystal_I2C.h GitHub vasitəsilə mövcuddur
- USB üçün sürücünü quraşdırın. Əsl Arduino üçün birini quraşdırmağa ehtiyacınız olmaya bilər. Ümumi bir sürücü üçün CH340 sürücüsünü quraşdırmalısınız (GitHub:
- Yanıp sönən bir LED sınağı keçirərək lövhəni düzgün bağladığınızı yoxlayın
- 18B20 rəqəmsal temperaturun MAC ünvanını necə tapmaq olar. Arduino IDE -də I2C skaner şablonundan istifadə edərək probu qoşun. Hər bir cihazın özünəməxsus MAC ünvanı var, belə ki, bir paylaşılan xəttlə (#9) bir o qədər çoxlu temperatur probundan istifadə edə bilərsiniz. 18B20 bir telli I2C istifadə edir, buna görə də I2C ünsiyyət üsulunun xüsusi bir vəziyyətidir. Aşağıda MAC - Tibbi Erişim Nəzarəti (aşağıdakı proseduru icra edərkən "ROM") tapmaq üçün bir üsul var.
Addım 6: Kodlaşdırmağa başlayın
- Aşağıdakı kodu Arduino IDE -ə kopyalayın:
- Və ya kodu (.ino) yükləyin və Arduino IDE -də yeni bir pəncərə açılmalıdır.
/*
İstinad dərsləri:
1. Temperatur, ORP, pH qeyd cihazı:
2. Təhlükəsiz Rəqəmsal (SD) Qalxanı:
Bu kod Arduino serial monitoruna məlumat çıxaracaq. I2C rejimində EZO pH dövrəsini idarə etmək üçün əmrləri Arduino serial monitoruna daxil edin.
Yuxarıdakı istinad dərslərindən, əsasən Atlas-Scientific tərəfindən I2C kodundan dəyişdirildi
Son yenilənmə: 26 iyul 2017, Binh Nguyen
*/
#daxil edin // I2C -ni aktiv edin.
#define pH_address 99 // EZO pH Circuit üçün standart I2C ID nömrəsi.
#define DO_address 97 // EZO DO Circuit üçün standart I2C ID nömrəsi.
#include "RTClib.h" // I2C və Wire lib vasitəsi ilə bağlanmış DS1307 RTC istifadə edərək tarix və vaxt funksiyaları
RTC_DS1307 rtc;
#daxil edin // SD libarary üçün
#daxil edin // Məlumat saxlamaq üçün SD kart
const int chipSelect = 53; // Adafruit SD sınıqını anlamaq lazımdır //
// DO = MISO, DI = MOSI, ATmega pin#: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)
char logFileName = "dataLT.txt"; // təcrübənizi müəyyən etmək üçün logFileName dəyişdirin, məsələn PBR_01_02, datalog1
uzun id = 1; // qeyd sırasına daxil olmaq üçün id nömrəsi
#daxil edin
LiquidCrystal_I2C lcd (0x27, 20, 4);
#daxil edin
#daxil edin
#deineine ONE_WIRE_BUS 9 // temperatur probu üçün pin # təyin edin
OneWire OneWire (ONE_WIRE_BUS);
DallasTemperatur sensorlar (& oneWire);
DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC ünvanı, hər bir prob üçün unikaldır
String dataString; // bütün məlumatları saxlamaq üçün əsas variant
String dataString2; // çap etmək üçün Temperatur/pH/DO saxlamaq üçün müvəqqəti bir variant
kompüter məlumatları [20]; // Atlas Scientific -dən təlimat: daxil olan məlumatları bir pc/mac/other -dən tutmaq üçün 20 baytlıq xarakterli bir sıra hazırlayırıq.
alınan bayt_kompüteri = 0; // neçə personajın alındığını bilmək lazımdır.
byte serial_event = 0; // pc/mac/other -dən məlumatlar alındıqda siqnal verən bayraq.
bayt kodu = 0; // I2C cavab kodunu saxlamaq üçün istifadə olunur.
char pH_data [20]; // pH dövrəsindən daxil olan məlumatları saxlamaq üçün 20 baytlıq bir simvol düzəldirik.
bayt in_char = 0; // pH dövrəsindən bağlı baytlarda saxlamaq üçün 1 bayt tampon kimi istifadə olunur.
bayt i = 0; // ph_data serialı üçün istifadə olunan sayğac.
int vaxt_ = 1800; // EZO Class pH Circuit -ə göndərilən əmrdən asılı olaraq lazım olan gecikməni dəyişdirmək üçün istifadə olunur.
üzmək pH_float; // float var, pH -ın dəyişkən dəyərini saxlamaq üçün istifadə olunur.
char DO_data [20];
// float temp_C;
void setup () // hardware inisializasiyası.
{
Serial.begin (9600); // seriyalı portu aktiv edin.
Wire.begin (pH_ ünvanı); // pH probu üçün I2C portunu aktiv edin
Wire.begin (DO_adres);
lcd.init ();
lcd.begin (20, 4);
lcd.lightlight ();
lcd.home ();
lcd.print ("Salam PBR!");
lcd.setCursor (0, 1);
lcd.print ("Başlanır …");
Serial.print ("RTC……");
əgər (! rtc.begin ())
{
Serial.println ("RTC: Real vaxt saatı… TAPILMADI");
while (1); // (Serial.println ("RTC: Real-time clock… FOUND"));
}
Serial.println ("ÇALIŞIR");
Serial.print ("Real vaxt saatı …");
əgər (! rtc.isrunning ())
{rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_))));
}
Serial.println ("İŞLƏYİR");
lcd.setCursor (0, 0);
lcd.println ("RTC: OK");
Serial.print ("SD kart…"); // kartın olub olmadığını yoxlayın və işə salın:
əgər (! SD.begin (chipSelect))
{Serial.println ("Uğursuz"); // daha heç nə etmə:
qayıtmaq;
}
Serial.println ("Tamam");
lcd.setCursor (0, 1);
lcd.println ("SD kart: OK");
Serial.print ("Giriş Dosyası:");
Serial.print (logFileName);
Serial.print ("…");
Fayl logFile = SD.open (logFileName, FILE_WRITE); // faylı açın. "datalog" və başlığı yazdırın
əgər (logFile)
{
logFile.println (",,,"); // əvvəlki işdə məlumatların olduğunu göstərir
String başlığı = "Date -Time, Temp (C), pH, DO";
logFile.println (başlıq);
logFile.close ();
Serial.println ("HAZIR");
//Serial.println(dataString); // seriya portuna da yazdırın:
}
başqa {Serial.println ("məlumat kataloqunun açılması xətası"); } // fayl açıq deyilsə, bir səhv aç:
lcd.setCursor (0, 2);
lcd.print ("Giriş faylı:");
lcd.println (logFileName);
gecikmə (1000);
sensorlar.begin ();
sensorlar.setResolution (ProbeP, 10); // 10 qətnamədir (10 bit)
lcd.clear ();
id = 0;
}
boşluq döngəsi ()
{// əsas döngə.
dataString = String (id);
dataString = String (',');
DateTime indi = 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 (indi.hour (), DEC);
dataString += String (':');
dataString += String (now.minute (), DEC);
dataString += String (':');
dataString += String (now.second (), DEC);
lcd.home ();
lcd.print (dataString);
sensorlar.requestTemperatures ();
ekran temperaturu (ProbeP);
Tel.beginTransmission (pH_adresi); // dövrə şəxsiyyət nömrəsi ilə zəng edin
Wire.write ('r'); // davamlı kod oxumaq üçün r
Wire.endTransmission (); // I2C məlumat ötürülməsini dayandırın.
gecikmə (vaxt_); // dövrənin təlimatını yerinə yetirməsi üçün düzgün vaxt gözləyin.
Wire.requestFrom (pH_ ünvanı, 20, 1); // dövrə çağırın və 20 bayt istəyin (bu ehtiyacımızdan çox ola bilər)
while (Wire.available ()) // almaq üçün baytlar varmı?
{
in_char = Wire.read (); // bir bayt alın.
if ((in_char> 31) && (in_char <127)) // simvolun istifadəyə yararlı olub olmadığını yoxlayın (yazdırıla bilər)
{
pH_data = in_char; // bu baytı serialımıza yükləyin.
i+= 1;
}
if (in_char == 0) // bizə null əmr göndərildiyini görsək.
{
i = 0; // sayğac i i sıfırlayın.
Wire.endTransmission (); // I2C məlumat ötürülməsini dayandırın.
fasilə; // while döngüsündən çıxın.
}
}
serial_event = 0; // serial hadisə bayrağını sıfırlayın.
dataString2 += ",";
dataString2 += String (pH_data);
Wire.beginTransmission (DO_address); // dövrə şəxsiyyət nömrəsi ilə zəng edin
Wire.write ('r');
Wire.endTransmission (); // I2C məlumat ötürülməsini dayandırın
gecikmə (vaxt_); // dövrənin təlimatını yerinə yetirməsi üçün düzgün vaxt gözləyin
Wire.requestFrom (DO_adress, 20, 1); // dövrə çağırın və 20 bayt istəyin
while (Wire.available ()) // almaq üçün baytlar varmı?
{
in_char = Wire.read (); // bir bayt alın.
if ((in_char> 31) && (in_char <127)) // char -in istifadə oluna biləcəyini yoxlayın (yazdırıla bilər), əks halda in_char.txt faylının əvvəlində simvol ehtiva edir
{DO_data = in_char; // bu baytı serialımıza yükləyin
i+= 1; // sıra elementi üçün sayğac çəkin
}
əgər (in_char == 0)
{// bizə null əmr göndərildiyini görsək
i = 0; // i sayğacını sıfırlayın.
Wire.endTransmission (); // I2C məlumat ötürülməsini dayandırın.
fasilə; // while döngüsündən çıxın.
}
}
serial_event = 0; // serial hadisə bayrağını sıfırlayın
pH_float = atof (pH_data);
dataString2 += ",";
dataString2 += String (DO_data);
lcd.setCursor (0, 1);
lcd.print ("Temperatur/ pH/ DO");
lcd.setCursor (0, 2);
lcd.print (dataString2);
dataString += ',';
dataString += dataString2;
Fayl dataFile = SD.open (logFileName, FILE_WRITE); // faylı açın. Qeyd edək ki, bir anda yalnız bir fayl açıla bilər, buna görə digərini açmadan əvvəl onu bağlamalısınız.
əgər (dataFile) // fayl varsa, ona yazın:
{
dataFile.println (dataString);
dataFile.close ();
Serial.println (dataString); // seriya portuna da yazdırın:
}
else {Serial.println ("datalog faylını açarkən xəta"); } // fayl açıq deyilsə, bir səhv aç:
lcd.setCursor (0, 3);
lcd.print ("Qaçan (x5m):");
lcd.setCursor (15, 3);
lcd.print (id);
id ++; // bir ID -nin növbəti iterasiyasını artırın
dataString = "";
gecikmə (300000); // gecikmə 5 dəqiqə = 5*60*1000 ms
lcd.clear ();
} // əsas döngəni bitir
void displayTemperature (DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC (deviceAddress);
əgər (tempC == -127.00) lcd.print ("Temperatur Hatası");
else dataString2 = String (tempC);
} // kod burada bitir
- Alətlər/Liman altında Arduino IDE vasitəsilə doğru COM portunu seçin
- Doğru Arduino lövhəsini seçin. Daha çox daxili yaddaşa malik olduğu üçün Mega 2560 istifadə etdim. Arduino Nano və ya Uno bu qurğu ilə yaxşı işləyir.
- Yoxlayın və kodlayın və kodu yükləyin
Addım 7: Kablolama (Təkmilləşdirilə bilər) və LCD Ekranda Nəticələr
- Diqqət: 2-3 aylıq davamlı işdən sonra DO probundan pH probuna qədər səs-küylə qarşılaşdım. Atlas Scientific-ə görə, pH, keçiricilik probları birlikdə işləyərkən xətti gərginlik izolyatoru tövsiyə olunur. Daha ətraflı məlumat 9 -cu səhifədədir (https://goo.gl/d62Rqv)
- Daxil edilmiş məlumatlar (birincisi pH və DO məlumatlarından əvvəl çap olunmamış simvollara malikdir). Yalnız çap edilə bilən simvollara icazə verərək kodu süzdüm.
Addım 8: Məlumatları idxal edin və Qrafik yaradın
- VERİ sekmesinin altındakı mətndən məlumatları idxal edin (Excel 2013)
- Verilənləri vergüllə ayırın (bu səbəbdən hər bir məlumat daxilindən sonra vergül qoymaq faydalıdır)
- Verilənləri tərtib edin. Aşağıdakı hər bir məlumatda təxminən 1700 nöqtə var. Ölçmə aralığı 5 dəqiqədir (tənzimlənə bilər). DO və pH dövrələrinin məlumatları oxuması üçün minimum 1,8 saniyədir.
Addım 9: Kalibrləmə
- Rəqəmsal temperatur sensoru (18B20), fərqi birbaşa olaraq. Əks təqdirdə, kompensasiya və yamacın kalibrlənməsi tələb olunarsa, / libraries / DallasTemperature qovluğunda #453, DallasTemperature.cpp xəttindəki dəyərləri dəyişdirərək edə bilərsiniz.
- PH və DO probları üçün probları müşayiət olunan həllər ilə kalibr edə bilərsiniz. Atlas Scientific nümunə kodundan istifadə etməli və bu faylın təlimatlarına əməl etməlisiniz.
- Kalibrləmə və temperatur kompensasiyası üçün pH probu üçün 26 və 50-ci səhifələri (https://goo.gl/d62Rqv) və DO probu üçün 7-8 və 50-ci səhifələri izləyin (https://goo.gl/mA32mp). Birincisi, zəhmət olmasa Atlas tərəfindən verilən ümumi kodu yenidən yükləyin, Serial Monitoru açın və müvafiq əmri daxil edin.
Addım 10: Çox Çox Kablolama?
- SD kartı və real vaxt saat modulunu Arduino lövhələri üçün Dragino Yun Shield istifadə edərək aradan qaldıra bilərsiniz (https://goo.gl/J9PBTH). Yun Shield ilə işləmək üçün kodu dəyişdirmək lazım idi. Başlamaq üçün yaxşı bir yerdir (https://goo.gl/c1x8Dm)
- Hələ də çox tel: Atlas Scientific, EZO sxemləri (https://goo.gl/dGyb12) və lehimsiz lövhə (https://goo.gl/uWF51n) üçün bir bələdçi hazırladı. 18B20 rəqəmsal temperatur inteqrasiya burada (https://goo.gl/ATcnGd). Raspberry Pi üzərində işləyən Raspbian (Debian Linux versiyası) əmrləri ilə tanış olmalısınız (https://goo.gl/549xvk)
Addım 11: Təsdiq:
Bu, mikroalg yetişdirmək üçün qabaqcıl bir fotobioreaktor üzərində çalışdığım postdoktorluq araşdırmalarım zamanı mənim yan layihəmdir. Buna görə də bunun baş verməsi üçün tərəflərin şərtlər qoyduğunu hesab etməyi lazım bildim. Birincisi, qrant, DE-EE0007093: "Atmosfer CO2 Zənginləşdirilməsi və Çatdırılması (ACED)", ABŞ Enerji Departamenti, Enerji Səmərəliliyi və Bərpa Olunan Enerji İdarəsi, Yosun Biyoyakıtları və Bio Məhsulları. Mənə elektronika və Arduino ilə məşğul olmaq imkanı verdiyinə görə Arizona Dövlət Universiteti Ətraf Mühit Biotexnologiyası Biodesign Swette Mərkəzində Dr. Bruce E. Rittmann'a təşəkkür edirəm. Ətraf mühəndisliyi, əsasən kimya, bir az mikrobiologiya üzrə təhsil aldım.