Taula de continguts:

Com fer un registrador de dades per a la temperatura, PH i oxigen dissolt: 11 passos (amb imatges)
Com fer un registrador de dades per a la temperatura, PH i oxigen dissolt: 11 passos (amb imatges)

Vídeo: Com fer un registrador de dades per a la temperatura, PH i oxigen dissolt: 11 passos (amb imatges)

Vídeo: Com fer un registrador de dades per a la temperatura, PH i oxigen dissolt: 11 passos (amb imatges)
Vídeo: Night 2024, Desembre
Anonim
Image
Image
Imatge
Imatge

Objectius:

  • Feu un registrador de dades per ≤ 500 $. Emmagatzema dades de temperatura, pH i DO amb una marca de temps i mitjançant la comunicació I2C.
  • Per què I2C (circuit inter-integrat)? Es poden apilar tants sensors en la mateixa línia, ja que cadascun d'ells té una adreça única.

Pas 1:

Pas 2: compreu les peces següents:

Compreu les peces següents
Compreu les peces següents
  1. Arduino MEGA 2560, 35 dòlars,
  2. Adaptador de corrent per a placa Arduino, 5,98 dòlars,
  3. Mòdul LCD I2C (pantalla), 8,99 dòlars,
  4. Desglossament del rellotge en temps real (RTC), 7,5 dòlars,
  5. Tauler de separació de targetes MicroSD, 7,5 dòlars,
  6. Targeta SD de 4 GB, 6,98 dòlars,
  7. Sensor digital impermeable DS18B20, 9,95 dòlars,
  8. Sonda de pH + kits + tampons estàndard, 149,15 dòlars,
  9. Sonda DO + Kits + buffers estàndard, 247,45 $,
  10. Taula de pa, cable de pont, 7,98 dòlars,
  11. (Opcional) Aïllador de tensió, 24 dòlars,

Total: 510,48 dòlars

* Algunes peces (com la placa genèrica) es podrien comprar a altres proveïdors (eBay, venedor xinès) per un preu més baix. Es recomanen sondes de pH i DO per obtenir-les d’Atlas Scientific.

