Paso 4: Código de Arduino y manipulación de datos
Como está escrito, el instrumento tendrá un ph, ORP y temperatura cada 12 segundos; ese intervalo de tiempo se ajusta fácilmente al cambiar el retraso en el programa en línea de 95. Se mostrarán las lecturas en la pantalla LCD, y registrará los datos a la tarjeta SD en un archivo de texto llamado datalog. Cuando estoy acabado registro de datos, abrir el archivo en Word, y se parece a la imagen. Después hacer una búsqueda y reemplazar por "^ p," (que es una marca de párrafo y una coma) y sustituir con un "^ t" (que es un carácter de tabulación) para obtener datos delimitado. Luego guarde el archivo y abrirlo con Excel como un archivo de texto delimitado ficha. Esto me da una hoja de cálculo con el tiempo transcurrido desde que el programa comenzó, en milisegundos, en la primera columna; el pH en la segunda columna; la ORP en la tercera columna; y la temperatura en grados Celsius en la cuarta columna. Si hacer un seguimiento del tiempo que el programa comenzó, se puede entonces calcular usando Excel la hora cada lectura fue tomada. Se dan instrucciones para manipular el archivo de datos con más detalle en el archivo adjunto.
Código:
Bibliotecas
#include < LiquidCrystal.h > //LCD biblioteca
#include < SoftwareSerial.h > //SoftwareSerial biblioteca
#include < OneWire.h >
#include < DallasTemperature.h >
#include < SPI.h > //SPI biblioteca para tarjeta SD
#include < SD.h > Biblioteca de tarjeta //SD
Puertos serie
#define orprx 2 //define qué orp pin rx va a ser
#define orptx 3 //define qué orp pin Tx va a ser
SoftwareSerial orpserial (orprx, orptx); definir el puerto serie suave de ORP
#define phrx 14 //define qué pH pin rx va a ser
#define phtx 15 //define qué pH pin Tx va a ser
SoftwareSerial phserial (phrx, phtx); definir el puerto serie suave de pH
Instalación de sonda de temperatura
#define ONE_WIRE_BUS 19 / / cable de datos esté conectado a pin 19 en Arduino
OneWire oneWire(ONE_WIRE_BUS); Configuración de una instancia de oneWire para comunicarse con dispositivos OneWire
DallasTemperature sensors (& oneWire); Pasar nuestra referencia oneWire a temperatura de Dallas.
DeviceAddress insideThermometer = {0x28, 0xB4, 0x6B, 0xC8, 0 x 04, 0 x 00, 0 x 00, 0x1F}; Asigne las direcciones de sus sensores de temperatura 1-Wire.
definir variables ORP
char orp_data [20]; matriz de caracteres de 20 bytes para almacenar datos ORP
char orp_computerdata [20]; matriz de caracteres de 20 bytes para datos entrantes de un pc
byte orp_received_from_computer = 0; Necesitamos saber cuántos caracteres se han recibido.
byte orp_received_from_sensor = 0; Necesitamos saber cuántos caracteres se han recibido.
byte orp_startup = 0; utilizado para asegurarse de que el arduino asume el control ORP del circuito de la correctamente.
ORP de flotador = 0; utiliza para mantener una flotación número que es la ORP de punto
byte orp_string_received = 0; sirve para identificar cuando hemos recibido una cadena desde el circuito ORP
definir las variables de pH
char ph_data [20]; matriz de caracteres de byte 20 para mantener pH entrante
char ph_computerdata [20]; matriz de caracteres de 20 bytes para datos entrantes de un pc
byte pc_debug = 0; Si desea depurar el pH circuito a través de la serie monitor(pc/mac/other). Si no esta a 0.
byte ph_received_from_computer = 0; Necesitamos saber cuántos caracteres se han recibido desde ordenador
byte ph_received_from_sensor = 0; Necesitamos saber cuántos caracteres se han recibido de sensor de pH
byte ph_startup = 0; utilizado para asegurarse de que el arduino asume el control del pH del circuito correctamente.
ph del flotador = 0; utiliza para mantener una flotación número que es el pH de punto.
byte ph_string_received = 0; utiliza para identificar cuando hemos recibido una cadena desde el circuito de pH.
Configurar LCD
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); Seleccione los pines utilizados en el panel LCD
void setup() {}
Serial.Begin(38400); habilitar el puerto serial del hardware
orpserial.Begin(38400); habilitar el puerto serial software
phserial.Begin(38400); habilitar el puerto serial software
Sensors.Begin(); Inicio Biblioteca sonda temp
sensors.setResolution (insideThermometer, 10); Ajuste la resolución de la sonda temp 10 bit
LCD.Begin (16, 2); iniciar la biblioteca lcd
SD.begin(16);
pinMode (10, salida);
}
void loop() {}
sensors.requestTemperatures(); leer sonda Temp
printTemperature(insideThermometer);
orpserial.Listen();
Delay(100);
if(orpserial.Available() > 0) {//if vemos que el circuito de ORP ha enviado un carácter.
orp_received_from_sensor=orpserial.readBytesUntil(13,orp_data,20); leemos los datos del circuito de ORP hasta vemos una < CR >. También contamos cómo muchos caracteres han recivido.
orp_data [orp_received_from_sensor] = 0; añadimos un 0 al lugar de la matriz sólo después de que el ultimo personaje recibió. Esto nos dejará de transmitir datos incorrectos que puedan haber sido dejados en el búfer.
orp_string_received = 1; una bandera cuando el arduino controla el circuito de ORP para hacernos saber que se ha recibido una cadena completa.
}
phserial.Listen();
Delay(100);
if(phserial.Available() > 0) {//if vemos que el pH circuito ha enviado un carácter.
ph_received_from_sensor=phserial.readBytesUntil(13,ph_data,20); leemos los datos enviados de ph hasta de circuito vemos un < CR >. También contamos cómo muchos caracteres han recivido.
ph_data [ph_received_from_sensor] = 0; añadimos un 0 al lugar de la matriz sólo después de que el ultimo personaje recibió. Esto nos dejará de transmitir datos incorrectos que puedan haber sido dejados en el búfer.
ph_string_received = 1; una bandera cuando el arduino controla el pH circuito para hacernos saber que se ha recibido una cadena completa.
}
}
void printTemperature(DeviceAddress deviceAddress)
{
int decPlaces = 0; sets temporales decimales 0
flotador tempC = sensors.getTempC(deviceAddress);
Si (tempC ==-127.00) {}
LCD.Print ("Error al obtener la temperatura");
} else {}
lcd.setCursor(0,0); posición en la pantalla lcd para pH
LCD.Print("pH:");
LCD.Print (ph, 1); pH de enviar a la lcd
lcd.setCursor(7,0); posición en la pantalla lcd para ORP
LCD.Print("ORP:");
LCD.Print (ORP, 0); enviar ORP a lcd
lcd.setCursor(0,1); establecer la posición en la pantalla lcd para temperatura
LCD.Print("Temp:");
LCD.Print ("C");
LCD.Print(tempC,decPlaces); Mostrar la temperatura en grados celsius
LCD.Print ("F");
LCD.Print(DallasTemperature::toFahrenheit(tempC),decPlaces); convertir a grados celsius a farenheit
Delay(10000); vamos a tomar una lectura cada vez 10000ms
orpserial.Print("R\r"); enviar el comando para tomar una lectura única.
¿if(orp_string_received==1) {//did volvemos datos del circuito de ORP?
ORP=atof(orp_data); convertir cadena de orp_data en flotador ORP
Si (ORP > 800){Serial.println("high\r");} //This es la prueba que se ha convertido en una cadena.
Si (ORP < 800){Serial.println("low\r");} Esta es la prueba que se ha convertido en una cadena.
orp_string_received = 0;} restablecer la bandera de la cadena recibida.
phserial.Print("R\r"); enviar el comando para tomar una lectura única.
¿if(ph_string_received==1) {//did volvemos datos de ph circuito?
pH=atof(ph_data); convertir cadena de ph_data en ph flotación
Si (ph > = 7.5){Serial.println("high\r");} //This es la prueba que se ha convertido en una cadena.
Si (ph < 7.5){Serial.println("low\r");} Esta es la prueba que se ha convertido en una cadena.
ph_string_received = 0;} restablecer la bandera de la cadena recibida.
}
currentTime largo = millis(); Obtener la hora actual en ms (tiempo desde que inicia del programa)
Archivo de datos de archivo = SD.open ("datalog.txt", FILE_WRITE); Abra el archivo
Si (dataFile) {/ / si está disponible el archivo, escribir en él:
dataFile.println(currentTime); registra el tiempo en milisegundos desde que inició el programa
dataFile.print(","); inserta una coma
dataFile.println(ph); registra el pH
dataFile.print(","); inserta una coma
dataFile.println(ORP); registros de la ORP
dataFile.print(","); inserta una coma
dataFile.println(tempC); registra la temperatura en grados C
dataFile.print("\r"); inserta un carácter de retorno del
dataFile.close();
}
}