Citation preview

Cómo hacer un registrador de datos para la temperatura, el pH y el oxígeno disuelto Objetivos: 

Haga un registrador de datos por ≤ $ 500. Almacena datos de temperatura, pH y OD con una marca de tiempo y utilizando la comunicación I2C.



¿Por qué I2C (Circuito Inter-Integrado)? Uno puede 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 siguientes piezas:

1.

Arduino MEGA 2560, $ 35, https://goo.gl/6EdBGu

2.

Adaptador de corriente para la placa Arduino, $ 5.98, https://goo.gl/BzuZbk

3.

Módulo LCD I2C (pantalla), $ 8.99, https://goo.gl/za3cBn

4.

Desglose del reloj en tiempo real (RTC), $ 7.5, https://www.adafruit.com/product/3296

5.

Tablero de ruptura de tarjeta MicroSD, $ 7.5, https://www.adafruit.com/product/254

6.

Tarjeta SD de 4GB, $ 6.98, https://goo.gl/tCY2ys

7.

Sensor digital DS18B20 a prueba de agua, $ 9.95, https://www.adafruit.com/product/381

8.

Sonda de pH + Kits + scientific.com/product_pages/kit ...

9.

Sonda + Kits + buffers estándar, $ 247.45, https: //www.atlas-scientific.com/product_pages/kit ...

10.

Breadboard, cable de puente, $ 7.98, https://goo.gl/3g3mTe

11.

(Opcional) Aislador de voltaje, $ 24, https: //www.atlas-scientific.com/product_pages/cir ...

buffers

estándar,

$

149.15,

https:

//www.atlas-

Total: $ 510.48 * Ciertas piezas (como el tablero genérico) se pueden comprar a otros proveedores (eBay, vendedor chino) a un precio más bajo. Se recomiendan las 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



Use los cables de puente / DuPont para conectar las piezas como se muestra en el esquema a continuación.



Usa el multímetro para comprobar 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 alimentación y verifique el indicador de alimentación en cada parte. Cuando tenga dudas, use el multímetro para verificar que el voltaje entre VCC y GND sea (5V)

Paso 4: Preparar el PH, DO Circuits, Tarjeta SD

