Cuprins:
- Pasul 1:
- Pasul 2: Cumpărați piesele de mai jos:
- Pasul 3: Cablare
- Pasul 4: Pregătiți PH-ul, circuitele DO, cardul SD
- Pasul 5: Pregătiți software-ul
- Pasul 6: Începeți codarea
- Pasul 7: Rezultate privind cablarea (poate fi îmbunătățită) și afișajul LCD
- Pasul 8: Importați date și creați un grafic
- Pasul 9: Calibrare
- Pasul 10: Prea mult cablare?
- Pasul 11: Confirmare:
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
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:
- Arduino MEGA 2560, 35 USD,
- Adaptor de alimentare pentru placa Arduino, 5,98 USD,
- Modul LCD I2C (afișaj), 8,99 USD,
- Breakout în timp real (RTC), 7,5 USD,
- Placă de separare a cardului MicroSD, 7,5 USD,
- Card SD de 4 GB, 6,98 USD,
- Senzor digital impermeabil DS18B20, 9,95 USD,
- Sonda pH + Kituri + tampoane standard, 149,15 USD,
- Sonda DO + Kituri + tampoane standard, 247,45 USD,
- Breadboard, cablu jumper, 7,98 USD,
- (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
- 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
- Treceți la I2C pentru circuitele de pH și DO
- 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,
- Faceți același pas cu circuitul DO
- (dacă știți cum să încărcați codul eșantion pe tablă, puteți face acest lucru prin intermediul monitorului Serial)
- Formatați cardul SD în format FAT
Pasul 5: Pregătiți software-ul
- Descărcați Arduino Integrated Development Environment (IDE),
- Instalați biblioteca pe Arduino IDE:
- Majoritatea vin cu software Arduino. LiquidCrystal_I2C.h este disponibil prin GitHub
- 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:
- Verificați dacă conectați corect placa efectuând un test LED intermitent
- 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
- 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
- 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 din text sub fila DATA (Excel 2013)
- Separați datele de virgulă (de aceea este util să aveți virgule după fiecare introducere de date)
- 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
- 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.
- 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.
- 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?
- 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)
- Î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.