Cómo hacer un registrador de datos para la temperatura, el pH y el oxígeno disuelto: 11 pasos (con imágenes)
Cómo hacer un registrador de datos para la temperatura, el pH y el oxígeno disuelto: 11 pasos (con imágenes)
Anonim
Image
Image
Imagen
Imagen

Objetivos:

  • Haga un registrador de datos por ≤ $ 500. Almacena datos de temperatura, pH y OD con una marca de tiempo y mediante comunicación I2C.
  • ¿Por qué I2C (circuito interintegrado)? Se pueden apilar tantos sensores en la misma línea dado que cada uno de ellos tiene una dirección única.

Paso 1:

Paso 2: compre las piezas siguientes:

Compre las piezas a continuación
Compre las piezas a continuación
  1. Arduino MEGA 2560, $ 35,
  2. Adaptador de corriente para placa Arduino, $ 5.98,
  3. Módulo LCD I2C (pantalla), $ 8,99,
  4. Desglose del reloj en tiempo real (RTC), $ 7.5,
  5. Placa de conexión de tarjeta microSD, $ 7.5,
  6. Tarjeta SD de 4GB, $ 6.98,
  7. Sensor digital impermeable DS18B20, $ 9.95,
  8. Sonda de pH + Kits + Tampones estándar, $ 149.15,
  9. Sonda DO + Kits + Tampones estándar, $ 247.45,
  10. Placa de pruebas, cable de puente, $ 7,98,
  11. (Opcional) Aislador de voltaje, $ 24,

Total: $ 510.48

* Ciertas piezas (como la placa genérica) se pueden comprar a otros proveedores (eBay, vendedor chino) por un precio más bajo. Se recomiendan sondas de pH y OD para obtenerlas de Atlas Scientific.

* Se recomienda un multímetro para verificar la conductividad y el voltaje. Cuesta alrededor de $ 10-15 (https://goo.gl/iAMDJo)

Paso 3: cableado

Alambrado
Alambrado
  • Utilice cables puente / DuPont para conectar las piezas como se muestra en el dibujo a continuación.
  • Usa el multímetro para verificar la conducción.
  • Verifique el suministro de voltaje positivo (VCC) y tierra (GND) (es fácil confundirlo si no está familiarizado con el circuito)
  • Enchufe el adaptador de corriente y verifique el indicador de energía en cada parte. Cuando tenga dudas, use el multímetro para verificar que el voltaje entre VCC y GND sea (5V)

Paso 4: Prepare el PH, los circuitos DO, la tarjeta SD

Prepare el PH, los circuitos DO, la tarjeta SD
Prepare el PH, los circuitos DO, la tarjeta SD
  1. Cambie a I2C para circuitos de pH y OD
  2. Las rupturas de pH y OD se envían con comunicación en serie como modo predeterminado de transmisión / recepción (TX / RX). Para usar la línea de reloj (SCL) del modo I2C y la línea de datos (SDA), cambie el modo mediante (1): desenchufe los cables VCC, TX, RX, (2): salte TX a tierra para sonda, PGND (no GND), (3) enchufe VCC al circuito, (4): espere a que el LED cambie de verde a azul. Ver más detalles en la página 39 (Hoja de datos del circuito de pH,
  3. Haz el mismo paso con el circuito DO
  4. (si sabe cómo cargar el código de muestra en la placa, puede hacerlo a través del monitor de serie)
  5. Formatee la tarjeta SD en formato FAT

Paso 5: preparar el software

Preparar el software
Preparar el software
Preparar el software
Preparar el software
Preparar el software
Preparar el software
Preparar el software
Preparar el software
  1. Descargue Arduino Integrated Development Environment (IDE),
  2. Instale la biblioteca en Arduino IDE:
  3. La mayoría de ellos vienen con el software Arduino. LiquidCrystal_I2C.h está disponible a través de GitHub
  4. Instale el controlador para USB. Para Arduino genuino, es posible que no necesite instalar uno. Para uno genérico, debe instalar el controlador CH340 (GitHub:
  5. Compruebe si conecta la placa correctamente ejecutando una prueba de LED parpadeante
  6. Cómo encontrar la dirección MAC de la temperatura digital 18B20. Usando la plantilla de escáner I2C en Arduino IDE con la sonda enchufada. Cada dispositivo tiene una dirección MAC única, por lo que puede usar tantas sondas de temperatura con una línea compartida (# 9). 18B20 utiliza un I2C de un cable, por lo que es un caso especial del método de comunicación I2C. A continuación se muestra un método para encontrar MAC: Control de acceso médico (“ROM” cuando ejecuta el procedimiento a continuación).

Paso 6: Comience a codificar

Empezar a codificar
Empezar a codificar
  • Copie y pegue el siguiente código en Arduino IDE:
  • O descargue el código (.ino) y debería aparecer una nueva ventana en Arduino IDE.

/*

Tutoriales de referencia:

1. Registrador de temperatura, ORP, pH:

2. Escudo digital seguro (SD):

Este código enviará datos al monitor serial Arduino. Escriba comandos en el monitor serial Arduino para controlar el circuito de pH EZO en modo I2C.

Modificado de los tutoriales mencionados anteriormente, principalmente del código I2C de Atlas-Scientific

Última actualización: 26 de julio de 2017 por Binh Nguyen

*/

#include // habilita I2C.

#define pH_address 99 // número de identificación I2C predeterminado para el circuito de pH EZO.

#define DO_address 97 // número de ID I2C predeterminado para el circuito EZO DO.

#include "RTClib.h" // Funciones de fecha y hora utilizando un RTC DS1307 conectado a través de I2C y Wire lib

RTC_DS1307 rtc;

#include // Para la biblioteca SD

#include // Tarjeta SD para almacenar datos

const int chipSelect = 53; // Necesito averiguar para la ruptura de Adafruit SD //

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

char logFileName = "dataLT.txt"; // modificar logFileName para identificar su experimento, por ejemplo, PBR_01_02, datalog1

id largo = 1; // el número de identificación para ingresar el orden de registro

#incluir

LiquidCrystal_I2C lcd (0x27, 20, 4);

#incluir

#incluir

#define ONE_WIRE_BUS 9 // defina el pin # para la sonda de temperatura

OneWire oneWire (ONE_WIRE_BUS);

Sensores de temperatura de Dallas (y oneWire);

DeviceAddress ProbeP = {0x28, 0xC2, 0xE8, 0x37, 0x07, 0x00, 0x00, 0xBF}; // Dirección MAC, única para cada sonda

String dataString; // la variante principal para almacenar todos los datos

String dataString2; // una variante temporal para almacenar temperatura / pH / OD para imprimir

char computerdata [20]; // instrucción de Atlas Scientific: hacemos una matriz de caracteres de 20 bytes para contener los datos entrantes de una pc / mac / otra.

byte recibido_de_computadora = 0; // necesitamos saber cuántos caracteres se han recibido.

byte serial_event = 0; // una bandera para señalar cuando se han recibido datos de la pc / mac / otro.

código de byte = 0; // utilizado para contener el código de respuesta I2C.

char pH_data [20]; // hacemos una matriz de caracteres de 20 bytes para contener los datos entrantes del circuito de pH.

byte in_char = 0; // se utiliza como un búfer de 1 byte para almacenar en bytes ligados del circuito de pH.

byte i = 0; // contador utilizado para la matriz ph_data.

int time_ = 1800; // se utiliza para cambiar el retardo necesario según el comando enviado al circuito de pH de clase EZO.

flotar pH_float; // float var utilizado para mantener el valor de flotación del pH.

char DO_data [20];

// flotar temp_C;

void setup () // inicialización del hardware.

{

Serial.begin (9600); // habilita el puerto serie.

Wire.begin (pH_address); // habilita el puerto I2C para la sonda de pH

Wire.begin (DO_address);

lcd.init ();

lcd. comienzo (20, 4);

LCD luz de fondo();

casa lcd ();

lcd.print ("¡Hola PBR!");

lcd.setCursor (0, 1);

lcd.print ("Inicializando …");

Serial.print ("RTC es …");

si (! rtc.begin ())

{

Serial.println ("RTC: Reloj en tiempo real … NO ENCONTRADO");

while (1); // (Serial.println ("RTC: Reloj en tiempo real… ENCONTRADO"));

}

Serial.println ("EN EJECUCIÓN");

Serial.print ("Reloj en tiempo real …");

if (! rtc.isrunning ())

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

}

Serial.println ("FUNCIONANDO");

lcd.setCursor (0, 0);

lcd.println ("RTC: OK");

Serial.print ("Tarjeta SD …"); // ver si la tarjeta está presente y se puede inicializar:

si (! SD.begin (chipSelect))

{Serial.println ("Fallido"); // no hagas nada más:

regreso;

}

Serial.println ("Aceptar");

lcd.setCursor (0, 1);

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

Serial.print ("Archivo de registro:");

Serial.print (logFileName);

Serial.print ("…");

Archivo logFile = SD.open (logFileName, FILE_WRITE); // abre el archivo. "registro de datos" e imprime el encabezado

si (archivo de registro)

{

logFile.println (",,"); // indica que hubo datos en la ejecución anterior

Encabezado de cadena = "Fecha-Hora, Temp (C), pH, DO";

logFile.println (encabezado);

logFile.close ();

Serial.println ("LISTO");

//Serial.println(dataString); // imprime también en el puerto serie:

}

else {Serial.println ("error al abrir el registro de datos"); } // si el archivo no está abierto, aparece un error:

lcd.setCursor (0, 2);

lcd.print ("Archivo de registro:");

lcd.println (logFileName);

retraso (1000);

sensores.begin ();

Sensores.setResolution (ProbeP, 10); // 10 es la resolución (10 bits)

lcd.clear ();

id = 0;

}

bucle vacío ()

{// el bucle principal.

dataString = String (id);

dataString = String (',');

DateTime ahora = rtc.now ();

dataString = String (ahora año (), DEC);

dataString + = String ('/');

dataString + = String (ahora.mes (), DEC);

dataString + = String ('/');

dataString + = String (ahora.día (), DEC);

dataString + = String ('');

dataString + = String (ahora.hora (), DEC);

dataString + = String (':');

dataString + = String (ahora.minuto (), DEC);

dataString + = String (':');

dataString + = String (ahora.segundo (), DEC);

casa lcd ();

lcd.print (cadena de datos);

sensores.requestTemperaturas ();

displayTemperature (ProbeP);

Wire.beginTransmission (pH_address); // llamar al circuito por su número de identificación

Wire.write ('r'); // código duro r para leer continuamente

Wire.endTransmission (); // finaliza la transmisión de datos I2C.

tiempo de retardo_); // esperar la cantidad de tiempo correcta para que el circuito complete su instrucción.

Wire.requestFrom (pH_address, 20, 1); // llama al circuito y solicita 20 bytes (esto puede ser más de lo que necesitamos)

while (Wire.available ()) // ¿Hay bytes para recibir

{

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

if ((in_char> 31) && (in_char <127)) // comprueba si el carácter es utilizable (imprimible)

{

pH_data = in_char; // carga este byte en nuestra matriz.

i + = 1;

}

if (in_char == 0) // si vemos que nos han enviado un comando nulo.

{

i = 0; // resetea el contador i a 0.

Wire.endTransmission (); // finaliza la transmisión de datos I2C.

rotura; // salir del ciclo while.

}

}

serial_event = 0; // restablece la bandera del evento en serie.

dataString2 + = ",";

dataString2 + = String (pH_data);

Wire.beginTransmission (DO_address); // llamar al circuito por su número de identificación

Wire.write ('r');

Wire.endTransmission (); // finalizar la transmisión de datos I2C

tiempo de retardo_); // esperar la cantidad de tiempo correcta para que el circuito complete su instrucción

Wire.requestFrom (DO_address, 20, 1); // llama al circuito y solicita 20 bytes

while (Wire.available ()) // hay bytes para recibir.

{

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

if ((in_char> 31) && (in_char <127)) // verifica si el char es utilizable (imprimible), de lo contrario, in_char contiene un símbolo al principio en el archivo.txt

{DO_data = in_char; // carga este byte en nuestra matriz

i + = 1; // incurrir en el contador para el elemento de la matriz

}

si (in_char == 0)

{// si vemos que nos han enviado un comando nulo

i = 0; // resetea el contador i a 0.

Wire.endTransmission (); // finaliza la transmisión de datos I2C.

rotura; // salir del ciclo while.

}

}

serial_event = 0; // restablecer la bandera de eventos en serie

pH_float = atof (pH_data);

dataString2 + = ",";

dataString2 + = String (DO_data);

lcd.setCursor (0, 1);

lcd.print ("Temperatura / pH / OD");

lcd.setCursor (0, 2);

lcd.print (dataString2);

dataString + = ',';

dataString + = dataString2;

Archivo dataFile = SD.open (logFileName, FILE_WRITE); // abre el archivo. tenga en cuenta que solo se puede abrir un archivo a la vez, por lo que debe cerrar este antes de abrir otro.

if (dataFile) // si el archivo está disponible, escríbalo:

{

dataFile.println (dataString);

dataFile.close ();

Serial.println (cadena de datos); // imprime también en el puerto serie:

}

else {Serial.println ("error al abrir el archivo de registro de datos"); } // si el archivo no está abierto, aparece un error:

lcd.setCursor (0, 3);

lcd.print ("En ejecución (x5m):");

lcd.setCursor (15, 3);

lcd.print (id);

id ++; // aumentar una ID en la próxima iteración

dataString = "";

retraso (300000); // retraso 5 minutos = 5 * 60 * 1000 ms

lcd.clear ();

} // fin del bucle principal

void displayTemperature (DeviceAddress deviceAddress)

{

float tempC = sensors.getTempC (deviceAddress);

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

else dataString2 = String (tempC);

} // el código termina aquí

  • Elija el puerto COM correcto a través de Arduino IDE en Herramientas / Puerto
  • Elija la placa Arduino correcta. Usé Mega 2560 porque tiene más memoria interna. Arduino Nano o Uno funciona bien con esta configuración.
  • Verifique y codifique y cargue el código

Paso 7: Resultados en el cableado (se puede mejorar) y la pantalla LCD

Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
Resultados en el cableado (se puede mejorar) y la pantalla LCD
  • Aviso: Encontré el ruido de la sonda de OD a la sonda de pH después de 2-3 meses de funcionamiento continuo. Según Atlas Scientific, se recomienda un aislador de voltaje en línea cuando las sondas de conductividad y pH funcionan juntas. Más detalles en la página 9 (https://goo.gl/d62Rqv)
  • Los datos registrados (el primero tiene caracteres sin imprimir antes de los datos de pH y OD). Filtré al código permitiendo solo caracteres imprimibles.

Paso 8: importar datos y hacer un gráfico

Importar datos y hacer un gráfico
Importar datos y hacer un gráfico
Importar datos y hacer un gráfico
Importar datos y hacer un gráfico
Importar datos y hacer un gráfico
Importar datos y hacer un gráfico
  1. Importar datos de texto en la pestaña DATOS (Excel 2013)
  2. Separe los datos por comas (por eso es útil tener comas después de cada entrada de datos)
  3. Grafique los datos. Cada dato a continuación tiene alrededor de 1700 puntos. El intervalo de medición es de 5 minutos (ajustable). El mínimo para que los circuitos de DO y pH lean los datos es de 1.8 segundos.

Paso 9: Calibración

Calibración
Calibración
  1. El sensor de temperatura digital (18B20) se puede calibrar ajustando la diferencia directamente al. De lo contrario, si la compensación y la pendiente requieren calibración, puede hacerlo cambiando los valores en la línea # 453, DallasTemperature.cpp en la carpeta / libraries / DallasTemperature.
  2. Para las sondas de pH y OD, puede calibrar las sondas con las soluciones que las acompañan. Debe utilizar el código de muestra de Atlas Scientific y seguir las instrucciones de este archivo.
  3. Siga las páginas 26 y 50 para la sonda de pH (https://goo.gl/d62Rqv) para la calibración y compensación de temperatura, y también las páginas 7-8 y 50 para la sonda de OD (https://goo.gl/mA32mp). Primero, vuelva a cargar el código genérico proporcionado por Atlas, abra Serial Monitor e ingrese un comando adecuado.

Paso 10: ¿Demasiado cableado?

  1. Puede eliminar la tarjeta SD y el módulo de reloj en tiempo real utilizando Dragino Yun Shield para placas Arduino (https://goo.gl/J9PBTH). Era necesario modificar el código para que funcionara con Yun Shield. Este es un buen lugar para comenzar (https://goo.gl/c1x8Dm)
  2. Todavía demasiado cableado: Atlas Scientific hizo una guía para sus circuitos EZO (https://goo.gl/dGyb12) y placa sin soldadura (https://goo.gl/uWF51n). La integración de la temperatura digital 18B20 está aquí (https://goo.gl/ATcnGd). Debe estar familiarizado con los comandos de Raspbian (una versión de Debian Linux) que se ejecutan en Raspberry Pi (https://goo.gl/549xvk)

Paso 11: Reconocimiento:

Este es mi proyecto paralelo durante mi investigación postdoctoral en la que trabajé en un fotobiorreactor avanzado para cultivar microalgas. Por eso pensé que es necesario reconocer que las partes han proporcionado las condiciones para que esto suceda. En primer lugar, la subvención, DE-EE0007093: “Enriquecimiento y entrega de CO2 atmosférico (ACED)”, del Departamento de Energía de los EE. UU., Oficina de Eficiencia Energética y Biocombustibles y Bioproductos de Algas Dirigidos a las Energías Renovables. Agradezco al Dr. Bruce E. Rittmann del Biodesign Swette Center for Environmental Biotechnology, Arizona State Univesity por brindarme la oportunidad de jugar con la electrónica y Arduino. Me formé en ingeniería ambiental, principalmente química, un poco de microbiología.