1. Cambiar a I2C para circuitos de pH y OD. 2. Los desgloses de pH y OD se envían con comunicación en serie como el modo predeterminado 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 por (1): desconecte los cables VCC, TX, RX, (2): salte TX a tierra para la sonda, PGND (no GND) ), (3) enchufe VCC al circuito, (4): espere a que el LED cambie de verde a azul. Más detalles verifique en la página 39 (Hoja de datos para el circuito de pH, https://goo.gl/d62Rqv ) 3. Haz el mismo paso con el circuito DO. 4. (Si sabe cómo cargar el código de muestra en el tablero, puede hacerlo a través del Monitor serie) 5. Formatear la tarjeta SD al formato FAT

Paso 5: preparar el software

1. Descargue Arduino Integrated https://www.arduino.cc/en/Main/Software

Development

Environment

(IDE),

2. Instale la biblioteca en el IDE de Arduino: https://www.arduino.cc/en/Guide/Libraries 3. La mayoría de ellos vienen con el software Arduino. LiquidCrystal_I2C.h está disponible a través de GitHub https://goo.gl/chLrS7 4. Instale el controlador para USB. Para Arduino genuino, puede que no necesite instalar uno. Para uno genérico, necesita instalar el controlador CH340 (GitHub: https://goo.gl/BZ7o32 ) 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. Uso de la plantilla de escáner I2C en Arduino IDE con la sonda conectada. 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 cable I2C, 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: Iniciar la codificación



Copie y pegue el siguiente código en Arduino IDE:



O descargue el código (.ino) y aparecerá una nueva ventana en el IDE de Arduino.

/*

Tutoriales de referencia: 1. Temperatura, ORP, registrador de pH: https: //www.instructables.com/id/ORP-pH-Temperatur ... 2. Protección digital protegida (SD): https: //learn.adafruit.com/adafruit-micro-sd-brea ... Este código enviará los datos al monitor serie Arduino. Escriba los comandos en el monitor serial Arduino para controlar el circuito de pH EZO en modo I2C. Modificado a partir de los tutoriales mencionados anteriormente, principalmente del código I2C por AtlasScientific Última actualización: 26 de julio de 2017 por Binh Nguyen * / #include // habilitar 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 identificación I2C predeterminado para el circuito EZO DO. #include "RTClib.h" // Funciones de fecha y hora con un DS1307 RTC conectado a través de I2C y Wire lib RTC_DS1307 rtc; #include // Para SD libarary

#include // tarjeta SD para almacenar datos const int chipSelect = 53; // necesito descifrar el desglose de Adafruit SD // https: //learn.adafruit.com/adafruit-micro-sd-breakout-board-cardtutorial/wiring // DO = MISO, DI = MOSI, en ATmega pin #: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS) char logFileName [] = "dataLT.txt"; // modifique logFileName para identificar su experimento, por ejemplo, PBR_01_02, datalog1 ID larga = 1; // el número de identificación para entrar en 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 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 / DO para imprimir char computerdata [20]; // instrucción de Atlas Scientific: hacemos una matriz de caracteres de 20 bytes para mantener los datos entrantes de un pc / mac / otro. byte Receive_from_computer = 0; // Necesitamos saber cuántos caracteres se han recibido. byte serial_event = 0; // un indicador para indicar cuándo se han recibido datos de pc / mac / other. código de byte = 0; // utilizado para mantener el código de respuesta I2C. char pH_data [20]; // hacemos una matriz de 20 bytes para mantener los datos entrantes del circuito de pH. byte in_char = 0; // utilizado como un búfer de 1 byte para almacenar en bytes enlazados desde el circuito de pH. byte i = 0; // contador utilizado para ph_data array. int time_ = 1800; // se utiliza para cambiar el retardo necesario según el comando enviado al circuito de pH EZO Class. flotar pH_float; // float var usado para mantener el valor de flotación del pH. char DO_data [20]; // float temp_C; void setup () // inicialización del hardware. { Serial.begin (9600); // habilitar puerto serie. Wire.begin (dirección de pH); // habilitar el puerto I2C para la sonda de pH Wire.begin (DO_address); lcd.init (); lcd.begin (20,4); LCD luz de fondo(); lcd.home (); lcd.print ("Hello PBR!"); lcd.setCursor (0,1); lcd.print ("Initializing ..."); Serial.print ("RTC es ..."); si (! rtc.begin ()) { Serial.println ("RTC: reloj en tiempo real ... NO ENCONTRADO"); while (1); // (Serial.println ("RTC: Real-time clock ... FOUND")); } Serial.println ("RUNNING"); Serial.print ("Reloj en tiempo real ..."); si (! rtc.isrunning ())

{rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__))); } Serial.println ("TRABAJANDO"); lcd.setCursor (0,0); lcd.println ("RTC: OK"); Serial.print ("tarjeta SD ..."); // ver si la tarjeta está presente y se puede inicializar: if (! SD.begin (chipSelect)) {Serial.println ("Error"); // no hagas nada mas regreso; } Serial.println ("OK"); 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. "datalog" e imprimir el encabezado if (logFile) { logFile.println (",,,"); // indica que hubo datos en la ejecución anterior String header = "Date -Time, Temp (C), pH, DO"; logFile.println (encabezado); logFile.close (); Serial.println ("READY"); //Serial.println(dataString); // imprimir en el puerto serie también: } 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 (10bit) lcd.clear (); id = 0; } bucle de vacío () {// el bucle principal. dataString = String (id); dataString = String (','); DateTime ahora = 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); 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 (); // terminar la transmisión de datos I2C. tiempo de retardo_); // espere el tiempo correcto para que el circuito complete su instrucción. Wire.requestFrom (pH_address, 20,1); // llame al circuito y solicite 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 31) && (in_char