Étape 4: Code de l’Arduino et Manipulation de données
Comme l’écrit, l’instrument aura un ph, ORP et température toutes les 12 secondes ; cet intervalle de temps est facilement réglable en changeant le retard dans le programme en ligne 95. Il affiche les lectures sur l’écran LCD et il enregistrera les données sur la carte SD dans un fichier texte nommé datalog. Quand je suis fini données de journalisation, j’ouvre le fichier dans Word, et il ressemble à l’image. Je puis faire une recherche et remplacer pour "^ p, » (c’est une marque de paragraphe et une virgule) et les remplacer par un" ^ t "(c’est un caractère de tabulation) pour obtenir les données délimité par des tabulations. Je puis enregistrez le fichier et l’ouvrir avec Excel en format texte délimité onglet. Cela me donne une feuille de calcul avec le temps écoulé depuis le début du programme, en millisecondes, dans la première colonne ; le pH dans la deuxième colonne ; l’ORP dans la troisième colonne ; et la température en degrés Celsius dans la quatrième colonne. Si vous garder une trace de l’époque, que le programme a commencé, vous pouvez alors calculer à l’aide d’Excel le temps chaque lecture a été effectuée. Instructions pour manipuler le fichier de données sont données en détail dans le fichier joint.
Code :
Bibliothèques
#include < LiquidCrystal.h > //LCD bibliothèque
#include < SoftwareSerial.h > //SoftwareSerial bibliothèque
#include < OneWire.h >
#include < DallasTemperature.h >
#include < SPI.h > //SPI bibliothèque pour carte SD
bibliothèque de carte //SD #include < SD.h >
Ports série
#define orprx 2 //define quel orp broche rx va être
#define orptx 3 //define quel orp broche Tx va être
SoftwareSerial orpserial (orprx, orptx) ; définir le port série soft ORP
#define phrx 14 //define quel pH broche rx va être
#define phtx 15 //define quel pH broche Tx va être
SoftwareSerial phserial (phrx, phtx) ; définir le port série doux pH
Configuration de sonde de température
#define ONE_WIRE_BUS 19 / / données fil est branché sur la broche 19 sur l’Arduino
OneWire oneWire(ONE_WIRE_BUS) ; Configurer une instance oneWire pour communiquer avec les périphériques OneWire
Capteurs DallasTemperature (& oneWire) ; Passez notre référence oneWire à température de Dallas.
DeviceAddress insideThermometer = {0 x 28, 0xB4, 0x6B, 0xC8, 0 x 04, 0 x 00, 0 x 00, 0x1F} ; Affectez les adresses de vos capteurs de température 1-Wire.
définir des variables de l’ORP
char orp_data [20] ; Tableau de caractères de 20 octets pour conserver les données de l’ORP
char orp_computerdata [20] ; Tableau de caractères de 20 octets pour stocker les données entrantes depuis un pc
orp_received_from_computer octets = 0 ; Nous avons besoin de savoir combien de caractères ont été reçues.
orp_received_from_sensor octets = 0 ; Nous avons besoin de savoir combien de caractères ont été reçues.
orp_startup octets = 0 ; utilisé pour s’assurer que l’arduino prend contrôle du Circuit ORP correctement.
flotteur ORP = 0 ; utilisée pour contenir une flottante point numéro de l’ORP
orp_string_received octets = 0 ; utilisé pour identifier quand nous avons reçu une chaîne depuis le circuit ORP
définir des variables de pH
char ph_data [20] ; Tableau de caractères de 20 octets de tenir pH entrant
char ph_computerdata [20] ; Tableau de caractères de 20 octets pour stocker les données entrantes depuis un pc
pc_debug octets = 0 ; Si vous souhaitez déboguer le pH Circuit par l’intermédiaire de la série monitor(pc/mac/other). Si ce n’est mettre à 0.
ph_received_from_computer octets = 0 ; Nous avons besoin de savoir combien de caractères ont été reçues de l’ordinateur
ph_received_from_sensor octets = 0 ; Nous avons besoin de savoir combien de caractères ont été reçues de capteur de pH
ph_startup octets = 0 ; utilisé pour s’assurer que l’arduino reprend le contrôle du pH Circuit correctement.
flotter à ph = 0 ; utilisée pour contenir une flottante point nombre qui est le pH.
ph_string_received octets = 0 ; permet d’identifier lorsque nous avons reçu une chaîne du circuit pH.
LCD, mis en place
Innovente lcd (8, 9, 4, 5, 6, 7) ; Sélectionnez les broches sur le panneau ACL
void setup() {}
Serial.Begin(38400) ; activez le port série du matériel
orpserial.Begin(38400) ; activez le port série de logiciel
phserial.Begin(38400) ; activez le port série de logiciel
sensors.Begin() ; bibliothèque de sonde temp de démarrage
sensors.setResolution (insideThermometer, 10) ; Réglez la résolution de la sonde temp sur 10 bits
LCD.Begin (16, 2) ; Démarrer la bibliothèque lcd
SD.begin(16) ;
pinMode (sortie 10,) ;
}
void loop() {}
sensors.requestTemperatures() ; lire la sonde Temp
printTemperature(insideThermometer) ;
orpserial.Listen() ;
Delay(100) ;
if(orpserial.available() > 0) {//if nous voyons que le Circuit de ORP a envoyé un personnage.
orp_received_from_sensor=orpserial.readBytesUntil(13,orp_data,20) ; On peut lire les données envoyées du Circuit de ORP jusqu'à ce que nous voyons un < CR >. Nous comptons également combien de caractères ont été recived.
orp_data [orp_received_from_sensor] = 0 ; Nous n’ajoutons un 0 à la tache dans le tableau juste après le dernier caractère nous recived. Cela ne nous empêchera pas de transmiting des données incorrectes qui peuvent avoir été laissées dans la mémoire tampon.
orp_string_received = 1 ; un drapeau utilisé lors de l’arduino est de contrôler le Circuit de ORP pour nous faire savoir qu’une chaîne complète a été reçue.
}
phserial.Listen() ;
Delay(100) ;
if(phserial.available() > 0) {//if nous voyons que le pH Circuit a envoyé un personnage.
ph_received_from_sensor=phserial.readBytesUntil(13,ph_data,20) ; Nous avons lu les données envoyées du ph Circuit jusqu'à ce que nous voyons un < CR >. Nous comptons également combien de caractères ont été recived.
ph_data [ph_received_from_sensor] = 0 ; Nous n’ajoutons un 0 à la tache dans le tableau juste après le dernier caractère nous recived. Cela ne nous empêchera pas de transmiting des données incorrectes qui peuvent avoir été laissées dans la mémoire tampon.
ph_string_received = 1 ; un drapeau utilisé lors de l’arduino est de contrôler le pH Circuit pour nous faire savoir qu’une chaîne complète a été reçue.
}
}
Sub printTemperature(DeviceAddress deviceAddress)
{
int decPlaces = 0 ; la valeur décimale temp 0
flotteur NC = sensors.getTempC(deviceAddress) ;
Si (NC ==-127.00) {}
LCD.Print ("Error getting température") ;
} else {}
lcd.setCursor(0,0) ; définir la position sur l’écran lcd pour le pH
LCD.Print("pH:") ;
LCD.Print (ph, 1) ; Envoyer le pH à lcd
lcd.setCursor(7,0) ; définir la position sur l’écran lcd pour ORP
LCD.Print("ORP:") ;
LCD.Print (ORP, 0) ; Envoyer des ORP pour lcd
lcd.setCursor(0,1) ; définir la position sur l’écran lcd de Temp
LCD.Print("Temp:") ;
LCD.Print ("C") ;
LCD.Print(tempC,decPlaces) ; afficher la température en degrés celsius
LCD.Print ("F") ;
LCD.Print(DallasTemperature::toFahrenheit(tempC),decPlaces) ; convertir les degrés celsius en Fahrenheit
Delay(10000) ; Nous allons prendre une lecture jamais 10000ms
orpserial.Print("R\r") ; Envoyer la commande pour prendre une lecture unique.
if(orp_string_received==1) {//did nous récupérer les données du circuit de ORP ?
ORP=atof(orp_data) ; Convertit une chaîne d’orp_data en float ORP
Si (ORP > 800){Serial.println("high\r");} //This est la preuve qu’il a été converti en une chaîne.
Si (ORP < 800){Serial.println("low\r");} C’est la preuve qu’il a été converti en une chaîne.
orp_string_received = 0;} réinitialiser l’indicateur de chaîne reçue.
phserial.Print("R\r") ; Envoyer la commande pour prendre une lecture unique.
if(ph_string_received==1) {//did nous récupérer les données depuis le ph Circuit ?
pH=atof(ph_data) ; Convertit une chaîne de ph_data en ph flotteur
Si (ph > = 7.5){Serial.println("high\r");} //This est la preuve qu’il a été converti en une chaîne.
Si (ph < 7.5){Serial.println("low\r");} C’est la preuve qu’il a été converti en une chaîne.
ph_string_received = 0;} réinitialiser l’indicateur de chaîne reçue.
}
currentTime long = millis() ; Obtenir l’heure actuelle en ms (temps étant donné que le programme démarre)
Fichier dataFile = SD.open ("datalog.txt", FILE_WRITE) ; ouvrir le fichier
Si (dataFile) {/ / si le fichier est disponible, écrivez à elle :
dataFile.println(currentTime) ; enregistre le temps en millisecondes depuis le début du programme
dataFile.print(",") ; insère une virgule
dataFile.println(ph) ; enregistre le pH
dataFile.print(",") ; insère une virgule
dataFile.println(ORP) ; journaux de l’ORP
dataFile.print(",") ; insère une virgule
dataFile.println(tempC) ; enregistre la température en degrés C
dataFile.print("\r") ; insère un caractère de retour chariot
dataFile.close() ;
}
}