ORP / pH / temperatur datalogger (4 / 5 steg)
Steg 4: Arduino kod och datamanipulation
Som skrivet, kommer instrumentet att vidta en ph, ORP och temperaturavläsningen varje 12 sekunder. det tidsintervallet justeras enkelt genom att ändra fördröjningen i programmet på linje 95. Avläsningarna visas på LCD-skärmen och det kommer att logga data till SD-kortet i en text arkivera benämn datalog. När jag är färdig logga data, jag öppnar filen i Word och det ser ut som på bilden. Jag sedan Sök och ersätt för "^ p," (som är ett stycketecken och ett komma) och ersätta med en "^ t" (som är ett tabbtecken) få tabbavgränsad data. Jag sedan spara filen och öppna den i Excel som en tab avgränsad textfil. Detta ger mig ett kalkylblad med förfluten tid sedan programmet startade, i millisekunder, i den första kolumnen; pH-värdet i den andra kolumnen; ORP i tredje kolumnen. och temperatur i grader Celsius i den fjärde kolumnen. Om du hålla reda på tiden programmet började, du kan sedan räkna ut med hjälp av Excel tiden varje behandlingen togs. Närmare i den bifogade filen ges instruktioner att manipulera datafilen.
Kod:
Bibliotek
#include < LiquidCrystal.h > //LCD bibliotek
#include < SoftwareSerial.h > //SoftwareSerial bibliotek
#include < OneWire.h >
#include < DallasTemperature.h >
#include < SPI.h > //SPI bibliotek för SD-kort
#include < SD.h > //SD kort bibliotek
Seriella portar
#define orprx 2 //define vad pin orp rx kommer att vara
#define orptx 3 //define vilken pin orp Tx kommer att vara
SoftwareSerial orpserial (orprx, orptx); definiera ORP mjuk serieporten
#define phrx 14 //define vilken pin pH rx kommer att vara
#define phtx 15 //define vilken pin pH Tx kommer att vara
SoftwareSerial phserial (phrx, phtx); definiera pH mjuk serieporten
Temperatur sond setup
#define ONE_WIRE_BUS 19 / / Data kabeln är ansluten till pin 19 på Arduino
OneWire oneWire(ONE_WIRE_BUS); Setup en oneWire instans att kommunicera med någon OneWire enheter
DallasTemperature sensorer (& oneWire); Passera vår oneWire referens till Dallas temperatur.
DeviceAddress insideThermometer = {0x28, 0xB4, 0x6B, 0xC8, 0x04, 0x00, 0x00, 0x1F}; Tilldela adresser till din 1-Wire temp givare.
definiera ORP variabler
char orp_data [20]. Bytematrisen 20 tecken att hålla ORP data
char orp_computerdata [20]. Bytematrisen 20 tecken att hålla inkommande data från en pc
byte orp_received_from_computer = 0; Vi behöver veta hur många tecken har tagits emot.
byte orp_received_from_sensor = 0; Vi behöver veta hur många tecken har tagits emot.
byte orp_startup = 0; används för att kontrollera tar arduino över kontrollen av ORP kretsen ordentligt.
flyta ORP = 0; används för att hålla ett flytande punkt nummer som är ORP
byte orp_string_received = 0; används för att identifiera när vi har fått en sträng från ORP kretsen
definiera pH variabler
char ph_data [20]. Bytematrisen 20 tecken att hålla inkommande pH
char ph_computerdata [20]. Bytematrisen 20 tecken att hålla inkommande data från en pc
byte pc_debug = 0; Om du vill felsöka pH krets genom den seriella monitor(pc/mac/other). om inte ange detta till 0.
byte ph_received_from_computer = 0; Vi behöver veta hur många tecken har tagits emot från dator
byte ph_received_from_sensor = 0; Vi behöver veta hur många tecken har tagits emot från pH sensor
byte ph_startup = 0; används för att kontrollera tar arduino över kontrollen av pH krets ordentligt.
flyta ph = 0; används för att hålla ett flytande punkt nummer som är pH-värdet.
byte ph_string_received = 0; används för att identifiera när vi har mottagit en sträng från pH-circuit.
LCD ställa in
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); Välj stift används på LCD-panelen
void setup() {
Serial.BEGIN(38400); Aktivera hårdvara serieporten
orpserial.BEGIN(38400); Aktivera programvara serieporten
phserial.BEGIN(38400); Aktivera programvara serieporten
sensors.BEGIN(); starta upp temp sond bibliotek
sensors.setResolution (insideThermometer, 10); Ställ in upplösningen med temp sond till 10 bit
LCD.BEGIN (16, 2); Starta LCD-biblioteket
SD.begin(16);
pinMode (10, OUTPUT);
}
void loop() {
sensors.requestTemperatures(); Läs Temp sond
printTemperature(insideThermometer);
orpserial.listen();
Delay(100);
IF(orpserial.available() > 0) {//if ser vi att ORP kretsen har skickat en karaktär.
orp_received_from_sensor=orpserial.readBytesUntil(13,orp_data,20); Vi läser data som skickas från ORP Circuit, tills vi ser en < CR >. Vi också räkna hur många tecken har fått.
orp_data [orp_received_from_sensor] = 0; vi lägga till en 0 till plats i matrisen bara efter sist tecknet vi fick ta emot. Detta kommer att hindra oss från transmiting felaktiga uppgifter som kan ha varit kvar i bufferten.
orp_string_received = 1; en flagga som används när arduino kontrollerar ORP kretsen att låta oss veta att en komplett sträng har inkommit.
}
phserial.listen();
Delay(100);
IF(phserial.available() > 0) {//if ser vi att pH krets har skickat en karaktär.
ph_received_from_sensor=phserial.readBytesUntil(13,ph_data,20); Vi läser data som skickas från ph krets, tills vi ser en < CR >. Vi också räkna hur många tecken har fått.
ph_data [ph_received_from_sensor] = 0; vi lägga till en 0 till plats i matrisen bara efter sist tecknet vi fick ta emot. Detta kommer att hindra oss från transmiting felaktiga uppgifter som kan ha varit kvar i bufferten.
ph_string_received = 1; en flagga som används när arduino kontrollerar pH krets att låta oss veta att en komplett sträng har inkommit.
}
}
void printTemperature(DeviceAddress deviceAddress)
{
int decPlaces = 0; inställd temp decimaler på 0
flyta tempC = sensors.getTempC(deviceAddress);
om (tempC ==-127.00) {
LCD.Print ("fel få temperatur");
} annat {
lcd.setCursor(0,0); Ange position på lcd för pH
LCD.Print("pH:");
LCD.Print (ph, 1); Skicka pH till lcd
lcd.setCursor(7,0); Ange position på lcd för ORP
LCD.Print("ORP:");
LCD.Print (ORP, 0); Skicka ORP till lcd
lcd.setCursor(0,1); Ange position på lcd för Temp
LCD.Print("Temp:");
LCD.Print ("C").
LCD.Print(tempC,decPlaces); Visa Temp i celsius
LCD.Print "F".
LCD.Print(DallasTemperature::toFahrenheit(tempC),decPlaces); konvertera celsius till Fahrenheit
Delay(10000); Vi kommer att ta en behandling någonsin 10000ms
orpserial.Print("R\r"); Skicka det kommandot för att ta en enda behandling.
IF(orp_string_received==1) {//did vi få data tillbaka från ORP kretsen?
ORP=ATOF(orp_data); konvertera orp_data sträng ORP flyta
om (ORP > 800){Serial.println("high\r");} //This är beviset för att den har konverterats till en sträng.
om (ORP < 800){Serial.println("low\r");} //This är beviset för att den har konverterats till en sträng.
orp_string_received = 0;} återställa sträng emot flaggan.
phserial.Print("R\r"); Skicka det kommandot för att ta en enda behandling.
IF(ph_string_received==1) {//did vi få data tillbaka från ph krets?
pH=ATOF(ph_data); konvertera ph_data sträng ph flyta
om (ph > = 7.5){Serial.println("high\r");} //This är beviset för att den har konverterats till en sträng.
om (ph < 7.5){Serial.println("low\r");} //This är beviset för att den har konverterats till en sträng.
ph_string_received = 0;} återställa sträng emot flaggan.
}
långa currentTime = millis(); Få aktuell tid i ms (tid sedan startar programmet)
Fil dataFile = SD.open ("datalog.txt", FILE_WRITE); Öppna filen
om (dataFile) {/ / om filen är tillgänglig, skriva till det:
dataFile.println(currentTime); loggar tiden i millisekunder sedan programmet startade
dataFile.print(","); infogar ett kommatecken
dataFile.println(ph); loggar pH
dataFile.print(","); infogar ett kommatecken
dataFile.println(ORP); loggar ORP
dataFile.print(","); infogar ett kommatecken
dataFile.println(tempC); loggar temperatur i grader C
dataFile.print("\r"); infogar ett tecken
dataFile.close();
}
}