Turinys:

Kaip sukurti duomenų registratorių temperatūrai, PH ir ištirpusiam deguoniui: 11 žingsnių (su nuotraukomis)
Kaip sukurti duomenų registratorių temperatūrai, PH ir ištirpusiam deguoniui: 11 žingsnių (su nuotraukomis)

Video: Kaip sukurti duomenų registratorių temperatūrai, PH ir ištirpusiam deguoniui: 11 žingsnių (su nuotraukomis)

Video: Kaip sukurti duomenų registratorių temperatūrai, PH ir ištirpusiam deguoniui: 11 žingsnių (su nuotraukomis)
Video: Kaip parsisiųsti windows ISO 2024, Liepa
Anonim
Image
Image
Vaizdas
Vaizdas

Tikslai:

  • Sukurkite duomenų kaupiklį už ≤ 500 USD. Jame saugomi temperatūros, pH ir DO duomenys su laiko žyma ir naudojant I2C ryšį.
  • Kodėl I2C (integruota grandinė)? Galima sukrauti tiek jutiklių toje pačioje eilutėje, nes kiekvienas iš jų turi unikalų adresą.

1 žingsnis:

2 veiksmas: nusipirkite toliau nurodytas dalis:

Pirkite dalis žemiau
Pirkite dalis žemiau
  1. „Arduino MEGA 2560“, 35 USD,
  2. „Arduino“plokštės maitinimo adapteris, 5,98 USD,
  3. LCD modulis I2C (ekranas), 8,99 USD,
  4. „Real-Time Clock“(RTC) pertrauka, 7,5 USD,
  5. „MicroSD“kortelių pertraukimo lenta, 7,5 USD,
  6. 4 GB SD kortelė, 6,98 USD,
  7. Neperšlampamas skaitmeninis jutiklis DS18B20, 9,95 USD,
  8. pH zondas + rinkiniai + standartiniai buferiai, 149,15 USD,
  9. DO zondas + rinkiniai + standartiniai buferiai, 247,45 USD,
  10. Duonos lenta, trumpas kabelis, 7,98 USD,
  11. (Neprivaloma) Įtampos izoliatorius, 24 USD,

Iš viso: 510,48 USD

* Tam tikras dalis (pvz., Bendrąją plokštę) galima nusipirkti iš kitų pardavėjų („eBay“, Kinijos pardavėjo) už mažesnę kainą. Norint gauti juos iš „Atlas Scientific“, rekomenduojama naudoti pH ir DO zondus.