* Es recomana un multímetre per comprovar la conductivitat i la tensió. Costa aproximadament entre 10 i 15 dòlars (https://goo.gl/iAMDJo)

Pas 3: cablejat

Cablejat
Cablejat
  • Utilitzeu cables jumper / DuPont per connectar les peces tal com es mostra a l’esbós següent.
  • Utilitzeu el multímetre per comprovar la conducció.
  • Comproveu el subministrament de tensió positiva (VCC) i la terra (GND) (és fàcil confondre si no esteu familiaritzat amb el circuit)
  • Connecteu l'adaptador de corrent i comproveu l'indicador d'alimentació de cada part. Si teniu dubtes, utilitzeu el multímetre per comprovar que el voltatge entre VCC i GND sigui (5V)

Pas 4: prepareu el PH, els circuits DO, la targeta SD

Prepareu el PH, els circuits DO, la targeta SD
Prepareu el PH, els circuits DO, la targeta SD
  1. Canvieu a I2C per als circuits de pH i DO
  2. Els brots de pH i DO s’envien amb la comunicació sèrie com a mode predeterminat Transmetre / rebre (TX / RX). Per utilitzar la línia de rellotge en mode I2C (SCL) i la línia de dades (SDA), canvieu de mode per (1): desconnecteu els cables VCC, TX, RX, (2): salteu TX a terra per a sonda, PGND (no GND)), (3) connecteu VCC al circuit, (4): espereu que el LED canviï de verd a blau. Consulteu més detalls a la pàgina 39 (Full de dades del circuit de pH,
  3. Feu el mateix pas amb el circuit DO
  4. (si sabeu com penjar el codi de mostra al tauler, podeu fer-ho a través del monitor sèrie)
  5. Format de la targeta SD al format FAT

Pas 5: prepareu el programari

Prepareu el programari
Prepareu el programari
Prepareu el programari
Prepareu el programari
Prepareu el programari
Prepareu el programari
Prepareu el programari
Prepareu el programari
  1. Descarregueu l’Arduino Integrated Development Environment (IDE),
  2. Instal·leu la biblioteca a IDE Arduino:
  3. La majoria inclouen programari Arduino. LiquidCrystal_I2C.h està disponible a través de GitHub
  4. Instal·leu el controlador per USB. Per a Arduino genuí, és possible que no necessiteu instal·lar-ne cap. Per a un de genèric, heu d’instal·lar el controlador CH340 (GitHub:
  5. Comproveu si connecteu la placa correctament fent una prova de LED parpellejant
  6. Com es pot trobar l'adreça MAC de la temperatura digital 18B20. Ús de plantilla d’escàner I2C a Arduino IDE amb la sonda endollada. Cada dispositiu té una adreça MAC única, de manera que podeu utilitzar tantes sondes de temperatura amb una línia compartida (# 9). 18B20 utilitza un I2C d’un fil, per tant és un cas especial de mètode de comunicació I2C. A continuació es mostra un mètode per trobar MAC: control d’accés mèdic (“ROM” quan executeu el procediment següent).

Pas 6: Comenceu a codificar

Comenceu a codificar
Comenceu a codificar
  • Copieu enganxeu el codi següent a Arduino IDE:
  • O bé descarregueu el codi (.ino) i apareixerà una finestra nova a Arduino IDE.

/*

Tutorials de referència:

1. Registrador de temperatura, ORP, pH:

2. Escut digital segur (SD):

Aquest codi enviarà dades al monitor sèrie Arduino. Escriviu ordres al monitor sèrie Arduino per controlar el circuit EZO pH en mode I2C.

Modificat a partir dels tutorials referenciats anteriorment, principalment a partir del codi I2C d'Atlas-Scientific

Última actualització: 26 de juliol de 2017 per Binh Nguyen

*/

#include // enable I2C.

#define pH_address 99 // número de identificació I2C per defecte per al circuit de pH EZO.

#define DO_address 97 // número d'identificació I2C per defecte per al circuit DO EZO.

#include "RTClib.h" // Funcions de data i hora mitjançant un RTC DS1307 connectat mitjançant I2C i Wire lib

RTC_DS1307 rtc;

#include // Per a la biblioteca SD

#include // targeta SD per emmagatzemar dades

const int chipSelect = 53; // cal esbrinar el trencament d'Adafruit SD //

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

char logFileName = "dataLT.txt"; // modifica logFileName per identificar el vostre experiment, per exemple PBR_01_02, datalog1

id llarg = 1; // el número d'identificació per introduir l'ordre de registre

#incloure

LiquidCrystal_I2C lcd (0x27, 20, 4);

#incloure

#incloure

#define ONE_WIRE_BUS 9 // defineix el pin # per a la sonda de temperatura

OneWire oneWire (ONE_WIRE_BUS);

Sensors de temperatura Dallas (& oneWire);

Adreça del dispositiu ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // Adreça MAC, única per a cada sonda

String dataString; // la variant principal per emmagatzemar totes les dades

String dataString2; // una variant temporal per emmagatzemar la temperatura / pH / DO per imprimir

char computerdata [20]; // instrucció d'Atlas Scientific: fem una matriu de caràcters de 20 bytes per contenir les dades entrants d'un PC / Mac / altre.

byte rebut_de_ordinador = 0; // hem de saber quants personatges s’han rebut.

byte serial_event = 0; // un senyalador per senyalitzar quan s'han rebut dades des del pc / mac / other.

codi de bytes = 0; // s'utilitzava per contenir el codi de resposta I2C.

char pH_data [20]; // fem una matriu de caràcters de 20 bytes per contenir les dades entrants del circuit de pH.

byte in_char = 0; // s’utilitza com a memòria intermèdia d’1 byte per emmagatzemar en bytes lligats del circuit de pH.

byte i = 0; // comptador utilitzat per a la matriu de dades de ph.

temps int_ = 1800; // s’utilitza per canviar el retard necessari en funció de l’ordre enviada al circuit de pH de la classe EZO.

flotador pH_flotador; // float var que s’utilitza per mantenir el valor flotant del pH.

char DO_data [20];

// float temp_C;

void setup () // inicialització de maquinari.

{

Serial.begin (9600); // habilitar el port sèrie.

Wire.begin (pH_address); // habilita el port I2C per a la sonda de pH

Wire.begin (DO_adreça);

lcd.init ();

lcd.begin (20, 4);

lcd.backlight ();

lcd.home ();

lcd.print ("Hola PBR!");

lcd.setCursor (0, 1);

lcd.print ("Inicialitzant …");

Serial.print ("RTC és …");

if (! rtc.begin ())

{

Serial.println ("RTC: rellotge en temps real … NO TROBAT");

while (1); // (Serial.println ("RTC: rellotge en temps real … FOUND"));

}

Serial.println ("RUNNING");

Serial.print ("Rellotge en temps real …");

if (! rtc.isrunning ())

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

}

Serial.println ("TREBALLANT");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("targeta SD …"); // veure si la targeta és present i es pot inicialitzar:

if (! SD.begin (chipSelect))

{Serial.println ("Error"); // no facis res més:

tornar;

}

Serial.println ("D'acord");

lcd.setCursor (0, 1);

lcd.println ("targeta SD: OK");

Serial.print ("Fitxer de registre:");

Serial.print (logFileName);

Serial.print ("…");

Fitxer logFile = SD.open (logFileName, FILE_WRITE); // obriu el fitxer. "datalog" i imprimeix la capçalera

if (logFile)

{

logFile.println (",", "); // Indiqueu que hi havia dades a l'execució anterior

Capçalera de cadena = "Data -Hora, temperatura (C), pH, DO";

logFile.println (capçalera);

logFile.close ();

Serial.println ("LIST");

//Serial.println(dataString); // imprimiu també al port sèrie:

}

else {Serial.println ("error en obrir el registre de dades"); } // si el fitxer no està obert, apareix un error:

lcd.setCursor (0, 2);

lcd.print ("Fitxer de registre:");

lcd.println (logFileName);

retard (1000);

sensors.begin ();

sensors.setResolution (ProbeP, 10); // 10 és la resolució (10 bits)

lcd.clear ();

id = 0;

}

bucle buit ()

{// el bucle principal.

dataString = Cadena (id);

dataString = Cadena (',');

Data i hora ara = rtc.now ();

dataString = Cadena (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); // trucar al circuit pel seu número d'identificació

Wire.write ('r'); // codi dur r per llegir contínuament

Wire.endTransmission (); // finalitzar la transmissió de dades I2C.

temps de retard_); // espereu el temps correcte perquè el circuit completi la seva instrucció.

Wire.requestFrom (pH_address, 20, 1); // trucar al circuit i sol·licitar 20 bytes (pot ser més del que necessitem)

mentre que (Wire.available ()) // hi ha bytes per rebre

{

in_char = Wire.read (); // rebre un byte.

if ((in_char> 31) && (in_char <127)) // comproveu si el caràcter es pot utilitzar (imprimible)

{

pH_data = in_char; // carregueu aquest byte a la nostra matriu.

i + = 1;

}

if (in_char == 0) // si veiem que se'ns ha enviat una ordre nul·la.

{

i = 0; // restableix el comptador i a 0.

Wire.endTransmission (); // finalitzar la transmissió de dades I2C.

trencar; // surt del bucle while.

}

}

esdeveniment_serial = 0; // restableix el senyalador d'esdeveniments en sèrie.

dataString2 + = ",";

dataString2 + = String (pH_data);

Wire.beginTransmission (DO_address); // trucar al circuit pel seu número d'identificació

Wire.write ('r');

Wire.endTransmission (); // finalitzar la transmissió de dades I2C

temps de retard_); // espereu el temps correcte perquè el circuit completi la seva instrucció

Wire.requestFrom (DO_adreça, 20, 1); // trucar al circuit i sol·licitar 20 bytes

mentre que (Wire.available ()) // hi ha bytes per rebre.

{

in_char = Wire.read (); // rebre un byte.

if ((in_char> 31) && (in_char <127)) // comproveu si el caràcter es pot utilitzar (imprimible), en cas contrari, in_char conté un símbol al principi al fitxer.txt

{DO_data = in_char; // carregueu aquest byte a la nostra matriu

i + = 1; // incorre en el comptador de l'element array

}

if (in_char == 0)

{// si veiem que se'ns ha enviat una ordre nul·la

i = 0; // restableix el comptador i a 0.

Wire.endTransmission (); // finalitzar la transmissió de dades I2C.

trencar; // surt del bucle while.

}

}

esdeveniment_serial = 0; // restableix el senyalador d'esdeveniments en sèrie

pH_flot = 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;

Fitxer dataFile = SD.open (logFileName, FILE_WRITE); // obriu el fitxer. tingueu en compte que només es pot obrir un fitxer alhora, de manera que heu de tancar-lo abans d'obrir-ne un altre.

if (dataFile) // si el fitxer està disponible, escriviu-hi:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (dataString); // imprimiu també al port sèrie:

}

