Cuprins:

Cum se face un Data Logger pentru temperatură, PH și oxigen dizolvat: 11 pași (cu imagini)
Cum se face un Data Logger pentru temperatură, PH și oxigen dizolvat: 11 pași (cu imagini)

Video: Cum se face un Data Logger pentru temperatură, PH și oxigen dizolvat: 11 pași (cu imagini)

Video: Cum se face un Data Logger pentru temperatură, PH și oxigen dizolvat: 11 pași (cu imagini)
Video: Yieryi 6 in 1 Water Quality Meter review 2024, Septembrie
Anonim
Image
Image
Imagine
Imagine

Obiective:

  • Realizați un jurnal de date pentru ≤ 500 USD. Stochează date pentru temperatură, pH și DO cu o ștampilă de timp și utilizând comunicația I2C.
  • De ce I2C (Circuit inter-integrat)? Se pot stiva cât mai mulți senzori în aceeași linie, având în vedere că fiecare dintre ei are o adresă unică.

Pasul 1:

Pasul 2: Cumpărați piesele de mai jos:

Cumpărați piesele de mai jos
Cumpărați piesele de mai jos
  1. Arduino MEGA 2560, 35 USD,
  2. Adaptor de alimentare pentru placa Arduino, 5,98 USD,
  3. Modul LCD I2C (afișaj), 8,99 USD,
  4. Breakout în timp real (RTC), 7,5 USD,
  5. Placă de separare a cardului MicroSD, 7,5 USD,
  6. Card SD de 4 GB, 6,98 USD,
  7. Senzor digital impermeabil DS18B20, 9,95 USD,
  8. Sonda pH + Kituri + tampoane standard, 149,15 USD,
  9. Sonda DO + Kituri + tampoane standard, 247,45 USD,
  10. Breadboard, cablu jumper, 7,98 USD,
  11. (Opțional) Izolator de tensiune, 24 USD,

Total: 510,48 USD

* Anumite piese (cum ar fi placa generică) ar putea fi cumpărate de la alți furnizori (eBay, vânzător chinez) la un preț mai mic. Sondele de pH și DO sunt recomandate pentru a le obține de la Atlas Scientific.