* Rekomenduojamas multimetras laidumui ir įtampai patikrinti. Tai kainuoja apie 10-15 USD (https://goo.gl/iAMDJo)

3 žingsnis: laidų prijungimas

Laidai
Laidai
  • Norėdami prijungti dalis, naudokite trumpiklius/„DuPont“kabelius, kaip parodyta žemiau esančiame eskize.
  • Naudokite multimetrą, kad patikrintumėte laidumą.
  • Patikrinkite teigiamos įtampos tiekimą (VCC) ir įžeminimą (GND) (nesunku supainioti, jei nesate susipažinę su grandine)
  • Prijunkite maitinimo adapterį ir patikrinkite maitinimo indikatorių kiekvienoje dalyje. Jei abejojate, naudokite daugiametrį matuoklį, kad įtampa tarp VCC ir GND būtų (5V)

4 žingsnis: Paruoškite PH, DO grandines, SD kortelę

Paruoškite PH, DO grandines, SD kortelę
Paruoškite PH, DO grandines, SD kortelę
  1. Perjunkite į I2C pH ir DO grandinėms
  2. PH ir DO pertraukos pristatomos su serijiniu ryšiu kaip numatytasis perdavimo/priėmimo (TX/RX) režimas. Jei norite naudoti I2C režimo laikrodžio liniją (SCL) ir duomenų liniją (SDA), perjunkite režimą (1): atjunkite VCC, TX, RX kabelius, (2): perjunkite TX į „Ground for Probe“, PGND (ne GND)), (3) prijunkite VCC prie grandinės, (4): palaukite, kol šviesos diodas pasikeis iš žalios į mėlyną. Daugiau informacijos rasite 39 puslapyje (pH grandinės duomenų lapas,
  3. Atlikite tą patį veiksmą su DO grandine
  4. (jei žinote, kaip įkelti pavyzdinį kodą į lentą, galite tai padaryti naudodami serijinį monitorių)
  5. Formatuokite SD kortelę į FAT formatą

5 žingsnis: Paruoškite programinę įrangą

Paruoškite programinę įrangą
Paruoškite programinę įrangą
Paruoškite programinę įrangą
Paruoškite programinę įrangą
Paruoškite programinę įrangą
Paruoškite programinę įrangą
Paruoškite programinę įrangą
Paruoškite programinę įrangą
  1. Atsisiųskite „Arduino Integrated Development Environment“(IDE),
  2. Įdiekite biblioteką į „Arduino IDE“:
  3. Dauguma jų yra su „Arduino“programine įranga. „LiquidCrystal_I2C.h“galima rasti per „GitHub“https://goo.gl/chLrS7
  4. Įdiekite USB tvarkyklę. Jei norite naudoti tikrą „Arduino“, jums jo nereikia įdiegti. Norėdami gauti bendrą, turite įdiegti CH340 tvarkyklę („GitHub“:
  5. Patikrinkite, ar teisingai prijungėte plokštę, atlikdami mirksintį LED testą
  6. Kaip rasti 18B20 skaitmeninės temperatūros MAC adresą. Naudojant „I2C“skaitytuvo šabloną „Arduino IDE“, kai zondas prijungtas. Kiekvienas įrenginys turi unikalų MAC adresą, todėl galite naudoti tiek pat temperatūros zondų su viena bendra eilute (#9). 18B20 naudojamas vieno laido I2C, todėl tai yra ypatingas I2C ryšio metodo atvejis. Žemiau yra vienas būdas rasti MAC - medicinos prieigos kontrolė („ROM“, kai atliekate toliau nurodytą procedūrą).

6 veiksmas: pradėkite kodavimą

Pradėkite kodavimą
Pradėkite kodavimą
  • Nukopijuokite žemiau esantį kodą į „Arduino IDE“:
  • Arba atsisiųskite kodą (.ino) ir „Arduino IDE“turėtų pasirodyti naujas langas.

/*

Nuorodos pamokos:

1. Temperatūra, ORP, pH kaupiklis:

2. Saugus skaitmeninis (SD) skydas:

Šis kodas išves duomenis į „Arduino“serijos monitorių. Įveskite komandas į „Arduino“serijinį monitorių, kad valdytumėte EZO pH grandinę I2C režimu.

Pakeistas iš aukščiau paminėtų vadovėlių, daugiausia iš „Atlas-Scientific“I2C kodo

Paskutinį kartą atnaujinta: Binh Nguyen, 2017 m. Liepos 26 d

*/

#include // įgalinti I2C.

#define pH_address 99 // numatytasis EZO pH grandinės I2C ID numeris.

#define DO_address 97 // numatytasis EZO DO grandinės I2C ID numeris.

#include "RTClib.h" // Datos ir laiko funkcijos naudojant DS1307 RTC, prijungtą per I2C ir "Wire lib"

RTC_DS1307 rtc;

#include // SD bibliotekai

#include // SD kortelė duomenims saugoti

const int chipSelect = 53; // reikia išsiaiškinti „Adafruit SD“pertrauką //

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

char logFileName = "dataLT.txt"; // modifikuokite logFileName, kad nustatytumėte savo eksperimentą, pvz., PBR_01_02, datalog1

ilgas id = 1; // ID numeris žurnalo tvarkai įvesti

#įtraukti

LiquidCrystal_I2C LCD (0x27, 20, 4);

#įtraukti

#įtraukti

#define ONE_WIRE_BUS 9 // apibrėžkite temperatūros zondo kaištį #

„OneWire oneWire“(ONE_WIRE_BUS);

Dalaso temperatūros jutikliai (& oneWire);

„DeviceAddress ProbeP“= {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // MAC adresas, unikalus kiekvienam zondui

String dataString; // pagrindinis visų duomenų saugojimo variantas

Eilutės duomenysString2; // laikinas variantas temperatūrai/pH/DO išsaugoti spausdinti

char kompiuteriniai duomenys [20]; // instrukcija iš „Atlas Scientific“: mes sudarome 20 baitų simbolių masyvą, kad būtų galima saugoti gaunamus duomenis iš kompiuterio/„Mac“/kito.

baitas gautas_kompiuteriu = 0; // turime žinoti, kiek simbolių buvo gauta.

baitas serial_event = 0; // vėliava, signalizuojanti, kai duomenys gauti iš kompiuterio/mac/other.

baitų kodas = 0; // naudojamas I2C atsako kodui laikyti.

anglis pH_data [20]; // sukuriame 20 baitų simbolių masyvą, kad būtų galima laikyti gaunamus duomenis iš pH grandinės.

baitas in_char = 0; // naudojamas kaip 1 baitų buferis, kad būtų galima laikyti surištus baitus iš pH grandinės.

baitas i = 0; // skaitiklis, naudojamas masyvui ph_data.

int laikas_ = 1800; // naudojamas norint pakeisti delsą, priklausomai nuo komandos, siunčiamos į EZO klasės pH grandinę.

plūdė pH_float; // float var, naudojamas pH plūdės vertei palaikyti.

char DO_data [20];

// plūdės temp_C;

void setup () // aparatūros inicijavimas.

{

Serial.begin (9600); // įjungti serijinį prievadą.

Wire.begin (pH_address); // įgalinti pH zondo I2C prievadą

Wire.begin (DO_address);

lcd.init ();

LCD. pradžia (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Sveiki PBR!");

lcd.setCursor (0, 1);

lcd.print ("Inicijuojama …");

Serial.print („RTC yra…“);

jei (! rtc.begin ())

{

Serial.println ("RTC: laikrodis realiuoju laiku… NOT FOUND");

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

}

Serial.println („BĖGIMAS“);

Serial.print („Laikrodis realiuoju laiku …“);

jei (! rtc.isrunning ())

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

}

Serial.println ("DARBAS");

lcd.setCursor (0, 0);

lcd.println ("RTC: Gerai");

Serial.print („SD kortelė …“); // pažiūrėkite, ar kortelė yra ir ar ją galima inicijuoti:

if (! SD.begin (chipSelect))

{Serial.println („Nepavyko“); // daugiau nieko nedaryk:

grįžti;

}

Serial.println („Gerai“);

lcd.setCursor (0, 1);

lcd.println ("SD kortelė: gerai");

Serial.print („Žurnalo failas:“);

Serial.print (logFileName);

Serial.print ("…");

Failas logFile = SD.open (logFileName, FILE_WRITE); // atidaryti failą. "datalog" ir atspausdinkite antraštę

if (logFile)

{

logFile.println (",,"); // nurodykite, kad ankstesniame bandyme buvo duomenų

Styginių antraštė = "Data -laikas, temperatūra (C), pH, DO";

logFile.println (antraštė);

logFile.close ();

Serial.println ("READY");

//Serial.println(dataString); // taip pat spausdinkite į nuoseklųjį prievadą:

}

else {Serial.println ("klaida atidarant duomenų katalogą"); } // jei failas nėra atidarytas, pasirodys klaida:

lcd.setCursor (0, 2);

lcd.print ("Žurnalo failas:");

lcd.println (logFileName);

vėlavimas (1000);

jutikliai.pradėti ();

sensor.setResolution (ProbeP, 10); // 10 yra skiriamoji geba (10 bitų)

lcd.clear ();

id = 0;

}

tuštumos kilpa ()

{// pagrindinė kilpa.

dataString = Styga (id);

dataString = Styga (',');

DateTime dabar = rtc.now ();

dataString = Styga (dabar.metai (), DEC);

dataString += Styga ('/');

dataString += Styga (dabar.mėnuo (), DEC);

dataString += Styga ('/');

dataString += Styga (dabar.diena (), DEC);

dataString += Styga ('');

dataString += Styga (dabar.val. (), DEC);

dataString += Eilutė (':');

dataString += Styga (dabar.minutė (), DEC);

dataString += Eilutė (':');

dataString += Styga (dabar.sekundė (), DEC);

lcd.home ();

lcd.print (dataString);

sensor.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // skambinti grandinei jos ID numeriu

Wire.write ('r'); // kietas kodas r, kurį reikia nuolat skaityti

Wire.endTransmission (); // baigti I2C duomenų perdavimą.

vėlavimas (laikas_); // palaukite teisingo laiko, kol grandinė užbaigs nurodymus.

Wire.requestFrom (pH_address, 20, 1); // paskambinkite grandinei ir paprašykite 20 baitų (tai gali būti daugiau nei mums reikia)

o (Wire.available ()) // ar yra baitų, kuriuos reikia gauti

{

in_char = Wire.read (); // gauti bait.

if ((in_char> 31) && (in_char <127)) // patikrinkite, ar anglis yra tinkama naudoti (spausdinama)

{

pH_ duomenys = in_char; // įkelti šį baitą į mūsų masyvą.

i+= 1;

}

if (in_char == 0) // jei matome, kad mums buvo išsiųsta null komanda.

{

i = 0; // atstatyti skaitiklį i į 0.

Wire.endTransmission (); // baigti I2C duomenų perdavimą.

pertrauka; // išeiti iš ciklo while.

}

}

serial_event = 0; // iš naujo nustatyti serijinio įvykio vėliavą.

dataString2 += ",";

dataString2 += Styga (pH_data);

Wire.beginTransmission (DO_address); // skambinti grandinei jos ID numeriu

Wire.write ('r');

Wire.endTransmission (); // baigti I2C duomenų perdavimą

vėlavimas (laikas_); // palaukite teisingo laiko, kol grandinė užbaigs nurodymus

Wire.requestFrom (DO_address, 20, 1); // paskambinkite grandinei ir paprašykite 20 baitų

o (Wire.available ()) // ar yra baitų, kuriuos reikia gauti.

{

in_char = Wire.read (); // gauti bait.

if ((in_char> 31) && (in_char <127)) // patikrinkite, ar char yra tinkamas naudoti (atspausdinamas), priešingu atveju in_char yra simbolis.txt failo pradžioje

{DO_data = in_char; // įkelti šį baitą į mūsų masyvą

i+= 1; // įtraukite masyvo elemento skaitiklį

}

jei (in_char == 0)

{// jei matome, kad mums buvo išsiųsta null komanda

i = 0; // atstatyti skaitiklį i į 0.

Wire.endTransmission (); // baigti I2C duomenų perdavimą.

pertrauka; // išeiti iš ciklo while.

}

}

serial_event = 0; // iš naujo nustatyti serijinio įvykio vėliavą

pH_float = atof (pH_data);

dataString2 += ",";

dataString2 += Styga (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Temperatūra/ pH/ DO");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString += ',';

dataString += dataString2;

Failo duomenysFailas = SD.open (logFileName, FILE_WRITE); // atidaryti failą. atkreipkite dėmesį, kad vienu metu galima atidaryti tik vieną failą, todėl prieš atidarydami kitą, turite jį uždaryti.

if (dataFile) // jei failas yra prieinamas, rašykite jam:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // taip pat spausdinkite į nuoseklųjį prievadą:

}

else {Serial.println ("klaida atidarant duomenų katalogo failą"); } // jei failas nėra atidarytas, pasirodys klaida:

lcd.setCursor (0, 3);

lcd.print ("Bėga (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // padidinkite vieną ID kitą kartojimą

dataString = "";

vėlavimas (300 000); // uždelsimas 5 minutės = 5*60*1000 ms

lcd.clear ();

} // pabaigos pagrindinė kilpa

void display Temperatūra (DeviceAddress deviceAddress)

{

plūdės tempC = sensor.getTempC (deviceAddress);

if (tempC == -127,00) lcd.print ("Temperatūros klaida");

else dataString2 = Styga (tempC);

} // kodas baigiasi čia

  • Pasirinkite tinkamą COM prievadą per „Arduino IDE“skiltyje Įrankiai/prievadas
  • Pasirinkite tinkamą „Arduino“lentą. Aš naudoju „Mega 2560“, nes jis turi daugiau vidinės atminties. „Arduino Nano“arba „Uno“puikiai veikia su šia sąranka.
  • Patikrinkite ir koduokite bei įkelkite kodą

7 žingsnis: laidų (galima patobulinti) ir LCD ekrano rezultatai

Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
Laidų (galima patobulinti) ir LCD ekrano rezultatai
  • Pastaba: po 2-3 mėnesių nepertraukiamo veikimo susidūriau su triukšmu nuo DO zondo iki pH zondo. Pasak „Atlas Scientific“, įtampos izoliatorius yra rekomenduojamas, kai pH, laidumo zondai veikia kartu. Daugiau informacijos rasite 9 puslapyje (https://goo.gl/d62Rqv)
  • Įrašyti duomenys (pirmasis turi nespausdintus simbolius prieš pH ir DO duomenis). Filtravau pagal kodą, leisdamas tik spausdinamus simbolius.

8 veiksmas: importuokite duomenis ir sudarykite diagramą

Importuokite duomenis ir sudarykite diagramą
Importuokite duomenis ir sudarykite diagramą
Importuokite duomenis ir sudarykite diagramą
Importuokite duomenis ir sudarykite diagramą
Importuokite duomenis ir sudarykite diagramą
Importuokite duomenis ir sudarykite diagramą
  1. Importuoti duomenis iš skirtuko DATA skirtuko teksto („Excel 2013“)
  2. Atskirkite duomenis kableliais (todėl po kiekvieno įvestų duomenų kableliai yra naudingi)
  3. Nubraižykite duomenis. Kiekviename žemiau esančiame duomenyje yra apie 1700 taškų. Matavimo intervalas yra 5 minutės (reguliuojamas). Minimalus DO ir pH grandinių duomenų nuskaitymas yra 1,8 sek.

9 žingsnis: kalibravimas

Kalibravimas
Kalibravimas
  1. Skaitmeninį temperatūros jutiklį (18B20) galima sukalibruoti, sureguliuojant skirtumą tiesiai į. Priešingu atveju, jei kompensaciją ir nuolydį reikėjo kalibruoti, tai galite padaryti pakeisdami 453 eilutės „DallasTemperature.cpp“reikšmes aplanke / libraries / DallasTemperature.
  2. Jei naudojate pH ir DO zondus, zondus galite kalibruoti su pridedamais tirpalais. Turite naudoti „Atlas Scientific“kodo pavyzdį ir vykdyti šio failo nurodymus.
  3. Prašome sekti 26 ir 50 puslapius, kad gautumėte pH zondą (https://goo.gl/d62Rqv), kad gautumėte kalibravimą ir temperatūros kompensavimą, taip pat 7-8 ir 50 puslapius, jei reikia DO zondo (https://goo.gl/mA32mp). Pirmiausia iš naujo įkelkite „Atlas“pateiktą bendrąjį kodą, atidarykite „Serial Monitor“ir įveskite tinkamą komandą.

10 žingsnis: per daug laidų?

  1. Galite pašalinti SD kortelę ir realaus laiko laikrodžio modulį naudodami „Dragino Yun Shield“, skirtą „Arduino“plokštėms (https://goo.gl/J9PBTH). Kodą reikėjo pakeisti, kad jis veiktų su „Yun Shield“. Čia gera vieta pradėti (https://goo.gl/c1x8Dm)
  2. Vis dar per daug laidų: „Atlas Scientific“sukūrė vadovą savo EZO grandinėms (https://goo.gl/dGyb12) ir be litavimo plokštei (https://goo.gl/uWF51n). Čia integruota 18B20 skaitmeninė temperatūra (https://goo.gl/ATcnGd). Turite būti susipažinę su Raspbian („Debian Linux“versija), veikiančia „Raspberry Pi“, komandomis (https://goo.gl/549xvk)

11 veiksmas: patvirtinimas:

Tai yra mano šalutinis projektas po doktorantūros tyrimų, kuriame dirbau prie išankstinio fotobioreaktoriaus, kad auginčiau mikro dumblius. Taigi aš maniau, kad būtina pripažinti, kad šalys sudarė sąlygas, kad tai įvyktų. Pirma, dotacija, DE-EE0007093: „Atmosferos CO2 sodrinimas ir tiekimas (ACED)“, iš JAV Energetikos departamento, Energijos vartojimo efektyvumo ir atsinaujinančiosios energijos biokuro ir bioproduktų biuro. Dėkoju daktarui Bruce'ui E. Rittmannui iš Arizonos valstijos universiteto Biodesign Swette aplinkos biotechnologijų centro, kad suteikė man galimybę užsiimti elektronika ir „Arduino“. Buvau apmokytas aplinkos inžinerijos, daugiausia chemijos, šiek tiek mikrobiologijos.

Rekomenduojamas: