Taula de continguts:
- Pas 1:
- Pas 2: compreu les peces següents:
- Pas 3: cablejat
- Pas 4: prepareu el PH, els circuits DO, la targeta SD
- Pas 5: prepareu el programari
- Pas 6: Comenceu a codificar
- Pas 7: resultats del cablejat (es poden millorar) i de la pantalla LCD
- Pas 8: importeu dades i feu un gràfic
- Pas 9: calibració
- Pas 10: massa cablejat?
- Pas 11: Reconeixement:
Vídeo: Com fer un registrador de dades per a la temperatura, PH i oxigen dissolt: 11 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:15
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:
- Arduino MEGA 2560, 35 dòlars,
- Adaptador de corrent per a placa Arduino, 5,98 dòlars,
- Mòdul LCD I2C (pantalla), 8,99 dòlars,
- Desglossament del rellotge en temps real (RTC), 7,5 dòlars,
- Tauler de separació de targetes MicroSD, 7,5 dòlars,
- Targeta SD de 4 GB, 6,98 dòlars,
- Sensor digital impermeable DS18B20, 9,95 dòlars,
- Sonda de pH + kits + tampons estàndard, 149,15 dòlars,
- Sonda DO + Kits + buffers estàndard, 247,45 $,
- Taula de pa, cable de pont, 7,98 dòlars,
- (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
- 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
- Canvieu a I2C per als circuits de pH i DO
- 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,
- Feu el mateix pas amb el circuit DO
- (si sabeu com penjar el codi de mostra al tauler, podeu fer-ho a través del monitor sèrie)
- Format de la targeta SD al format FAT
Pas 5: prepareu el programari
- Descarregueu l’Arduino Integrated Development Environment (IDE),
- Instal·leu la biblioteca a IDE Arduino:
- La majoria inclouen programari Arduino. LiquidCrystal_I2C.h està disponible a través de GitHub
- 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:
- Comproveu si connecteu la placa correctament fent una prova de LED parpellejant
- 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
- 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
- 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
- Importa dades del text a la pestanya DADES (Excel 2013)
- Separeu les dades per comes (és per això que és útil tenir comes després de cada entrada de dades)
- 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ó
- 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.
- 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.
- 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?
- 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)
- 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:
Com afegir oxigen dissolt al comptador hidropònic WiFi: 6 passos
Com afegir oxigen dissolt al mesurador d’hidroponia WiFi: aquest tutorial demostrarà com afegir el circuit i la sonda EZO D.O al kit d’hidroponia WiFi d’Atlas Scientific. Se suposa que l’usuari té el kit hidropònic wifi funcionant i ara està preparat per afegir oxigen dissolt. ADVERTÈNCIES: Atlas Sci
Com fer un registre de dades en temps real de la humitat i la temperatura amb Arduino UNO i targeta SD - Simulació de registre de dades DHT11 a Proteus: 5 passos
Com fer un registre de dades en temps real d’humitat i temperatura amb Arduino UNO i targeta SD | Simulació de registre de dades DHT11 a Proteus: Introducció: hola, aquest és Liono Maker, aquí teniu l'enllaç de YouTube. Estem fent un projecte creatiu amb Arduino i treballem en sistemes incrustats
Registrador de dades GPS de bricolatge per a la vostra propera ruta / senderisme: 11 passos (amb imatges)
Registrador de dades GPS de bricolatge per a la vostra propera ruta o senderisme: es tracta d’un registrador de dades GPS que podeu utilitzar amb diversos usos, per exemple, si voleu registrar la vostra unitat llarga que heu fet durant el cap de setmana per comprovar els colors de la tardor. o bé teniu una ruta preferida que visiteu cada tardor a la tardor i
Registrador de dades GPS sense fils per a la vida salvatge: 9 passos (amb imatges)
Registrador de dades GPS sense fils per a la vida salvatge: en aquest instructiu, us mostrarem com fer un registrador de dades GPS basat en Arduino, petit i econòmic, amb capacitat sense fils. L’ús de telemetria per estudiar el moviment de la vida salvatge pot ser una eina molt important per als biòlegs. Us pot dir on
Fer un registrador de dades amb el Raspberry Pi: 3 passos (amb imatges)
Fer un registrador de dades amb el Raspberry Pi: aquest senzill registrador de dades pren mesures regulars de llum amb un LDR (Photoresistor) analògic i els emmagatzema en un fitxer de text al vostre Raspberry Pi. Aquest registrador de dades mesurarà i registrarà el nivell de llum cada 60 segons, cosa que us permetrà controlar