* Se recomandă un multimetru pentru a verifica conductivitatea și tensiunea. Costă aproximativ 10-15 USD (https://goo.gl/iAMDJo)

Pasul 3: Cablare

Cablare
Cablare
  • Utilizați cabluri jumper / DuPont pentru a conecta piesele așa cum se arată în schița de mai jos.
  • Folosiți multimetrul pentru a verifica conducta.
  • Verificați alimentarea cu tensiune pozitivă (VCC) și masa (GND) (este ușor de confundat dacă nu sunteți familiarizați cu circuitul)
  • Conectați adaptorul de alimentare și verificați indicatorul de alimentare din fiecare parte. Când aveți dubii, utilizați multimetrul pentru a verifica tensiunea dintre VCC și GND să fie (5V)

Pasul 4: Pregătiți PH-ul, circuitele DO, cardul SD

Pregătiți PH, circuite DO, card SD
Pregătiți PH, circuite DO, card SD
  1. Treceți la I2C pentru circuitele de pH și DO
  2. Scurgerile de pH și DO sunt livrate cu comunicarea Serială ca mod implicit Transmitere / recepție (TX / RX). Pentru a utiliza modul I2C Clock Line (SCL) și Data line (SDA), comutați modul de (1): deconectați cablurile VCC, TX, RX, (2): săriți TX la sol pentru sondă, PGND (nu GND)), (3) conectați VCC la circuit, (4): așteptați ca LED-ul să treacă de la Verde la Albastru. Mai multe detalii verificați la pagina 39 (Foaie de date pentru circuitul pH,
  3. Faceți același pas cu circuitul DO
  4. (dacă știți cum să încărcați codul eșantion pe tablă, puteți face acest lucru prin intermediul monitorului Serial)
  5. Formatați cardul SD în format FAT

Pasul 5: Pregătiți software-ul

Pregătiți software-ul
Pregătiți software-ul
Pregătiți software-ul
Pregătiți software-ul
Pregătiți software-ul
Pregătiți software-ul
Pregătiți software-ul
Pregătiți software-ul
  1. Descărcați Arduino Integrated Development Environment (IDE),
  2. Instalați biblioteca pe Arduino IDE:
  3. Majoritatea vin cu software Arduino. LiquidCrystal_I2C.h este disponibil prin GitHub
  4. Instalați driverul pentru USB. Pentru Arduino autentic, este posibil să nu fie nevoie să instalați unul. Pentru unul generic, trebuie să instalați driverul CH340 (GitHub:
  5. Verificați dacă conectați corect placa efectuând un test LED intermitent
  6. Cum să găsiți adresa MAC a temperaturii digitale 18B20. Utilizarea șablonului de scanare I2C în Arduino IDE cu sonda conectată. Fiecare dispozitiv are o adresă MAC unică, astfel încât să puteți utiliza cât mai multe sonde de temperatură cu o linie partajată (# 9). 18B20 folosește un I2C cu un singur fir, deci este un caz special al metodei de comunicare I2C. Mai jos este o metodă pentru a găsi MAC - Control acces medical („ROM” când executați procedura de mai jos).

Pasul 6: Începeți codarea

Începeți codarea
Începeți codarea
  • Copiați lipiți codul de mai jos în Arduino IDE:
  • Sau descărcați codul (.ino) și o nouă fereastră ar trebui să apară în Arduino IDE.

/*

Tutoriale de referință:

1. Temperatură, ORP, pH logger:

2. Scut digital securizat (SD):

Acest cod va transmite date către monitorul serial Arduino. Tastați comenzile în monitorul serial Arduino pentru a controla circuitul EZO pH în modul I2C.

Modificat din tutorialele de mai sus, mai ales din codul I2C de către Atlas-Scientific

Ultima actualizare: 26 iulie 2017 de Binh Nguyen

*/

#include // activează I2C.

#define pH_address 99 // implicit număr I2C ID pentru circuit EZO pH.

#define DO_address 97 // implicit numărul I2C ID pentru EZO DO Circuit.

#include "RTClib.h" // Funcțiile de dată și oră folosind un RTC DS1307 conectat prin I2C și Wire lib

RTC_DS1307 rtc;

#include // Pentru bibliotecă SD

#include // card SD pentru stocarea datelor

const int chipSelect = 53; // trebuie să dau seama de Adafruit SD breakout //

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

char logFileName = "dataLT.txt"; // modificați logFileName pentru a vă identifica experimentul, pentru exampe PBR_01_02, datalog1

lung id = 1; // numărul de identificare pentru a introduce ordinea jurnalului

#include

LiquidCrystal_I2C lcd (0x27, 20, 4);

#include

#include

#define ONE_WIRE_BUS 9 // definește pinul # pentru sonda de temperatură

OneWire oneWire (ONE_WIRE_BUS);

Senzori de temperatură Dallas (& oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // Adresa MAC, unică pentru fiecare sondă

String dataString; // varianta principală pentru stocarea tuturor datelor

String dataString2; // o variantă temporară pentru a stoca Temperatura / pH / DO pentru imprimare

char computerdata [20]; // instrucțiuni de la Atlas Scientific: realizăm o matrice de caractere de 20 de octeți pentru a păstra datele primite de pe un pc / mac / altul.

octet primit_de_computer = 0; // trebuie să știm câte caractere au fost primite.

octet serial_event = 0; // un semnal pentru a semnaliza când datele au fost primite de pe pc / mac / altul.

cod octet = 0; // folosit pentru a păstra codul de răspuns I2C.

char pH_data [20]; // facem o matrice de caractere de 20 de octeți pentru a păstra datele primite din circuitul pH-ului.

octet in_char = 0; // folosit ca tampon de 1 octet pentru a stoca în octeți legați din circuitul pH.

octet i = 0; // contor utilizat pentru matricea ph_data.

int timp_ = 1800; // folosit pentru a modifica întârzierea necesară în funcție de comanda trimisă circuitului de clasă EZO pH.

float pH_flot; // float var folosit pentru a menține valoarea float a pH-ului.

char DO_data [20];

// float temp_C;

void setup () // inițializare hardware.

{

Serial.begin (9600); // activați portul serial.

Wire.begin (pH_address); // activați portul I2C pentru sonda pH

Wire.begin (DO_adresa);

lcd.init ();

lcd.inceput (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Bună ziua PBR!");

lcd.setCursor (0, 1);

lcd.print ("Inițializarea …");

Serial.print ("RTC este …");

if (! rtc.begin ())

{

Serial.println ("RTC: ceas în timp real … NU GĂSIT");

while (1); // (Serial.println ("RTC: ceas în timp real … GĂSIT"));

}

Serial.println ("RUNNING");

Serial.print („Ceas în timp real…”);

if (! rtc.isrunning ())

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

}

Serial.println („FUNCȚIONARE”);

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print („card SD…”); // vezi dacă cardul este prezent și poate fi inițializat:

if (! SD.begin (chipSelect))

{Serial.println („Nu a reușit”); // nu mai face nimic:

întoarcere;

}

Serial.println („OK”);

lcd.setCursor (0, 1);

lcd.println („Card SD: OK”);

Serial.print („Fișier jurnal:”);

Serial.print (logFileName);

Serial.print („…”);

Fișier logFile = SD.open (logFileName, FILE_WRITE); // deschideți fișierul. „datalog” și tipăriți antetul

if (logFile)

{

logFile.println (",,,"); // indicați că au existat date în cursa anterioară

String header = "Data-Ora, Temp (C), pH, DO";

logFile.println (antet);

logFile.close ();

Serial.println ("GATA");

//Serial.println(dataString); // tipăriți și în portul serial:

}

else {Serial.println ("eroare la deschiderea registrului de date"); } // dacă fișierul nu este deschis, apare o eroare:

lcd.setCursor (0, 2);

lcd.print ("Fișier jurnal:");

lcd.println (logFileName);

întârziere (1000);

sensors.begin ();

sensors.setResolution (ProbeP, 10); // 10 este rezoluția (10 biți)

lcd.clear ();

id = 0;

}

bucla nulă ()

{// bucla principală.

dataString = String (id);

dataString = String (',');

DateTime acum = rtc.now ();

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

dataString + = String ('/');

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

dataString + = String ('/');

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

dataString + = String ('');

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

dataString + = String (':');

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

dataString + = String (':');

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

lcd.home ();

lcd.print (dataString);

sensors.requestTemperatures ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // apelează circuitul după numărul său de identificare

Wire.write ('r'); // cod hard r pentru a citi continuu

Wire.endTransmission (); // opriți transmisia de date I2C.

timp de intarziere_); // așteptați timpul corect pentru ca circuitul să-și finalizeze instrucțiunile.

Wire.requestFrom (pH_address, 20, 1); // apelează circuitul și solicită 20 de octeți (acest lucru poate fi mai mult decât ne trebuie)

while (Wire.available ()) // sunt octeți de primit

{

in_char = Wire.read (); // primiți un octet.

if ((in_char> 31) && (in_char <127)) // verificați dacă caracterul este utilizabil (imprimabil)

{

pH_data = in_char; // încărcați acest octet în matricea noastră.

i + = 1;

}

if (in_char == 0) // dacă vedem că ni s-a trimis o comandă nulă.

{

i = 0; // resetați contorul i la 0.

Wire.endTransmission (); // oprește transmisia de date I2C.

pauză; // ieși din bucla while.

}

}

serial_event = 0; // resetați semnalizatorul evenimentului serial.

dataString2 + = ",";

dataString2 + = String (pH_data);

Wire.beginTransmission (DO_address); // apelați circuitul după numărul său de identificare

Wire.write ('r');

Wire.endTransmission (); // oprește transmisia de date I2C

timp de intarziere_); // așteptați timpul corect pentru ca circuitul să-și finalizeze instrucțiunile

Wire.requestFrom (DO_address, 20, 1); // apelează circuitul și solicită 20 de octeți

while (Wire.available ()) // sunt octeți de primit.

{

in_char = Wire.read (); // primiți un octet.

if ((in_char> 31) && (in_char <127)) // verificați dacă caracterul este utilizabil (imprimabil), altfel in_char conține un simbol la început în fișierul.txt

{DO_data = in_char; // încărcați acest octet în matricea noastră

i + = 1; // suporta contorul pentru elementul matricei

}

if (in_char == 0)

{// dacă vedem că ni s-a trimis o comandă nulă

i = 0; // resetați contorul i la 0.

Wire.endTransmission (); // oprește transmisia de date I2C.

pauză; // ieși din bucla while.

}

}

serial_event = 0; // resetați semnalizatorul evenimentului serial

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); // deschideți fișierul. rețineți că un singur fișier poate fi deschis odată, deci trebuie să îl închideți înainte de a deschide altul.

if (dataFile) // dacă fișierul este disponibil, scrieți-l:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // tipăriți și pe portul serial:

}

else {Serial.println ("eroare la deschiderea fișierului de date"); } // dacă fișierul nu este deschis, apare o eroare:

lcd.setCursor (0, 3);

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

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // măriți un ID următoare iterație

dataString = "";

întârziere (300000); // întârziere 5 menti = 5 * 60 * 1000 ms

lcd.clear ();

} // încheie bucla principală

