Stap 4: Arduino, Code en Data manipulatie
Zoals geschreven, vindt het instrument een ph, ORP en temperatuurmetingen iedere 12 seconden; dat tijdsinterval is gemakkelijk aangepast worden door het veranderen van de vertraging in het programma op lijn 95. De lezingen worden weergegeven op het LCD-scherm, en het zal de gegevens loggen naar de SD-kaart in een tekstbestand met de naam datalog. Als ik klaar logboekgegevens, ik open het bestand in Word, en het lijkt alsof de afbeelding. Vervolgens heb ik een zoekopdracht en vervangen voor "^ p," (dat is een alineamarkering en een komma) en vervangen door een "^ t" (dat is een tabteken) door tabs gescheiden gegevens op te halen. Ik sla het bestand en open het met Excel als een door tabs gescheiden tekstbestand. Dit geeft mij een spreadsheet met de verstreken tijd sinds het begin van het programma, in milliseconden, in de eerste kolom; de pH in de tweede kolom; de ORP in de derde kolom; en de temperatuur in graden Celsius in de vierde kolom. Als u de tijd die het programma begon, dan kunt u berekenen met behulp van Excel bijhouden van de tijd elke lezing werd genomen. Instructies voor het manipuleren van het gegevensbestand worden gegeven in meer detail in het bijgevoegde bestand.
Code:
Bibliotheken
#include < LiquidCrystal.h > //LCD bibliotheek
#include < SoftwareSerial.h > //SoftwareSerial bibliotheek
#include < OneWire.h >
#include < DallasTemperature.h >
#include < SPI.h > //SPI bibliotheek voor SD-kaart
#include < SD.h > //SD-kaart bibliotheek
Seriële poorten
#define orprx 2 //define welke pin orp rx is gonna be
#define orptx 3 //define wat pin orp Tx is gonna be
SoftwareSerial orpserial (orprx, orptx); definieert u de ORP zachte seriële poort
#define phrx 14 //define wat pin pH rx is gonna be
#define phtx 15 //define welke pin pH Tx is gonna be
SoftwareSerial phserial (phrx, phtx); definieert u de pH zacht seriële poort
Temperatuur sonde setup
#define ONE_WIRE_BUS 19 / / gegevens draad 19 pin op de Arduino is aangesloten
Privacy oneWire(ONE_WIRE_BUS); Opstelling van een exemplaar van de privacy om te communiceren met alle apparaten privacy
DallasTemperature sensoren (& Privacy); Onze privacy verwijzing naar Dallas temperatuur doorgeeft.
DeviceAddress insideThermometer = {0x28, 0xB4, 0x6B, 0xC8, 0x04, 0x00, 0x00, 0x1F}; De adressen van uw 1-Wire temperatuur sensoren moet toewijzen.
ORP variabelen definiëren
char orp_data [20]; 20 byte karakter array ORP gegevens over uw
char orp_computerdata [20]; 20 byte karakter array voor binnenkomende gegevens vanaf een pc
byte orp_received_from_computer = 0; We willen weten hoeveel teken zijn ontvangen.
byte orp_received_from_sensor = 0; We willen weten hoeveel teken zijn ontvangen.
byte orp_startup = 0; gebruikt om te controleren of neemt de arduino controle van het Circuit van ORP goed.
ORP zweven = 0; bestemd is voor een drijvende komma thats de ORP
byte orp_string_received = 0; gebruikt om te bepalen wanneer we een tekenreeks hebben ontvangen in het circuit van ORP
pH-servervariabelen definiëren
char ph_data [20]; 20 byte karakter array te houden inkomende pH
char ph_computerdata [20]; 20 byte karakter array voor binnenkomende gegevens vanaf een pc
byte pc_debug = 0; Als u de pH Circuit via de seriële monitor(pc/mac/other) debug willen zou. Zoniet zet dit op 0.
byte ph_received_from_computer = 0; We willen weten hoeveel tekens zijn ontvangen van computer
byte ph_received_from_sensor = 0; We willen weten hoeveel tekens hebben ontvangen pH sensor
byte ph_startup = 0; gebruikt om te controleren of neemt de arduino controle over de pH Circuit goed.
zweven ph = 0; bestemd is voor een drijvende komma thats de pH.
byte ph_string_received = 0; gebruikt om te bepalen wanneer we een string van het pH-circuit hebben ontvangen.
LCD instellen
LiquidCrystal lcd (8, 9, 4, 5, 6, 7); Selecteer de pinnen gebruikt op het LCD-scherm
VOID Setup {}
Serial.begin(38400); de hardware seriële poort inschakelen
orpserial.begin(38400); de software seriële poort inschakelen
phserial.begin(38400); de software seriële poort inschakelen
sensors.begin(); opstarten van temp sonde bibliotheek
sensors.setResolution (insideThermometer, 10); Stel de temp sonde resolutie 10 bit
LCD.begin (16, 2); Start van de LCD-bibliotheek
SD.begin(16);
pinMode (10, OUTPUT);
}
void loop {}
sensors.requestTemperatures(); Lees Temp sonde
printTemperature(insideThermometer);
orpserial.listen();
delay(100);
if(orpserial.available() > 0) {//if we zien dat het ORP Circuit een teken heeft gestuurd.
orp_received_from_sensor=orpserial.readBytesUntil(13,orp_data,20); We lezen de gegevens die worden verzonden vanaf ORP Circuit totdat we zien een < CR >. We rekenen ook hoeveel teken geweest recived.
orp_data [orp_received_from_sensor] = 0; voegen we een 0 aan de plek in de matrix net na het laatste teken wij recived. Dit zal ons weerhouden transmiting onjuiste gegevens die in de buffer kan hebben gelaten.
orp_string_received = 1; een vlag gebruikt wanneer de arduino is het regelen van het ORP Circuit te laten weten dat er een volledige tekenreeks zijn ontvangen.
}
phserial.listen();
delay(100);
if(phserial.available() > 0) {//if we zien dat de pH Circuit een teken heeft gestuurd.
ph_received_from_sensor=phserial.readBytesUntil(13,ph_data,20); We lezen de gegevens verzonden van ph Circuit totdat we zien een < CR >. We rekenen ook hoeveel teken geweest recived.
ph_data [ph_received_from_sensor] = 0; voegen we een 0 aan de plek in de matrix net na het laatste teken wij recived. Dit zal ons weerhouden transmiting onjuiste gegevens die in de buffer kan hebben gelaten.
ph_string_received = 1; een vlag gebruikt wanneer de arduino is het regelen van de pH Circuit te laten weten dat er een volledige tekenreeks zijn ontvangen.
}
}
VOID printTemperature(DeviceAddress deviceAddress)
{
int decPlaces = 0; set temp decimalen op 0
zweven tempC = sensors.getTempC(deviceAddress);
Als (tempC ==-127.00) {}
LCD.Print ("Error getting temperatuur");
} else {}
lcd.setCursor(0,0); positie instellen op LCD-scherm voor pH
LCD.Print("pH:");
LCD.Print (ph, 1); pH verzenden lcd
lcd.setCursor(7,0); positie instellen op LCD-scherm voor ORP
LCD.Print("ORP:");
LCD.Print (ORP, 0); ORP verzenden lcd
lcd.setCursor(0,1); positie instellen op LCD-scherm voor Temp
LCD.Print("temp:");
LCD.Print ("C");
LCD.Print(tempC,decPlaces); Temp display in celsius
LCD.Print ("F");
LCD.Print(DallasTemperature::toFahrenheit(tempC),decPlaces); celsius converteren naar Fahrenheit
delay(10000); zullen wij een lezing ooit 10000ms
orpserial.Print("R\r"); Stuur het de opdracht om een enkele lezing.
if(orp_string_received==1) {//did we krijgen gegevens terug uit het ORP Circuit?
ORP=Atof(orp_data); orp_data tekenreeks omzetten ORP float
Als (ORP > 800){Serial.println("high\r");} //This is het bewijs dat het is omgezet in een tekenreeks.
Als (ORP < 800){Serial.println("low\r");} Dit is het bewijs dat het is omgezet in een tekenreeks.
orp_string_received = 0;} Reset de tekenreeks ontvangen vlag.
phserial.Print("R\r"); Stuur het de opdracht om een enkele lezing.
if(ph_string_received==1) {//did we gegevens terug te krijgen van de ph Circuit?
pH=Atof(ph_data); ph_data tekenreeks omzetten in ph float
Als (ph > = 7.5){Serial.println("high\r");} //This is het bewijs dat het is omgezet in een tekenreeks.
Als (ph < 7.5){Serial.println("low\r");} Dit is het bewijs dat het is omgezet in een tekenreeks.
ph_string_received = 0;} Reset de tekenreeks ontvangen vlag.
}
lange currentTime = millis(); Krijgen van de huidige tijd in ms (keer sinds het programma starten)
Bestand dataFile = SD.open ("datalog.txt", FILE_WRITE); Open het bestand
Als (dataFile) {/ / als het bestand beschikbaar is, schrijven:
dataFile.println(currentTime); registreert de tijd in milliseconden sinds het programma is gestart
dataFile.print(","); Hiermee voegt u een komma
dataFile.println(ph); registreert de pH
dataFile.print(","); Hiermee voegt u een komma
dataFile.println(ORP); Logboeken de ORP
dataFile.print(","); Hiermee voegt u een komma
dataFile.println(tempC); registreert de temperatuur in graden C
dataFile.print("\r"); Hiermee voegt u een return-teken
dataFile.close();
}
}