Kuinka tehdä dataloggeri lämpötilalle, PH: lle ja liuenneelle hapelle: 11 vaihetta (kuvilla)
Kuinka tehdä dataloggeri lämpötilalle, PH: lle ja liuenneelle hapelle: 11 vaihetta (kuvilla)
Anonim
Image
Image
Kuva
Kuva

Tavoitteet:

  • Tee dataloggeri hintaan ≤ 500 dollaria. Se tallentaa lämpötilan, pH: n ja DO: n tiedot aikaleimalla ja käyttää I2C -tiedonsiirtoa.
  • Miksi I2C (Integroitu piiri)? Voidaan pinota niin monta anturia samalle riville, koska jokaisella niistä on yksilöllinen osoite.

Vaihe 1:

Vaihe 2: Osta alla olevat osat:

Osta alla olevat osat
Osta alla olevat osat
  1. Arduino MEGA 2560, 35 dollaria,
  2. Verkkolaite Arduino -kortille, 5,98 dollaria,
  3. LCD -moduuli I2C (näyttö), 8,99 dollaria,
  4. Reaaliaikainen kello (RTC), 7,5 dollaria,
  5. MicroSD -kortti, 7,5 dollaria,
  6. 4 Gt SD -kortti, 6,98 dollaria,
  7. Vedenpitävä DS18B20 -digitaalinen anturi, 9,95 dollaria,
  8. pH-anturi + sarjat + vakiopuskurit, 149,15 dollaria,
  9. DO-koetin + sarjat + vakiopuskurit, 247,45 dollaria,
  10. Leipälauta, hyppyjohto, 7,98 dollaria,
  11. (Valinnainen) Jännitteeneristin, 24 dollaria,

Yhteensä: 510,48 dollaria

* Tietyt osat (kuten yleiskortti) voitaisiin ostaa muilta toimittajilta (eBay, kiinalainen myyjä) halvemmalla. pH- ja DO -koettimia suositellaan niiden saamiseksi Atlas Scientificilta.

