Përmbajtje:

Si të bëni një regjistrues të të dhënave për temperaturën, PH dhe oksigjenin e tretur: 11 hapa (me fotografi)
Si të bëni një regjistrues të të dhënave për temperaturën, PH dhe oksigjenin e tretur: 11 hapa (me fotografi)

Video: Si të bëni një regjistrues të të dhënave për temperaturën, PH dhe oksigjenin e tretur: 11 hapa (me fotografi)

Video: Si të bëni një regjistrues të të dhënave për temperaturën, PH dhe oksigjenin e tretur: 11 hapa (me fotografi)
Video: 2020 POTS Research Updates 2024, Nëntor
Anonim
Image
Image
Imazhi
Imazhi

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ë:

Blini pjesët më poshtë
Blini pjesët më poshtë
  1. Arduino MEGA 2560, 35 dollarë,
  2. Përshtatës energjie për bordin Arduino, 5.98 dollarë,
  3. Moduli LCD I2C (ekran), 8.99 dollarë,
  4. Ndarja e orës në kohë reale (RTC), 7.5 dollarë,
  5. Bordi i shpërthimit të kartës MicroSD, 7.5 dollarë,
  6. Kartë SD 4 GB, 6.98 dollarë,
  7. Sensor dixhital i papërshkueshëm nga uji DS18B20, 9.95 dollarë,
  8. Sonda e pH + Kits + Tamponët standardë, 149,15 dollarë,
  9. Bëj sondën + Kits + Tamponët standardë, 247.45 dollarë,
  10. Breadboard, kabllo kërcyese, 7.98 dollarë,
  11. (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

Instalime elektrike
Instalime 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

Përgatitni qarqet PH, DO, SD Card
Përgatitni qarqet PH, DO, SD Card
  1. Kaloni në I2C për qarqet pH dhe DO
  2. 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,
  3. Bëni të njëjtin hap me qarkun DO
  4. (nëse e dini se si të ngarkoni kodin shembull në tabelë, mund ta bëni përmes monitorit serial)
  5. Formatoni kartën SD në formatin FAT

Hapi 5: Përgatitni Softuerin

Përgatitja e Softuerit
Përgatitja e Softuerit
Përgatitja e Softuerit
Përgatitja e Softuerit
Përgatitja e Softuerit
Përgatitja e Softuerit
Përgatitja e Softuerit
Përgatitja e Softuerit
  1. Shkarkoni Arduino Integrated Development Environment (IDE),
  2. Instaloni bibliotekën në Arduino IDE:
  3. Shumica e tyre vijnë me softuer Arduino. LiquidCrystal_I2C.h është në dispozicion përmes GitHub
  4. 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:
  5. Kontrolloni nëse e lidhni bordin si duhet duke kryer një provë LED që pulson
  6. 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

Filloni Kodimin
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

Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
Rezultatet në instalime elektrike (mund të përmirësohen) dhe ekran LCD
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 dhe bëni një grafik
Importoni të dhëna dhe bëni një grafik
Importoni të dhëna dhe bëni një grafik
Importoni të dhëna dhe bëni një grafik
Importoni të dhëna dhe bëni një grafik
Importoni të dhëna dhe bëni një grafik
  1. Importoni të dhëna nga teksti në skedën DATA (Excel 2013)
  2. Ndani të dhënat me presje (kjo është arsyeja pse të kesh presje pas çdo futjeje të të dhënave është e dobishme)
  3. 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

Kalibrimi
Kalibrimi
  1. 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.
  2. 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.
  3. 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?

  1. 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)
  2. 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.

Recommended: