Étape 7: logiciels
Nous avons collé notre exemple de code ci-dessous. Ce code suppose que le diviseur de tension est connecté à la broche A0, la LED verte est reliée à l’e/s numérique broche 2 et la LED rouge est connectée à la Digital i/o Pin 3.
Claire & Kyle
Arduino Code projet Final
inclure le code de bibliothèque :
#include
initialiser la bibliothèque avec les numéros des broches interface
Innovente lcd(8,9,4,5,6,7) ;
la valeur d’entrée broche à broche A0
const int analogInPin = A0 ; Broche d’entrée analogique auquel est attaché le potentiomètre
int sensorValue = 0 ; valeur lue du circuit
int loadResistor = 1465 ; valeur de la résistance de charge que nous avons décidé d’utiliser (taux d’alcoolémie de 0,08 correspond à R de valeur de résistance proches de 1440 tellement habitués à maximiser la sensibilité à ce stade)
int greenLEDPin = 2 ; broche e/s numérique où nos LED verte est attaché
int redLEDPin = 3 ; broche e/s numérique où la LED rouge est attaché
initialiser toutes les variables de calcul BAC
float actualVoltage ;
float transducerResistance ;
float gasConcentration ;
float bloodConcentration ;
flotteur BAC ;
flotteur BACvalues [50] ;
float finalBAC ;
somme de flotteur ;
void setup() {}
mis en place nombre de l’écran LCD de colonnes et de lignes :
LCD.Begin (16, 2) ;
initialiser une communication série à 9600 bits/s :
Serial.Begin(9600) ;
définir les axes où les LEDs sont attachés à la sortie
pinMode(greenLEDPin,OUTPUT) ;
pinMode(redLEDPin,OUTPUT) ;
}
void loop() {}
Quand l’alcootest est branché pour la première fois dans (intro)
Imprimez nos noms et le nom de la classe
LCD.Clear() ;
lcd.setCursor(0,0) ;
LCD.Print ("Claire & Kyle") ;
lcd.setCursor(0,1) ;
LCD.Print ("BME 3300L") ;
Veillez à ce que le début de la LED éteinte et la somme débute à 0
digitalWrite(greenLEDPin,LOW) ;
digitalWrite(redLEDPin,LOW) ;
somme = 0 ;
lire l’analogue en valeur :
sensorValue = analogRead(analogInPin) ;
convertir la valeur de la sonde à la tension d’entrée réelle
actualVoltage = fenΩtre flottante (sensorValue) * 5/1024 ;
ici dire si le bouton est enfoncé, aller à l’écran de démarrage d’alcootest (pré test)
Si (actualVoltage > = 0 & & actualVoltage < = 2.00) {}
Imprimez les instructions pour le test
LCD.Clear() ;
lcd.setCursor(0,0) ;
LCD.Print ("Blow (3 secondes)") ;
lcd.setCursor(0,1) ;
LCD.Print ("Push pour démarrer") ;
Delay(1000) ;
lire l’analogue en valeur :
sensorValue = analogRead(analogInPin) ;
convertir la valeur de la sonde à la tension d’entrée réelle
actualVoltage = fenΩtre flottante (sensorValue) * 5/1024 ;
tant que le bouton n’est pas enfoncé, garder montrant les instructions pour le test
tandis que (actualVoltage > = 2.00 || actualVoltage < = 0) {}
LCD.Clear() ;
lcd.setCursor(0,0) ;
LCD.Print ("Blow (3 secondes)") ;
lcd.setCursor(0,1) ;
LCD.Print ("Push pour démarrer") ;
Delay(1000) ;
lire l’analogue en valeur :
sensorValue = analogRead(analogInPin) ;
convertir la valeur de la sonde à la tension d’entrée réelle
actualVoltage = fenΩtre flottante (sensorValue) * 5/1024 ;
}
C’est après que le bouton est enfoncé (b et c n’est plus dans le tout en boucle)
commence à courir à l’essai
Dites-leur de souffler, imprimez le BAC à chaque point
LCD.Clear() ;
lcd.setCursor(0,0) ;
LCD.Print ("Blow maintenant") ;
lcd.setCursor(0,1) ;
LCD.Print ("BAC =") ;
Delay(1000) ;
Parcourez et enregistre les BAC pendant le temps d’essai
pour (ii int = 0; ii < 50 ; ii ++) {}
C’est le code pour calculer effectivement les BAC du circuit
lire l’analogue en valeur :
sensorValue = analogRead(analogInPin) ;
convertir la valeur de la sonde à la tension d’entrée réelle
actualVoltage = fenΩtre flottante (sensorValue) * 5/1024 ;
calculer la résistance du capteur
transducerResistance = 5 * loadResistor/actualVoltage - loadResistor ;
la résistance de la sonde et la sensibilité du capteur permet de déterminer la concentration de gaz
depuis que nous avons seulement sens > 50ppm, basé sur l’étalonnage réglable BAC à 0 lorsque la résistance est supérieure à 1900
Si (transducerResistance < 1900) {}
gasConcentration = - 0, 257 * transducerResistance + 538.55 ;
}
else {}
gasConcentration = 0 ;
}
la concentration de gaz permet de calculer la concentration dans le sang
bloodConcentration = gasConcentration/0,21 ;
utiliser la concentration dans le sang pour le BAC de sortie
BAC = bloodConcentration/10000 ;
imprimer les résultats de la série monitor :
Ceci est utile pour nous pendant la phase de test pour suivre ce qui se passe
Serial.Print ("capteur =") ;
Serial.Print(sensorValue) ;
Serial.Print ("\t tension =") ;
Serial.Print(actualVoltage) ;
Serial.Print ("\t résistance =") ;
Serial.Print(transducerResistance) ;
Serial.Print ("\t concentration de gaz =") ;
Serial.Print(gasConcentration) ;
Serial.Print ("\t alcoolémie =") ;
Serial.Print(bloodConcentration) ;
Serial.Print ("\t BAC =") ;
Serial.println(bac) ;
imprimer les résultats à l’écran LCD :
au cours de l’essai, imprimer chaque point de données tout en disant à souffler
LCD.Clear() ;
lcd.setCursor(0,0) ;
LCD.Print ("Blow maintenant") ;
lcd.setCursor(0,1) ;
LCD.Print ("BAC =") ;
LCD.Print(bac) ;
BACvalues [ii] = BAC ;
}
calculer le BAC final à afficher en faisant la moyenne des valeurs sur les points de temps moyen
exclus les points d’extrémité, car ils ne peuvent pas souffler en début ou en fin
n’ai pas trouvé qu’il fallait filtrer parce que les résultats étaient très stables
pour (int kk = 15 ; kk < 35 ; kk ++) {}
Somme = somme + BACvalues [kk] ;
}
obtenir le BAC final à afficher en faisant la moyenne durant la période pertinente
finalBAC = somme/20 ;
code pour allumer les LEDs
Si le BAC est inférieure à la limite légale, allumer la LED verte
if(bac<0.08) {}
digitalWrite(greenLEDPin,HIGH) ;
digitalWrite(redLEDPin,LOW) ;
}
Si le BAC n’est pas inférieure à la limite légale, allumer la LED rouge
else {}
digitalWrite(greenLEDPin,LOW) ;
digitalWrite(redLEDPin,HIGH) ;
}
LCD.Clear() ;
lcd.setCursor(0,0) ;
LCD.Print ("Test terminé") ;
lcd.setCursor(0,1) ;
LCD.Print ("BAC =") ;
LCD.Print(finalBAC) ;
Delay(10000) ;
Serial.Print ("BAC final =") ;
Serial.println(finalBAC) ;
}
Delay(1000) ;
}