* Johtavuuden ja jännitteen tarkistamiseen suositellaan yleismittaria. Se maksaa noin 10-15 dollaria (https://goo.gl/iAMDJo)

Vaihe 3: Johdotus

Johdotus
Johdotus
  • Käytä jumpperi/DuPont -kaapeleita osien liittämiseen alla olevan luonnoksen mukaisesti.
  • Tarkista yleisyys yleismittarilla.
  • Tarkista positiivisen jännitteen syöttö (VCC) ja maadoitus (GND) (se on helppo sekoittaa, jos et tunne piiriä)
  • Kytke verkkolaite pistorasiaan ja tarkista kunkin osan virran merkkivalo. Jos olet epävarma, tarkista monimetrillä VCC: n ja GND: n välinen jännite (5V)

Vaihe 4: Valmistele PH-, DO -piirit ja SD -kortti

Valmistele PH-, DO -piirit, SD -kortti
Valmistele PH-, DO -piirit, SD -kortti
  1. Vaihda I2C -lämpötilaan pH- ja DO -piireissä
  2. PH- ja DO -erotukset toimitetaan sarjayhteyden kautta oletuslähetys/vastaanotto -tilassa (TX/RX). Jos haluat käyttää I2C-tilan kellolinjaa (SCL) ja datalinjaa (SDA), vaihda tila (1): irrota VCC-, TX-, RX-kaapelit, (2): siirrä TX Ground for Probe, PGND (ei GND)), (3) kytke VCC virtapiiriin, (4): odota, kunnes LED muuttuu vihreästä siniseksi. Lisätietoja on sivulla 39 (pH -piirin tietolomake,
  3. Tee sama vaihe DO -piirin kanssa
  4. (jos tiedät kuinka ladata näytekoodi taululle, voit tehdä sen Sarjamonitorin kautta)
  5. Alusta SD -kortti FAT -muotoon

Vaihe 5: Valmistele ohjelmisto

Valmistele ohjelmisto
Valmistele ohjelmisto
Valmistele ohjelmisto
Valmistele ohjelmisto
Valmistele ohjelmisto
Valmistele ohjelmisto
Valmistele ohjelmisto
Valmistele ohjelmisto
  1. Lataa Arduino Integrated Development Environment (IDE),
  2. Asenna kirjasto Arduino IDE: hen:
  3. Useimmat niistä tulevat Arduino -ohjelmiston kanssa. LiquidCrystal_I2C.h on saatavilla GitHubin kautta
  4. Asenna USB -ohjain. Aitoa Arduinoa varten sinun ei ehkä tarvitse asentaa sitä. Yleistä varten sinun on asennettava CH340 -ohjain (GitHub:
  5. Tarkista, onko kortti liitetty oikein suorittamalla vilkkuva LED -testi
  6. Kuinka löytää digitaalisen 18B20 -lämpötilan MAC -osoite. Käyttämällä I2C -skannerimallia Arduino IDE: ssä anturin ollessa kytkettynä. Jokaisella laitteella on yksilöllinen MAC -osoite, joten voit käyttää yhtä monta lämpötila -anturia yhdellä jaetulla rivillä (#9). 18B20 käyttää yksijohtimista I2C: tä, joten se on I2C -viestintämenetelmän erityistapaus. Alla on yksi tapa löytää MAC - Medical Access Control (”ROM”, kun suoritat alla olevan menettelyn).

Vaihe 6: Aloita koodaus

Aloita koodaus
Aloita koodaus
  • Kopioi liitä alla oleva koodi Arduino IDE:
  • Tai lataa koodi (.ino) ja uuden ikkunan pitäisi avautua Arduino IDE: ssä.

/*

Viiteoppaat:

1. Lämpötila, ORP, pH-kirjaaja:

2. Suojattu digitaalinen (SD) kilpi:

Tämä koodi lähettää tietoja Arduino -sarjamonitoriin. Kirjoita komentoja Arduino -sarjamonitoriin EZO -pH -piirin ohjaamiseksi I2C -tilassa.

Muokattu yllä olevista opetusohjelmista, lähinnä Atlas-Scientificin I2C-koodista

Viimeksi päivitetty: Binh Nguyen 26. heinäkuuta 2017

*/

#include // ota I2C käyttöön.

#define pH_address 99 // oletusarvoinen I2C -ID -numero EZO pH -piirille.

#define DO_address 97 // EZO DO -piirin I2C -oletusnumero.

#include "RTClib.h" // Päivämäärä- ja aikafunktiot käyttämällä DS1307 RTC: tä, joka on kytketty I2C: n ja Wire lib: n kautta

RTC_DS1307 rtc;

#include // SD -kirjastoon

#include // SD -kortti tietojen tallentamiseen

const int chipSelect = 53; // täytyy selvittää Adafruit SD -katkos //

// DO = MISO, DI = MOSI, ATmega -nastassa#: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS)

char logFileName = "dataLT.txt"; // muokkaa lokitiedoston nimeä kokeilusi tunnistamiseksi, esim. PBR_01_02, datalog1

pitkä id = 1; // tunnusluku lokitilauksen syöttämiseksi

#sisältää

LiquidCrystal_I2C lcd (0x27, 20, 4);

#sisältää

#sisältää

#define ONE_WIRE_BUS 9 // määritä lämpötila -anturin nasta #

OneWire oneWire (ONE_WIRE_BUS);

DallasLämpötila -anturit (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC -osoite, yksilöllinen jokaiselle koettimelle

String dataString; // tärkein vaihtoehto kaikkien tietojen tallentamiseen

Merkkijono dataString2; // väliaikainen vaihtoehto lämpötilan/pH/DO: n tallentamiseen tulostamista varten

char tietokonetiedot [20]; // Atlas Scientificin ohje: teemme 20 tavun merkkijonon, joka pitää tietokoneelta/Macilta/muulta saapuvat tiedot.

tavu vastaanotettu_tietokoneelta = 0; // meidän on tiedettävä, kuinka monta merkkiä on vastaanotettu.

tavu serial_event = 0; // lippu, joka ilmoittaa, kun tieto on vastaanotettu tietokoneelta/mac/other.

tavukoodi = 0; // käytetään I2C -vastauskoodin säilyttämiseen.

char pH_data [20]; // teemme 20 tavun merkkijonon pH -piiristä tulevien tietojen säilyttämiseksi.

tavu in_char = 0; // käytetään 1 tavun puskurina pH -piirin sitoviin tavuihin varastoimiseksi.

tavu i = 0; // ph_data -taulukon laskuri.

int aika_ = 1800; // käytetään tarvittavan viiveen muuttamiseen riippuen EZO -luokan pH -piirille lähetetystä komennosta.

kellua pH_float; // float var, jota käytetään pitämään pH: n kelluva arvo.

char DO_data [20];

// kelluva lämpötila_C;

void setup () // laitteiston alustus.

{

Sarja.alku (9600); // ota sarjaportti käyttöön.

Wire.begin (pH_osoite); // ota I2C -portti käyttöön pH -anturille

Wire.begin (DO_address);

lcd.init ();

lcd. alku (20, 4);

lcd.taustavalo ();

lcd.home ();

lcd.print ("Hei PBR!");

lcd.setCursor (0, 1);

lcd.print ("Alustetaan…");

Serial.print ("RTC on…");

jos (! rtc.begin ())

{

Serial.println ("RTC: Reaaliaikainen kello… EI FOUND");

while (1); // (Serial.println ("RTC: Real-time clock … FOUND"));

}

Serial.println ("RUNNING");

Serial.print ("Reaaliaikainen kello…");

jos (! rtc.isrunning ())

{rtc.adjust (DateTime (F (_ DATE_), F (_ TIME_)));

}

Serial.println ("TYÖ");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("SD -kortti …"); // katso onko kortti läsnä ja voidaanko alustaa:

jos (! SD.begin (chipSelect))

{Serial.println ("Epäonnistui"); // älä tee mitään muuta:

palata;

}

Serial.println ("OK");

lcd.setCursor (0, 1);

lcd.println ("SD -kortti: OK");

Serial.print ("Lokitiedosto:");

Serial.print (logFileName);

Serial.print ("…");

Tiedosto logFile = SD.open (logFileName, FILE_WRITE); // avaa tiedosto. "datalog" ja tulosta otsikko

jos (logFile)

{

logFile.println (",,"); // osoittavat, että edellisessä ajossa oli tietoja

String header = "Päivämäärä -aika, lämpötila (C), pH, DO";

logFile.println (otsikko);

logFile.close ();

Serial.println ("VALMIS");

//Sarja.println(dataString); // tulosta myös sarjaporttiin:

}

else {Serial.println ("virhe avaamalla datalogin"); } // jos tiedosto ei ole auki, näyttöön tulee virheilmoitus:

lcd.setCursor (0, 2);

lcd.print ("Lokitiedosto:");

lcd.println (logFileName);

viive (1000);

anturit.begin ();

sensors.setResolution (ProbeP, 10); // 10 on resoluutio (10 bittiä)

lcd.clear ();

id = 0;

}

tyhjä silmukka ()

{// pääsilmukka.

dataString = Merkkijono (id);

dataString = Jono (',');

DateTime now = rtc.now ();

dataString = Jono (now.year (), DEC);

dataString += Jono ('/');

dataString += Jono (nyt.kuukausi (), DEC);

dataString += Jono ('/');

dataString += Merkkijono (now.day (), DEC);

dataString += Merkkijono ('');

dataString += Merkkijono (now.hour (), DEC);

dataString += Merkkijono (':');

dataString += Merkkijono (now.minute (), DEC);

dataString += Merkkijono (':');

dataString += Jono (nyt.second (), DEC);

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

näyttö Lämpötila (ProbeP);

Wire.beginTransmission (pH_osoite); // soittaa piirille sen ID -numerolla

Wire.write ('r'); // kova koodi r jatkuvasti luettavaksi

Wire.endTransmission (); // lopettaa I2C -tiedonsiirron.

viiveaika_); // odota oikeaa aikaa, ennen kuin piiri suorittaa ohjeensa.

Wire.requestFrom (pH_osoite, 20, 1); // soita piirille ja pyydä 20 tavua (tämä voi olla enemmän kuin tarvitsemme)

kun taas (Wire.available ()) // ovat tavuja vastaanotettavissa

{

in_char = Wire.read (); // vastaanottaa tavun.

if ((in_char> 31) && (in_char <127)) // tarkista onko hiili käyttökelpoinen (tulostettava)

{

pH_data = hiili; // lataa tämä tavu taulukkoomme.

i+= 1;

}

if (in_char == 0) // jos näemme, että meille on lähetetty null -komento.

{

i = 0; // nollaa laskuri i arvoon 0.

Wire.endTransmission (); // lopettaa I2C -tiedonsiirron.

tauko; // poistu while -silmukasta.

}

}

sarja_tapahtuma = 0; // nollaa sarjatapahtumalippu.

dataJono2 += ",";

dataString2 += Jono (pH_data);

Wire.beginTransmission (DO_address); // soittaa piirille sen ID -numerolla

Wire.write ('r');

Wire.endTransmission (); // lopettaa I2C -tiedonsiirron

viiveaika_); // odota oikeaa aikaa, ennen kuin piiri suorittaa ohjeensa

Wire.requestFrom (DO_address, 20, 1); // soita piirille ja pyydä 20 tavua

kun taas (Wire.available ()) // ovat tavuja vastaanotettavissa.

{

in_char = Wire.read (); // vastaanottaa tavun.

if ((in_char> 31) && (in_char <127)) // tarkista, onko merkki käyttökelpoinen (tulostettava), muuten in_char sisältää symbolin.txt -tiedoston alussa

{DO_data = hiili; // lataa tämä tavu taulukkoomme

i+= 1; // lisää taulukkoelementin laskuri

}

jos (in_char == 0)

{// jos näemme, että meille on lähetetty null -komento

i = 0; // nollaa laskuri i arvoon 0.

Wire.endTransmission (); // lopettaa I2C -tiedonsiirron.

tauko; // poistu while -silmukasta.

}

}

sarja_tapahtuma = 0; // nollaa sarjatapahtumalippu

pH_float = atof (pH_data);

dataJono2 += ",";

dataString2 += Jono (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Lämpötila/ pH/ DO");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

Tiedoston dataFile = SD.open (logFileName, FILE_WRITE); // avaa tiedosto. Huomaa, että vain yksi tiedosto voidaan avata kerrallaan, joten sinun on suljettava tämä tiedosto ennen uuden avaamista.

if (dataFile) // jos tiedosto on saatavilla, kirjoita sille:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // tulosta myös sarjaporttiin:

}

else {Serial.println ("virhe datalog -tiedoston avaamisessa"); } // jos tiedosto ei ole auki, näyttöön tulee virheilmoitus:

lcd.setCursor (0, 3);

lcd.print ("Käynnissä (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // suurenna yhtä tunnusta seuraavassa iteraatiossa

dataString = "";

viive (300000); // viive 5 minuuttia = 5*60*1000 ms

lcd.clear ();

} // pääsilmukan lopetus

tyhjä näyttö Lämpötila (DeviceAddress deviceAddress)

{

float tempC = sensor.getTempC (deviceAddress);

if (tempC == -127,00) lcd.print ("Lämpötilavirhe");

else dataString2 = Jono (tempC);

} // koodi päättyy tähän

  • Valitse oikea COM -portti Arduino IDE: n kautta Työkalut/Portti -kohdasta
  • Valitse oikea Arduino -levy. Käytin Mega 2560: tä, koska siinä on enemmän sisäistä muistia. Arduino Nano tai Uno toimii hyvin tällä asetuksella.
  • Tarkista ja koodata ja lataa koodi

Vaihe 7: Johdotuksen (voidaan parantaa) ja LCD -näytön tulokset

Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
Tulokset johdotuksista (voidaan parantaa) ja LCD -näytöstä
  • Huomautus: DO-anturin ja pH-anturin välinen melu ilmeni 2-3 kuukauden jatkuvan käytön jälkeen. Atlas Scientificin mukaan on suositeltavaa käyttää jännitesuojaa, kun pH- ja johtavuusanturit toimivat yhdessä. Lisätietoja on sivulla 9 (https://goo.gl/d62Rqv)
  • Kirjattavat tiedot (ensimmäisessä on tulostamattomia merkkejä ennen pH- ja DO -tietoja). Suodatin koodiksi sallimalla vain tulostettavat merkit.

Vaihe 8: Tuo tiedot ja luo kaavio

Tuo tiedot ja tee kaavio
Tuo tiedot ja tee kaavio
Tuo tiedot ja tee kaavio
Tuo tiedot ja tee kaavio
Tuo tiedot ja tee kaavio
Tuo tiedot ja tee kaavio
  1. Tietojen tuominen DATA -välilehden tekstistä (Excel 2013)
  2. Erota tiedot pilkulla (siksi pilkuista on hyötyä jokaisen syötetyn datan jälkeen)
  3. Piirrä tiedot. Jokaisessa alla olevassa datassa on noin 1700 pistettä. Mittausväli on 5 minuuttia (säädettävä). Minimi DO- ja pH -piireille tietojen lukemiseksi on 1,8 sekuntia.

Vaihe 9: Kalibrointi

Kalibrointi
Kalibrointi
  1. Digitaalinen lämpötila -anturi (18B20) voidaan kalibroida säätämällä ero suoraan. Muussa tapauksessa, jos kompensointi ja kaltevuus edellyttävät kalibrointia, voit tehdä sen muuttamalla arvoja rivillä #453, DallasTemperature.cpp / libraries / DallasTemperature -kansiossa.
  2. PH- ja DO -antureille voit kalibroida anturit mukana toimitetuilla liuoksilla. Sinun on käytettävä Atlas Scientificin mallikoodia ja noudatettava tämän tiedoston ohjeita.
  3. Noudata sivuja 26 ja 50 pH-anturin (https://goo.gl/d62Rqv) kalibrointia ja lämpötilan kompensointia varten sekä sivuja 7-8 ja 50 DO-anturin osalta (https://goo.gl/mA32mp). Lataa ensin Atlasin antama yleinen koodi uudelleen, avaa Serial Monitor ja näppäile oikea komento.

Vaihe 10: Liikaa johdotusta?

  1. Voit poistaa SD -kortin ja reaaliaikaisen kellomoduulin käyttämällä Dragino Yun Shield for Arduino -levyjä (https://goo.gl/J9PBTH). Koodi oli muutettava, jotta se toimisi Yun Shieldin kanssa. Tästä on hyvä aloittaa (https://goo.gl/c1x8Dm)
  2. Vielä liikaa johdotusta: Atlas Scientific teki oppaan EZO -piireilleen (https://goo.gl/dGyb12) ja juotetulle levylle (https://goo.gl/uWF51n). 18B20 -digitaalilämpötilan integrointi on täällä (https://goo.gl/ATcnGd). Sinun täytyy tuntea Raspbian (Debian Linux -versio) -komennot Raspberry Pi -laitteessa (https://goo.gl/549xvk)

Vaihe 11: Kuittaus:

Tämä on sivuprojektini tutkijatohtorini aikana, jonka aikana olen työskennellyt edistyksellisellä fotobioreaktorilla mikrolevien viljelemiseksi. Joten pidin välttämättömänä luottaa siihen, että osapuolet ovat antaneet edellytykset tämän toteuttamiseksi. Ensinnäkin apuraha, DE-EE0007093:”Atmospheric CO2 Enrichment and Delivery (ACED)”, Yhdysvaltain energiaministeriön, Energiatehokkuuden ja uusiutuvan energian virastolle suunnatuista leväbiopolttoaineista ja biotuotteista. Kiitän tohtori Bruce E. Rittmannia Biodesign Swette -keskuksen ympäristöbioteknologian keskuksessa Arizonan osavaltion yliopistossa siitä, että hän antoi minulle mahdollisuuden käsitellä elektroniikkaa ja Arduinoa. Minut koulutettiin ympäristötekniikkaan, lähinnä kemiaan, hieman mikrobiologiaan.