Përmbajtje:
- Hapi 1:
- Hapi 2: Blini Pjesët më poshtë:
- Hapi 3: Instalimet elektrike
- Hapi 4: Përgatitni qarqet PH, DO, SD Card
- Hapi 5: Përgatitni Softuerin
- Hapi 6: Filloni Kodimin
- Hapi 7: Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
- Hapi 8: Importoni të dhëna dhe bëni një grafik
- Hapi 9: Kalibrimi
- Hapi 10: Shumë tela?
- Hapi 11: Mirënjohje:
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-13 06:58
Objektivat:
- Bëni një regjistrues të të dhënave për 500 dollarë. Ai ruan të dhënat për temperaturën, pH dhe DO me një vulë kohore dhe duke përdorur komunikimin I2C.
- Pse I2C (Qarku i Integruar)? Dikush mund të grumbullojë sa më shumë sensorë në të njëjtën linjë duke pasur parasysh që secili prej tyre ka një adresë unike.
Hapi 1:
Hapi 2: Blini Pjesët më poshtë:
- Arduino MEGA 2560, 35 dollarë,
- Përshtatës energjie për bordin Arduino, 5.98 dollarë,
- Moduli LCD I2C (ekran), 8.99 dollarë,
- Ndarja e orës në kohë reale (RTC), 7.5 dollarë,
- Bordi i shpërthimit të kartës MicroSD, 7.5 dollarë,
- Kartë SD 4 GB, 6.98 dollarë,
- Sensor dixhital i papërshkueshëm nga uji DS18B20, 9.95 dollarë,
- Sonda e pH + Kits + Tamponët standardë, 149,15 dollarë,
- Bëj sondën + Kits + Tamponët standardë, 247.45 dollarë,
- Breadboard, kabllo kërcyese, 7.98 dollarë,
- (Opsionale) Izolatori i Tensionit, 24 dollarë,
Gjithsej: 510.48 dollarë
* Disa pjesë (si bordi i përgjithshëm) mund të blihen nga shitësit e tjerë (eBay, shitës kinez) për një çmim më të ulët. Rekomandohen sondat e pH dhe DO për t'i marrë ato nga Atlas Scientific.
* Rekomandohet një multimetër për të kontrolluar përçueshmërinë dhe tensionin. Kushton rreth 10-15 dollarë (https://goo.gl/iAMDJo)
Hapi 3: Instalimet elektrike
- Përdorni kabllot bluzë/DuPont për të lidhur pjesët siç tregohet në skicën më poshtë.
- Përdorni multimetrin për të kontrolluar përçueshmërinë.
- Kontrolloni Furnizimin me Tension Pozitiv (VCC) dhe Ground (GND) (është e lehtë të ngatërroni nëse nuk jeni të njohur me qarkun)
- Lidhni përshtatësin e energjisë dhe kontrolloni treguesin e energjisë në secilën pjesë. Kur jeni në dyshim, përdorni multimatrin për të kontrolluar tensionin midis VCC dhe GND të jetë (5V)
Hapi 4: Përgatitni qarqet PH, DO, SD Card
- Kaloni në I2C për qarqet pH dhe DO
- Ndarjet e pH dhe DO dërgohen me komunikim serial si mënyra e paracaktuar Transmetimi/Marrja (TX/RX). Për të përdorur linjën e orës të modalitetit I2C (SCL) dhe linjën e të dhënave (SDA), ndërroni modalitetin me (1): hiqni kabllot VCC, TX, RX, (2): hidheni TX në Ground për Probe, PGND (jo GND), (3) lidhni VCC në qark, (4): prisni që LED të ndryshojë nga jeshile në blu. Më shumë detaje kontrolloni në faqen 39 (Fleta e të dhënave për qarkun e pH,
- Bëni të njëjtin hap me qarkun DO
- (nëse e dini se si të ngarkoni kodin shembull në tabelë, mund ta bëni përmes monitorit serial)
- Formatoni kartën SD në formatin FAT
Hapi 5: Përgatitni Softuerin
- Shkarkoni Arduino Integrated Development Environment (IDE),
- Instaloni bibliotekën në Arduino IDE:
- Shumica e tyre vijnë me softuer Arduino. LiquidCrystal_I2C.h është në dispozicion përmes GitHub
- Instaloni drejtuesin për USB. Për Arduino të vërtetë, mund të mos keni nevojë të instaloni një të tillë. Për një gjenerik, duhet të instaloni drejtuesin CH340 (GitHub:
- Kontrolloni nëse e lidhni bordin si duhet duke kryer një provë LED që pulson
- Si të gjeni adresën MAC të temperaturës dixhitale 18B20. Përdorimi i modelit të skanerit I2C në Arduino IDE me sondën e lidhur. Çdo pajisje ka një adresë MAC unike, kështu që ju mund të përdorni sa më shumë sonda të temperaturës me një linjë të përbashkët (#9). 18B20 përdor një tel I2C, kështu që është një rast i veçantë i metodës së komunikimit I2C. Më poshtë është një metodë për të gjetur MAC - Kontrolli i Qasjes Mjekësore ("ROM" kur kryeni procedurën më poshtë).
Hapi 6: Filloni Kodimin
- Kopjoni ngjisni kodin më poshtë në Arduino IDE:
- Ose shkarkoni kodin (.ino) dhe një dritare e re duhet të shfaqet në Arduino IDE.
/*
Udhëzime referimi:
1. Temperatura, ORP, loger pH:
2. Mburoja e Siguruar Dixhitale (SD):
Ky kod do të nxjerrë të dhëna në monitorin serik Arduino. Shkruani komanda në monitorin serik Arduino për të kontrolluar qarkun EZO pH në modalitetin I2C.
Modifikuar nga mësimet e referuara më sipër, kryesisht nga kodi I2C nga Atlas-Scientific
Përditësuar së fundmi: 26 korrik 2017 nga Binh Nguyen
*/
#include // aktivizoni I2C.
#përcaktoni pH_adresën 99 // numri i paracaktuar I2C ID për EZO pH Circuit.
#define DO_address 97 // numri i paracaktuar I2C ID për EZO DO Circuit.
#përfshi "RTClib.h" // Funksionet e datës dhe orës duke përdorur një RTC DS1307 të lidhur nëpërmjet I2C dhe Wire lib
RTC_DS1307 rtc;
#include // Për librarinë SD
#include // Kartë SD për të ruajtur të dhënat
const int chipSelect = 53; // duhet të kuptosh për shpërthimin e Adafruit SD //
// DO = MISO, DI = MOSI, në kunjin ATmega#: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)
char logFileName = "dataLT.txt"; // modifikoni logFileName për të identifikuar eksperimentin tuaj, për testin PBR_01_02, datalog1
id e gjatë = 1; // numri id për të futur rendin e regjistrit
#përfshi
LiquidCrystal_I2C LCD (0x27, 20, 4);
#përfshi
#përfshi
#define ONE_WIRE_BUS 9 // përcaktoni pin # për sondën e temperaturës
OneWire oneWire (ONE_WIRE_BUS);
Sensorë të temperaturës Dallas (& oneWire);
Sonda e PajisjesPd = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // Adresa MAC, unike për secilën sondë
String dataString; // varianti kryesor për të ruajtur të gjitha të dhënat
String dataString2; // një variant i përkohshëm për të ruajtur Temperatura/pH/DO për printim
të dhëna kompjuterike char [20]; // udhëzim nga Atlas Scientific: ne bëjmë një grup 20 bajtësh të karakterit për të mbajtur të dhënat hyrëse nga një kompjuter/mac/tjetër.
bajt i marrë_ nga kompjuteri = 0; // duhet të dimë se sa karaktere janë marrë.
byte serial_event = 0; // një flamur për të sinjalizuar kur të dhënat janë marrë nga pc/mac/other.
kodi i bajtit = 0; // përdoret për të mbajtur kodin e përgjigjes I2C.
karaktere pH_data [20]; // ne bëjmë një grup 20 bajtësh të karakterit për të mbajtur të dhënat hyrëse nga qarku i pH.
byte in_char = 0; // përdoret si një tampon 1 bajt për të ruajtur në bajtë të lidhur nga Qarku i pH.
bajt i = 0; // numëruesi i përdorur për grupin ph_data.
koha int_ = 1800; // përdoret për të ndryshuar vonesën e nevojshme në varësi të komandës së dërguar në qarkun pH të klasës EZO.
noton pH_float; // float var përdoret për të mbajtur vlerën e notit të pH.
char DO_data [20];
// noton temp_C;
void setup () // inicimi i harduerit.
{
Serial.filloj (9600); // aktivizoni portin serik.
Wire.fill (pH_adresa); // aktivizoni portën I2C për sondën e pH
Wire.begin (DO_adresa);
lcd.init ();
lcd.filloni (20, 4);
lcd. backlight ();
LCD. shtëpi ();
lcd.print ("Përshëndetje PBR!");
lcd.setCursor (0, 1);
lcd.print ("Fillimi…");
Serial.print ("RTC është …");
nëse (! rtc.filloj ())
{
Serial.println ("RTC: Ora në kohë reale … NUK GJETUR");
ndërsa (1); // (Serial.println ("RTC: Ora në kohë reale … GJETUR"));
}
Serial.println ("RUNNING");
Serial.print ("Ora në kohë reale …");
nëse (! rtc.isrunning ())
{rtc.adjust (DataTime (F (_ DATE_), F (_ TIME_)));
}
Serial.println ("PUNA");
lcd.setCursor (0, 0);
lcd.println ("RTC: OK");
Serial.print ("Kartë SD …"); // shikoni nëse karta është e pranishme dhe mund të inicializohet:
nëse (! SD.begin (chipSelect))
{Serial.println ("Dështoi"); // mos bëni asgjë më shumë:
kthim;
}
Serial.println ("OK");
lcd.setCursor (0, 1);
lcd.println ("Karta SD: OK");
Serial.print ("Dosja e regjistrit:");
Serial.print (logFileName);
Serial.print ("…");
File logFile = SD.open (logFileName, FILE_WRITE); // hap skedarin. "datalog" dhe shtypni kokën
nëse (logFile)
{
logFile.println (",,,"); // tregoni se kishte të dhëna në ekzekutimin e mëparshëm
Titulli i vargut = "Data -Koha, Temp (C), pH, DO";
logFile.println (kokë);
logFile.close ();
Serial.println ("GATI");
//Serial.println(dataString); // printoni edhe në portin serik:
}
else {Serial.println ("gabim në hapjen e datalogut"); } // nëse skedari nuk është i hapur, shfaq një gabim:
lcd.setCursor (0, 2);
lcd.print ("Regjistro skedarin:");
lcd.println (logFileName);
vonesa (1000);
sensorë.fillojnë ();
sensorë.setResolution (ProbeP, 10); // 10 është rezolucioni (10bit)
lcd.qartë ();
id = 0;
}
lak void ()
{// lak kryesor.
dataString = String (id);
dataString = String (',');
DataTime tani = rtc.now ();
dataString = String (tani.viti (), DEC);
dataString += String ('/');
dataString += String (tani. muaj (), DEC);
dataString += String ('/');
dataString += String (tani.day (), DEC);
dataString += String ('');
dataString += String (tani. orë (), DEC);
dataString += String (':');
dataString += String (tani.minute (), DEC);
dataString += String (':');
dataString += String (tani. e dyta (), DEC);
LCD. shtëpi ();
lcd.print (dataString);
sensorë.kërkojmëTemperaturat ();
Temperatura e ekranit (ProbeP);
Wire.beginTransmission (pH_adresa); // telefononi qarkun me numrin e tij të identifikimit
Wire.write ('r'); // kodi i fortë r për të lexuar vazhdimisht
Wire.endTransmission (); // përfundoni transmetimin e të dhënave I2C.
vonesa (koha_); // prisni kohën e duhur që qarku të përfundojë udhëzimin e tij.
Tela. KërkohetNga (adresa e pH, 20, 1); // telefononi qarkun dhe kërkoni 20 bajt (kjo mund të jetë më shumë seç kemi nevojë)
ndërsa (Wire.available ()) // a ka byte për tu marrë
{
in_char = Wire.read (); // merrni një bajt.
nëse ((në_char> 31) && (në_char <127)) // kontrolloni nëse shenja është e përdorshme (e printueshme)
{
pH_data = në_char; // ngarkoni këtë bajt në grupin tonë.
i+= 1;
}
nëse (in_char == 0) // nëse shohim se na është dërguar një komandë null.
{
i = 0; // rivendosni numëruesin i në 0.
Wire.endTransmission (); // përfundoni transmetimin e të dhënave I2C.
pushim; // dilni nga laku while.
}
}
ngjarja serike = 0; // rivendos flamurin e ngjarjes serike.
dataString2 += ",";
dataString2 += String (pH_data);
Wire.beginTransmission (DO_adresa); // telefononi qarkun me numrin e tij të identifikimit
Wire.write ('r');
Wire.endTransmission (); // përfundoni transmetimin e të dhënave I2C
vonesa (koha_); // prisni kohën e duhur që qarku të përfundojë udhëzimin e tij
Tela. Kërko Nga (DO_adresa, 20, 1); // telefononi qarkun dhe kërkoni 20 byte
ndërsa (Wire.available ()) // a ka byte për tu marrë.
{
in_char = Wire.read (); // merrni një bajt.
if ((in_char> 31) && (in_char <127)) // kontrolloni nëse char është i përdorshëm (i printueshëm), përndryshe in_char përmban një simbol në fillim në skedarin.txt
{DO_data = në_char; // ngarkoni këtë bajt në grupin tonë
i+= 1; // shkaktoj numëruesin për elementin e grupit
}
nëse (in_char == 0)
{// nëse shohim se na është dërguar një komandë null
i = 0; // rivendosni numëruesin i në 0.
Wire.endTransmission (); // përfundoni transmetimin e të dhënave I2C.
pushim; // dilni nga laku while.
}
}
ngjarja serike = 0; // rivendos flamurin e ngjarjes serike
pH_float = atof (pH_data);
dataString2 += ",";
dataString2 += String (DO_data);
lcd.setCursor (0, 1);
lcd.print ("Temperatura/ pH/ DO");
lcd.setCursor (0, 2);
lcd.print (dataString2);
dataString += ',';
dataString += dataString2;
File dataFile = SD.open (logFileName, FILE_WRITE); // hap skedarin. vini re se vetëm një skedar mund të jetë i hapur në të njëjtën kohë, kështu që ju duhet ta mbyllni këtë para se të hapni një tjetër.
nëse (dataFile) // nëse skedari është i disponueshëm, shkruaji atij:
{
dataFile.println (dataString);
dataFile.close ();
Serial.println (dataString); // printoni edhe në portin serik:
}
else {Serial.println ("Gabim në hapjen e skedarit të datalogut"); } // nëse skedari nuk është i hapur, shfaq një gabim:
lcd.setCursor (0, 3);
lcd.print ("Vrapimi (x5m):");
lcd.setCursor (15, 3);
lcd.print (id);
id ++; // rrisni një ID përsëritje tjetër
dataString = "";
vonesë (300000); // vono 5 minuta = 5*60*1000 ms
lcd.qartë ();
} // përfundoni lakin kryesor
ekran i pavlefshëm Temperatura (DeviceAddress deviceAddress)
{
float tempC = sensorë.getTempC (pajisja Adresa);
nëse (tempC == -127.00) lcd.print ("Gabim i temperaturës");
tjetër dataString2 = String (tempC);
} // kodi përfundon këtu
- Zgjidhni portën e duhur COM përmes Arduino IDE nën Tools/Port
- Zgjidhni bordin e duhur Arduino. Kam përdorur Mega 2560 sepse ka më shumë memorie të brendshme. Arduino Nano ose Uno funksionon mirë me këtë konfigurim.
- Kontrolloni dhe kodoni dhe ngarkoni kodin
Hapi 7: Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
- Njoftim: Kam hasur në zhurmën nga sonda DO në sondën e pH pas 2-3 muajsh operimi të vazhdueshëm. Sipas Atlas Scientific, një izolator i tensionit në linjë rekomandohet kur pH, sondat e përçueshmërisë veprojnë së bashku. Më shumë detaje janë në faqen 9 (https://goo.gl/d62Rqv)
- Të dhënat e regjistruara (e para ka karaktere të pa shtypura para të dhënave të pH dhe DO). U filtrova në kod duke lejuar vetëm karaktere të printueshme.
Hapi 8: Importoni të dhëna dhe bëni një grafik
- Importoni të dhëna nga teksti në skedën DATA (Excel 2013)
- Ndani të dhënat me presje (kjo është arsyeja pse të kesh presje pas çdo futjeje të të dhënave është e dobishme)
- Hartoni të dhënat. Çdo e dhënë më poshtë ka rreth 1700 pikë. Intervali i matjes është 5 minuta (i rregullueshëm). Minimumi për qarqet DO dhe pH për të lexuar të dhënat është 1.8 sekonda.
Hapi 9: Kalibrimi
- Sensori dixhital i temperaturës (18B20) mund të kalibrohet duke rregulluar ndryshimin direkt në. Përndryshe, nëse kompensimi dhe pjerrësia kërkojnë kalibrim, mund ta bëni duke ndryshuar vlerat në linjën #453, DallasTemperature.cpp në dosjen / libraries / DallasTemperature.
- Për sondat e pH dhe DO, ju mund të kalibroni sondat me zgjidhjet shoqëruese. Ju duhet të përdorni kodin shembull nga Atlas Scientific dhe të ndiqni udhëzimet nga ky skedar.
- Ju lutemi ndiqni faqet 26 dhe 50 për sondën e pH (https://goo.gl/d62Rqv) për kalibrimin dhe kompensimin e temperaturës, dhe gjithashtu faqet, 7-8 dhe 50 për sondën DO (https://goo.gl/mA32mp). Së pari, ju lutemi ngarkoni përsëri kodin e përgjithshëm të siguruar nga Atlas, hapni Monitorin Serial dhe futni një komandë të duhur.
Hapi 10: Shumë tela?
- Ju mund të eliminoni kartën SD dhe modulin e orës në kohë reale duke përdorur Dragino Yun Shield për bordet Arduino (https://goo.gl/J9PBTH). Kodi duhej të modifikohej për të punuar me Yun Shield. Këtu është një vend i mirë për të filluar (https://goo.gl/c1x8Dm)
- Ende shumë instalime elektrike: Atlas Scientific bëri një udhëzues për qarqet e tyre EZO (https://goo.gl/dGyb12) dhe bordin pa saldim (https://goo.gl/uWF51n). Integrimi i temperaturës dixhitale 18B20 është këtu (https://goo.gl/ATcnGd). Duhet të njiheni me komandat në Raspbian (një version i Debian Linux) që funksionojnë në Raspberry Pi (https://goo.gl/549xvk)
Hapi 11: Mirënjohje:
Ky është projekti im anësor gjatë kërkimit tim postdoktoral të cilin e kam punuar në një fotobioreaktor të avancuar për të kultivuar mikroalgat. Kështu që unë mendova se ishte e nevojshme të merreshin parasysh që palët kanë siguruar kushtet për ta bërë këtë të ndodhë. Së pari, granti, DE-EE0007093: "Pasurimi dhe dorëzimi i CO2 atmosferik (ACED)", nga Departamenti Amerikan i Energjisë, Zyra e Efiçiencës së Energjisë dhe Energjisë së Rinovueshme të Biokarburanteve dhe Bioprodukteve të Algatit të Synuar. Falënderoj Dr. Bruce E. Rittmann në Biodesign Swette Center për Bioteknologjinë e Mjedisit, Universiteti Shtetëror i Arizonës që më dha mundësinë të punoj me pajisje elektronike dhe Arduino. Unë jam trajnuar në inxhinieri mjedisore, kryesisht kimi, pak mikrobiologji.