Kako narediti zapisovalnik podatkov za temperaturo, PH in raztopljeni kisik: 11 korakov (s slikami)
Kako narediti zapisovalnik podatkov za temperaturo, PH in raztopljeni kisik: 11 korakov (s slikami)
Anonim
Image
Image
Slika
Slika

Cilji:

  • Naredite zapisovalnik podatkov za ≤ 500 USD. Shranjuje podatke o temperaturi, pH in DO s časovnim žigom in uporabo komunikacije I2C.
  • Zakaj I2C (Inter-Integrated Circuit)? V isto vrstico lahko zložite toliko senzorjev, saj ima vsak od njih edinstven naslov.

Korak 1:

Korak: Kupite spodnje dele:

Kupite spodnje dele
Kupite spodnje dele
  1. Arduino MEGA 2560, 35 USD,
  2. Napajalnik za ploščo Arduino, 5,98 USD,
  3. LCD modul I2C (zaslon), 8,99 USD,
  4. Zlom v realnem času (RTC), 7,5 USD,
  5. Odklopna kartica MicroSD, 7,5 USD,
  6. 4 GB SD kartica, 6,98 USD,
  7. Vodoodporen digitalni senzor DS18B20, 9,95 USD,
  8. pH-sonda + kompleti + standardni pufri, 149,15 USD, https://www.atlas-sci Scientific.com/product_pages/kit…
  9. Sonda DO + kompleti + standardni odbojniki, 247,45 USD, https://www.atlas-sci Scientific.com/product_pages/kit…
  10. Ogledna plošča, mostični kabel, 7,98 USD,
  11. (Izbirno) Izolator napetosti, 24 USD, https://www.atlas-sci Scientific.com/product_pages/cir…

Skupaj: 510,48 USD

* Nekatere dele (na primer generično ploščo) lahko kupite pri drugih prodajalcih (eBay, kitajski prodajalec) po nižji ceni. Sonde pH in DO priporočamo, da jih dobite pri Atlas Scientific.