else {Serial.println ("error en obrir el fitxer de registre de dades"); } // si el fitxer no està obert, apareix un error:

lcd.setCursor (0, 3);

lcd.print ("En execució (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // augmentar un ID següent iteració

dataString = "";

retard (300000); // retardar 5 mn = 5 * 60 * 1000 ms

lcd.clear ();

} // finalitzar el bucle principal

void displayTemperature (DeviceAddress DeviceAddress)

{

floC tempC = sensors.getTempC (deviceAddress);

if (tempC == -127.00) lcd.print ("Error de temperatura");

else dataString2 = Cadena (tempC);

} // el codi acaba aquí

  • Trieu el port COM adequat mitjançant Arduino IDE a Eines / Port
  • Trieu la placa Arduino adequada. He utilitzat Mega 2560 perquè té més memòria interna. Arduino Nano o Uno funciona bé amb aquesta configuració.
  • Comproveu i codifiqueu i pengeu el codi

Pas 7: resultats del cablejat (es poden millorar) i de la pantalla LCD

Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
Resultats de cablejat (es poden millorar) i pantalla LCD
  • Avís: em vaig trobar amb el soroll de la sonda DO a la sonda de pH després de 2-3 mesos de funcionament continu. Segons Atlas Scientific, es recomana un aïllador de tensió en línia quan les sondes de conductivitat de pH funcionen juntes. Més informació a la pàgina 9 (https://goo.gl/d62Rqv)
  • Les dades registrades (la primera té caràcters no impresos abans de les dades de pH i DO). He filtrat a codi permetent només caràcters imprimibles.

Pas 8: importeu dades i feu un gràfic

Importeu dades i feu un gràfic
Importeu dades i feu un gràfic
Importeu dades i feu un gràfic
Importeu dades i feu un gràfic
Importeu dades i feu un gràfic
Importeu dades i feu un gràfic
  1. Importa dades del text a la pestanya DADES (Excel 2013)
  2. Separeu les dades per comes (és per això que és útil tenir comes després de cada entrada de dades)
  3. Representa les dades. Cada dada següent té aproximadament 1.700 punts. L'interval de mesura és de 5 minuts (ajustable). El mínim de circuits de DO i pH per llegir les dades és d’1,8 segons.

Pas 9: calibració

Calibratge
Calibratge
  1. El sensor de temperatura digital (18B20) es pot calibrar ajustant la diferència directament al. En cas contrari, si la compensació i el pendent requereixen un calibratge, podeu fer-ho canviant els valors de la línia # 453, DallasTemperature.cpp a la carpeta / libraries / DallasTemperature.
  2. Per a sondes de pH i DO, podeu calibrar les sondes amb solucions adjuntes. Heu d’utilitzar el codi de mostra d’Atlas Scientific i seguir les instruccions d’aquest fitxer.
  3. Seguiu les pàgines 26 i 50 per a la sonda de pH (https://goo.gl/d62Rqv) per a la calibració i la compensació de la temperatura, i també les pàgines 7-8 i 50 per a la sonda DO (https://goo.gl/mA32mp). En primer lloc, torneu a carregar el codi genèric proporcionat per Atlas, obriu el monitor sèrie i introduïu una ordre adequada.

Pas 10: massa cablejat?

  1. Podeu eliminar la targeta SD i el mòdul de rellotge en temps real mitjançant Dragino Yun Shield per a les plaques Arduino (https://goo.gl/J9PBTH). Calia modificar el codi per funcionar amb Yun Shield. Aquí teniu un bon lloc per començar (https://goo.gl/c1x8Dm)
  2. Encara hi ha massa cablejat: l’Atlas Scientific va fer una guia per als seus circuits EZO (https://goo.gl/dGyb12) i la placa sense soldadura (https://goo.gl/uWF51n). La integració de la temperatura digital 18B20 ja és aquí (https://goo.gl/ATcnGd). Heu de familiaritzar-vos amb les ordres de Raspbian (una versió de Debian Linux) que s’executen a Raspberry Pi (https://goo.gl/549xvk)

Pas 11: Reconeixement:

Aquest és el meu projecte paral·lel durant la meva investigació postdoctoral que vaig treballar en un fotobiorreactor avançat per cultivar microalgues. Per tant, vaig pensar que era necessari acreditar que les parts han proporcionat condicions perquè això passi. En primer lloc, la subvenció, DE-EE0007093: "Enriquiment i lliurament de CO2 atmosfèric (ACED)", del Departament d'Energia dels Estats Units, Oficina d'Eficiència Energètica i Energies Renovables dirigits a biocombustibles i bioproductes d'algues. Agraeixo al Dr. Bruce E. Rittmann del Biodesign Swette Center for Environmental Biotechnology, Arizona State Univesity, que m’hagi donat l’oportunitat de jugar amb electrònica i Arduino. Em van formar en enginyeria ambiental, sobretot química, una mica de microbiologia.

Recomanat: