Kazalo:
- Korak 1:
- Korak: Kupite spodnje dele:
- 3. korak: Ožičenje
- 4. korak: Pripravite vezja PH, DO, kartico SD
- 5. korak: Pripravite programsko opremo
- 6. korak: Začnite kodirati
- Korak 7: Rezultati ožičenja (mogoče ga je izboljšati) in LCD zaslona
- 8. korak: Uvozite podatke in naredite graf
- 9. korak: Umerjanje
- 10. korak: Preveč ožičenja?
- 11. korak: Potrditev:
2025 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2025-01-13 06:58
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:
- Arduino MEGA 2560, 35 USD,
- Napajalnik za ploščo Arduino, 5,98 USD,
- LCD modul I2C (zaslon), 8,99 USD,
- Zlom v realnem času (RTC), 7,5 USD,
- Odklopna kartica MicroSD, 7,5 USD,
- 4 GB SD kartica, 6,98 USD,
- Vodoodporen digitalni senzor DS18B20, 9,95 USD,
- pH-sonda + kompleti + standardni pufri, 149,15 USD, https://www.atlas-sci Scientific.com/product_pages/kit…
- Sonda DO + kompleti + standardni odbojniki, 247,45 USD, https://www.atlas-sci Scientific.com/product_pages/kit…
- Ogledna plošča, mostični kabel, 7,98 USD,
- (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
- 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
- Za vezja pH in DO preklopite na I2C
- 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,
- Naredite isti korak z vezjem DO
- (če veste, kako na ploščo naložiti vzorčno kodo, lahko to storite prek serijskega monitorja)
- Formatirajte kartico SD v format FAT
5. korak: Pripravite programsko opremo
- Prenesite Arduino integrirano razvojno okolje (IDE),
- Namestite knjižnico v Arduino IDE:
- Večina jih ima programsko opremo Arduino. LiquidCrystal_I2C.h je na voljo prek GitHub
- Namestite gonilnik za USB. Za originalni Arduino vam morda ne bo treba namestiti. Za splošnega morate namestiti gonilnik CH340 (GitHub:
- Preverite, ali ste ploščo pravilno priključili, tako da zaženete utripajoči LED -test
- 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
- 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
- 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
- Uvoz podatkov iz zavihka Text Under DATA (Excel 2013)
- Podatke ločite z vejico (zato je vejica po vsakem vnosu podatkov koristna)
- 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
- 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.
- Za pH in DO sonde lahko kalibrirate sonde s spremljajočimi raztopinami. Uporabiti morate vzorčno kodo Atlas Scientific in slediti navodilom te datoteke.
- 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?
- 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)
- Š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.