* Za preverjanje prevodnosti in napetosti je priporočljiv multimeter. Stane približno 10-15 USD (https://goo.gl/iAMDJo)

3. korak: Ožičenje

Ožičenje
Ožičenje
  • Za priključitev delov uporabite mostične/DuPont kable, kot je prikazano na spodnji skici.
  • Preverite prevodnost z multimetrom.
  • Preverite napajalno napetost (VCC) in ozemljitev (GND) (enostavno je zamenjati, če niste seznanjeni s tokokrogom)
  • Priključite napajalnik in preverite indikator napajanja na vsakem delu. Če ste v dvomih, z večmetrom preverite napetost med VCC in GND (5V)

4. korak: Pripravite vezja PH, DO, kartico SD

Pripravite vezja PH, DO, kartico SD
Pripravite vezja PH, DO, kartico SD
  1. Za vezja pH in DO preklopite na I2C
  2. Prekinitve pH in DO so poslane s serijsko komunikacijo kot privzetim načinom Prenos/sprejem (TX/RX). Če želite uporabiti način I2C Clock line (SCL) in Data line (SDA), preklopite način za (1): odklopite kable VCC, TX, RX, (2): preskočite TX na ozemljitev za sondo, PGND (ne GND), (3) priključite VCC v vezje, (4): počakajte, da se LED spremeni iz zelene v modro. Več podrobnosti preverite na strani 39 (Tehnični list za pH vezje,
  3. Naredite isti korak z vezjem DO
  4. (če veste, kako na ploščo naložiti vzorčno kodo, lahko to storite prek serijskega monitorja)
  5. Formatirajte kartico SD v format FAT

5. korak: Pripravite programsko opremo

Pripravite programsko opremo
Pripravite programsko opremo
Pripravite programsko opremo
Pripravite programsko opremo
Pripravite programsko opremo
Pripravite programsko opremo
Pripravite programsko opremo
Pripravite programsko opremo
  1. Prenesite Arduino integrirano razvojno okolje (IDE),
  2. Namestite knjižnico v Arduino IDE:
  3. Večina jih ima programsko opremo Arduino. LiquidCrystal_I2C.h je na voljo prek GitHub
  4. Namestite gonilnik za USB. Za originalni Arduino vam morda ne bo treba namestiti. Za splošnega morate namestiti gonilnik CH340 (GitHub:
  5. Preverite, ali ste ploščo pravilno priključili, tako da zaženete utripajoči LED -test
  6. Kako najti naslov MAC digitalne temperature 18B20. Uporaba predloge optičnega bralnika I2C v Arduino IDE z vključeno sondo. Vsaka naprava ima edinstven naslov MAC, tako da lahko uporabite čim več temperaturnih sond z eno skupno linijo (#9). 18B20 uporablja enožični I2C, zato je poseben primer komunikacijske metode I2C. Spodaj je ena metoda za iskanje MAC - Medical Access Control (»ROM«, ko zaženete spodnji postopek).

6. korak: Začnite kodirati

Začni kodiranje
Začni kodiranje
  • Kopirajte prilepite spodnjo kodo v Arduino IDE:
  • Ali prenesite kodo (.ino) in v Arduino IDE bi se moralo pojaviti novo okno.

/*

Referenčne vaje:

1. Temperatura, ORP, zapisovalnik pH:

2. Zaščiten digitalni (SD) ščit:

Ta koda bo oddajala podatke na serijski monitor Arduino. Vnesite ukaze v serijski monitor Arduino za nadzor pH kroga EZO v načinu I2C.

Spremenjeno iz zgoraj navedenih vadnic, večinoma iz kode I2C podjetja Atlas-Scientific

Zadnja posodobitev: 26. julij 2017, avtor Binh Nguyen

*/

#include // omogoči I2C.

#define pH_adrress 99 // privzeta ID številka I2C za pH vezje EZO.

#define DO_address 97 // privzeta ID številka I2C za vezje EZO DO.

#include "RTClib.h" // Funkcije datuma in časa z DS1307 RTC, povezanim prek I2C in Wire lib

RTC_DS1307 rtc;

#include // Za knjižnico SD

#include // SD kartica za shranjevanje podatkov

const int chipSelect = 53; // moram ugotoviti, ali je Adafruit SD prekinil //

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

char logFileName = "dataLT.txt"; // spremenite logFileName, da identificirate vaš poskus, za exampe PBR_01_02, datalog1

dolg id = 1; // id številka za vnos dnevnega reda

#vključi

LiquidCrystal_I2C LCD (0x27, 20, 4);

#vključi

#vključi

#define ONE_WIRE_BUS 9 // določite pin # za temperaturno sondo

OneWire oneWire (ONE_WIRE_BUS);

Senzorji temperature Dallas (& oneWire);

Sonda DeviceAddressP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC naslov, edinstven za vsako sondo

String dataString; // glavna varianta za shranjevanje vseh podatkov

Niz dataString2; // začasna varianta za shranjevanje Temperature/pH/DO za tiskanje

računalniški podatki char [20]; // navodilo Atlas Scientific: naredimo 20 -bajtno niz znakov za shranjevanje dohodnih podatkov iz računalnika/mac/drugega.

bajt sprejet_iz_računalnika = 0; // vedeti moramo, koliko znakov je bilo prejetih.

byte serial_event = 0; // zastava za signal, ko so podatki prejeti iz pc/mac/other.

bajtna koda = 0; // uporablja se za shranjevanje odzivne kode I2C.

char pH_data [20]; // naredimo niz znakov z 20 bajti za shranjevanje vhodnih podatkov iz pH vezja.

bajt in_char = 0; // uporabljamo kot 1 -bajtni medpomnilnik za shranjevanje v vezanih bajtih iz pH vezja.

bajt i = 0; // števec, uporabljen za matriko ph_data.

int čas_ = 1800; // se uporablja za spreminjanje potrebne zakasnitve, odvisno od ukaza, poslanega pH -vezju razreda EZO.

float pH_float; // float var, ki se uporablja za držanje plavajoče vrednosti pH.

char DO_data [20];

// plavajoča temp_C;

void setup () // inicializacija strojne opreme.

{

Serial.begin (9600); // omogoči serijska vrata.

Wire.begin (pH_naslov); // omogočimo vrata I2C za pH sondo

Wire.begin (naslov_DO);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Pozdravljeni PBR!");

lcd.setCursor (0, 1);

lcd.print ("Začetek …");

Serial.print ("RTC je …");

če (! rtc.begin ())

{

Serial.println ("RTC: ura v realnem času … NI NAJDEN");

while (1); // (Serial.println ("RTC: Ura v realnem času … NAJDEN"));

}

Serial.println ("RUNNING");

Serial.print ("Ura v realnem času …");

if (! rtc.isrunning ())

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

}

Serial.println ("DELO");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("kartica SD …"); // preverite, ali je kartica prisotna in jo je mogoče inicializirati:

if (! SD.begin (chipSelect))

{Serial.println ("Neuspešno"); // ne naredi nič več:

vrnitev;

}

Serial.println ("V redu");

lcd.setCursor (0, 1);

lcd.println ("Kartica SD: V redu");

Serial.print ("Datoteka dnevnika:");

Serial.print (logFileName);

Serial.print ("…");

Datoteka logFile = SD.open (logFileName, FILE_WRITE); // odpremo datoteko. "datalog" in natisnite glavo

if (logFile)

{

logFile.println (",,,"); // označuje, da so bili podatki v prejšnjem zagonu

Niz glave = "Datum -čas, temperatura (C), pH, DO";

logFile.println (glava);

logFile.close ();

Serial.println ("READY");

//Serial.println(dataString); // tiskanje tudi na serijska vrata:

}

else {Serial.println ("napaka pri odpiranju podatkovnega dnevnika"); } // če datoteka ni odprta, se prikaže napaka:

lcd.setCursor (0, 2);

lcd.print ("Datoteka dnevnika:");

lcd.println (logFileName);

zamuda (1000);

sensors.begin ();

sensors.setResolution (ProbeP, 10); // 10 je ločljivost (10bit)

lcd.clear ();

id = 0;

}

void loop ()

{// glavna zanka.

dataString = Niz (id);

dataString = Niz (',');

DateTime zdaj = rtc.now ();

dataString = String (zdaj.leto (), DEC);

dataString += niz ('/');

dataString += String (zdaj.mesec (), DEC);

dataString += niz ('/');

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

dataString += niz ('');

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

dataString += niz (':');

dataString += niz (zdaj.minute (), DEC);

dataString += niz (':');

dataString += String (zdaj.sekunda (), DEC);

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_naslov); // pokličemo vezje po ID številki

Wire.write ('r'); // trda koda r za neprekinjeno branje

Wire.endTransmission (); // zaključimo prenos podatkov I2C.

zamuda (čas_); // počakajte na pravilen čas, da vezje zaključi navodila.

Wire.requestFrom (pH_naslov, 20, 1); // pokličemo vezje in zahtevamo 20 bajtov (to je lahko več, kot potrebujemo)

medtem ko (Wire.available ()) // obstajajo bajti za sprejem

{

in_char = Wire.read (); // prejemanje bajta.

if ((in_char> 31) && (in_char <127)) // preverite, ali je znak uporaben (za tiskanje)

{

pH_podatki = v_ogljiku; // naložimo ta bajt v naš niz.

i+= 1;

}

if (in_char == 0) // če vidimo, da smo prejeli ničelni ukaz.

{

i = 0; // ponastavimo števec i na 0.

Wire.endTransmission (); // zaključimo prenos podatkov I2C.

prekiniti; // zapustimo zanko while.

}

}

serial_event = 0; // ponastavimo zastavico serijskega dogodka.

dataString2 += ",";

dataString2 += Niz (pH_podatki);

Wire.beginTransmission (DO_address); // pokličemo vezje po ID številki

Wire.write ('r');

Wire.endTransmission (); // zaključimo prenos podatkov I2C

zamuda (čas_); // počakajte na pravilen čas, da vezje zaključi navodila

Wire.requestFrom (DO_address, 20, 1); // pokličemo vezje in zahtevamo 20 bajtov

medtem ko (Wire.available ()) // obstajajo bajti za sprejem.

{

in_char = Wire.read (); // prejemanje bajta.

if ((in_char> 31) && (in_char <127)) // preverite, ali je char uporaben (za tiskanje), sicer in_char vsebuje simbol na začetku v datoteki.txt

{DO_data = in_char; // naložimo ta bajt v naš niz

i+= 1; // vnese števec za element matrike

}

če (in_char == 0)

{// če vidimo, da smo prejeli ničelni ukaz

i = 0; // ponastavimo števec i na 0.

Wire.endTransmission (); // zaključimo prenos podatkov I2C.

prekiniti; // zapustimo zanko while.

}

}

serial_event = 0; // ponastavimo zastavico serijskega dogodka

pH_plava = atof (pH_podatki);

dataString2 += ",";

dataString2 += niz (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Temperatura/ pH/ DO");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

Datoteka fileFile = SD.open (logFileName, FILE_WRITE); // odpremo datoteko. Upoštevajte, da je lahko hkrati odprta samo ena datoteka, zato morate to zapreti, preden odprete drugo.

if (dataFile) // če je datoteka na voljo, ji napišite:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // tiskanje tudi na serijska vrata:

}

else {Serial.println ("napaka pri odpiranju datoteke podatkovnega dnevnika"); } // če datoteka ni odprta, se prikaže napaka:

lcd.setCursor (0, 3);

lcd.print ("Tek (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // naslednji iteraciji povečaj en ID

dataString = "";

zamuda (300000); // zamuda 5 minut = 5*60*1000 ms

lcd.clear ();

} // zaključi glavno zanko

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print ("Napaka temperature");

else dataString2 = Niz (tempC);

} // koda se konča tukaj

  • Izberite prava vrata COM prek Arduino IDE pod Orodja/Vrata
  • Izberite pravo ploščo Arduino. Uporabil sem Mega 2560, ker ima več notranjega pomnilnika. Arduino Nano ali Uno dobro deluje s to nastavitvijo.
  • Preverite, kodirajte in naložite kodo

Korak 7: Rezultati ožičenja (mogoče ga je izboljšati) in LCD zaslona

Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
Rezultati o ožičenju (mogoče ga je izboljšati) in LCD zaslonu
  • Opomba: Po 2-3 mesecih neprekinjenega delovanja sem naletel na hrup od sonde DO do pH sonde. Po podatkih Atlas Scientific je priporočljiv vmesni napetostni izolator, kadar pH, prevodne sonde delujejo skupaj. Več podrobnosti je na strani 9 (https://goo.gl/d62Rqv)
  • Zabeleženi podatki (prvi ima natisnjene znake pred podatki o pH in DO). Filtriral sem v kodo tako, da sem dovolil samo znake za tiskanje.

8. korak: Uvozite podatke in naredite graf

Uvozite podatke in naredite graf
Uvozite podatke in naredite graf
Uvozite podatke in naredite graf
Uvozite podatke in naredite graf
Uvozite podatke in naredite graf
Uvozite podatke in naredite graf
  1. Uvoz podatkov iz zavihka Text Under DATA (Excel 2013)
  2. Podatke ločite z vejico (zato je vejica po vsakem vnosu podatkov koristna)
  3. Narišite podatke. Vsak spodnji podatek ima približno 1700 točk. Merilni interval je 5 minut (nastavljiv). Najmanjša vrednost za DO in pH vezja za branje podatkov je 1,8 sekunde.

9. korak: Umerjanje

Praznovanje
Praznovanje
  1. Digitalni temperaturni senzor (18B20) je mogoče umeriti tako, da razliko prilagodite neposredno na. V nasprotnem primeru, če sta kompenzacija in naklon zahtevala kalibracijo, lahko to storite tako, da spremenite vrednosti v vrstici #453, DallasTemperature.cpp v mapi / libraries / DallasTemperature.
  2. Za pH in DO sonde lahko kalibrirate sonde s spremljajočimi raztopinami. Uporabiti morate vzorčno kodo Atlas Scientific in slediti navodilom te datoteke.
  3. Prosimo, da sledite stranem 26 in 50 za pH-sondo (https://goo.gl/d62Rqv) za umerjanje in temperaturno kompenzacijo ter strani 7-8 in 50 za sondo DO (https://goo.gl/mA32mp). Najprej znova naložite generično kodo, ki jo ponuja Atlas, odprite serijski monitor in vnesite ustrezen ukaz.

10. korak: Preveč ožičenja?

  1. Kartico SD in modul ure v realnem času lahko odstranite z uporabo Dragino Yun Shield za plošče Arduino (https://goo.gl/J9PBTH). Kodo je bilo treba spremeniti za delo z Yun Shieldom. Tukaj je dober začetek (https://goo.gl/c1x8Dm)
  2. Še vedno preveč ožičenja: Atlas Scientific je pripravil vodnik za svoja vezja EZO (https://goo.gl/dGyb12) in ploščo brez spajkanja (https://goo.gl/uWF51n). Tukaj je vključena digitalna temperatura 18B20 (https://goo.gl/ATcnGd). Morate biti seznanjeni z ukazi v Raspbianu (različici Debian Linuxa), ki se izvaja na Raspberry Pi (https://goo.gl/549xvk)

11. korak: Potrditev:

To je moj stranski projekt med podoktorskim raziskovanjem, pri katerem sem delal na predhodnem fotobioreaktorju za gojenje mikroalg. Zato se mi je zdelo potrebno priznati, da so stranke zagotovile pogoje za to. Prvič, nepovratna sredstva DE-EE0007093: „Obogatitev in dobava atmosferskega CO2 (ACED)“, Ministrstva za energijo ZDA, Urada za energetsko učinkovitost in obnovljive vire energije, usmerjena v biogoriva in bioproizvode iz alg. Zahvaljujem se dr. Bruceu E. Rittmannu iz Biodesign Swette Centra za okoljsko biotehnologijo, Državna univerza v Arizoni, ker mi je dal priložnost, da se posvetim elektroniki in Arduinu. Izobraževal sem se za okoljsko tehniko, večinoma kemijo, nekaj mikrobiologije.