display nul Temperatura (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print ("Eroare temperatură");

else dataString2 = String (tempC);

} // codul se termină aici

  • Alegeți portul COM potrivit prin Arduino IDE sub Instrumente / Port
  • Alegeți placa Arduino potrivită. Am folosit Mega 2560 pentru că are mai multă memorie internă. Arduino Nano sau Uno funcționează bine cu această configurare.
  • Verificați și codificați și încărcați codul

Pasul 7: Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD

Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
  • Observație: Am întâlnit zgomotul de la sonda DO la sonda pH după 2-3 luni de funcționare continuă. Potrivit Atlas Scientific, un izolator de tensiune în linie este recomandat atunci când pH-ul, sondele de conductivitate funcționează împreună. Mai multe detalii sunt la pagina 9 (https://goo.gl/d62Rqv)
  • Datele înregistrate (primul are caractere neimprimate înainte de datele pH și DO). Am filtrat în cod permițând numai caractere tipărite.

Pasul 8: Importați date și creați un grafic

Importați date și creați un grafic
Importați date și creați un grafic
Importați date și creați un grafic
Importați date și creați un grafic
Importați date și creați un grafic
Importați date și creați un grafic
  1. Importați date din text sub fila DATA (Excel 2013)
  2. Separați datele de virgulă (de aceea este util să aveți virgule după fiecare introducere de date)
  3. Complotați datele. Fiecare dată de mai jos are aproximativ 1700 de puncte. Intervalul de măsurare este de 5 minute (reglabil). Minimul pentru circuitele DO și pH pentru a citi datele este de 1,8 secunde.

Pasul 9: Calibrare

Calibrare
Calibrare
  1. Senzorul digital de temperatură (18B20) poate fi calibrat ajustând diferența direct la. În caz contrar, dacă compensarea și panta au necesitat calibrarea, puteți face schimbând valorile de pe linia # 453, DallasTemperature.cpp din folderul / libraries / DallasTemperature.
  2. Pentru sondele de pH și DO, puteți calibra sondele cu soluții însoțitoare. Trebuie să utilizați exemplul de cod de la Atlas Scientific și să urmați instrucțiunile din acest fișier.
  3. Vă rugăm să urmați paginile 26 și 50 pentru sonda pH (https://goo.gl/d62Rqv) pentru calibrare și compensarea temperaturii, precum și paginile 7-8 și 50 pentru sonda DO (https://goo.gl/mA32mp). Mai întâi, vă rugăm să reîncărcați codul generic furnizat de Atlas, deschideți Serial Monitor și introduceți o comandă adecvată.

Pasul 10: Prea mult cablare?

  1. Puteți elimina cardul SD și modulul de ceas în timp real folosind Dragino Yun Shield pentru plăcile Arduino (https://goo.gl/J9PBTH). Codul trebuia modificat pentru a funcționa cu Yun Shield. Iată un loc bun pentru a începe (https://goo.gl/c1x8Dm)
  2. Încă prea mult cablare: Atlas Scientific a făcut un ghid pentru circuitele lor EZO (https://goo.gl/dGyb12) și placa fără sudură (https://goo.gl/uWF51n). Integrarea temperaturii digitale 18B20 este aici (https://goo.gl/ATcnGd). Trebuie să vă familiarizați cu comenzile de pe Raspbian (o versiune de Debian Linux) care rulează pe Raspberry Pi (https://goo.gl/549xvk)

Pasul 11: Confirmare:

Acesta este proiectul meu secundar în timpul cercetării postdoctorale pe care am lucrat la un fotobioreactor avansat pentru cultivarea microalgelor. Deci, am crezut că este necesar să cred că părțile au furnizat condiții pentru ca acest lucru să se întâmple. În primul rând, subvenția, DE-EE0007093: „Îmbogățirea și livrarea CO2 atmosferică (ACED)”, de la Departamentul de Energie al SUA, Biroul pentru Eficiență Energetică și Energie Regenerabilă, Biocombustibili și Bioproduse Alge țintite. Îi mulțumesc dr. Bruce E. Rittmann de la Biodesign Swette Center for Environmental Biotechnology, Arizona State Univesity pentru că mi-a oferit oportunitatea de a lucra cu electronice și Arduino. Am fost instruit în ingineria mediului, în special chimie, un pic de microbiologie.

Recomandat: