BME 3300 BAC mätaren (7 / 8 steg)
Steg 7: programvara
Vi har klistrat in våra prov koden nedan. Denna kod förutsätter att spänningsavdelaren är ansluten till pin A0, den gröna lysdioden är ansluten till den digitala i/o Pin 2 och den röda lysdioden är ansluten till den digitala i/o Pin 3.
Claire & Kyle
Arduino koden för projekt
inkludera bibliotek-koden:
#include
initiera bibliotek med numrerar av gränssnittet stiften
LiquidCrystal lcd(8,9,4,5,6,7);
ställa in ingångsstift att vara pin A0
CONST int analogInPin = A0; Analog ingång pin som potentiometern är kopplad till
int sensorValue = 0; värdet läsa från kretsen
int loadResistor = 1465; värdet av belastning motståndet som vi har beslutat att använda (BAC på 0.08 motsvarar R av 1440 så används nära motstånd värde att maximera känsligheten på denna punkt)
int greenLEDPin = 2; Digital IO pin där våra gröna LED är fäst
int redLEDPin = 3; Digital IO pin där röda lysdioden är fäst
initiera alla variabler för beräkning av BAC
float actualVoltage;
float transducerResistance;
float gasConcentration;
float bloodConcentration;
float BAC;
float BACvalues [50];
float finalBAC;
float summa;
void setup() {
Ange den LCD antal kolumner och rader:
LCD.BEGIN (16, 2);
initiera seriell kommunikation på 9600 bps:
Serial.BEGIN(9600);
ställa in stiften där lamporna är kopplade till produktionen
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
}
void loop() {
När alkoholmätare är först ansluten (intro)
skriva ut våra namn och klassnamnet
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Claire & Kyle");
lcd.setCursor(0,1);
LCD.Print ("BME 3300L");
se till lysdioder start avstängd och summan startar på 0
digitalWrite(greenLEDPin,LOW);
digitalWrite(redLEDPin,LOW);
summa = 0;
Läs analogt värde:
sensorValue = analogRead(analogInPin);
konvertera värdet sensor till faktiska spänningen
actualVoltage = float (sensorValue) * 5/1024;
här säger om knappen trycks, gå till alkoholmätare startskärmen (pre-test)
om (actualVoltage > = 0 & & actualVoltage < = 2.00) {
skriva ut instruktioner för test
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow (3 sekunder)");
lcd.setCursor(0,1);
LCD.Print ("Push att starta");
Delay(1000);
Läs analogt värde:
sensorValue = analogRead(analogInPin);
konvertera värdet sensor till faktiska spänningen
actualVoltage = float (sensorValue) * 5/1024;
så länge som knappen inte är intryckt, hålla visar instruktionerna för testet
medan (actualVoltage > = 2,00 || actualVoltage < = 0) {
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow (3 sekunder)");
lcd.setCursor(0,1);
LCD.Print ("Push att starta");
Delay(1000);
Läs analogt värde:
sensorValue = analogRead(analogInPin);
konvertera värdet sensor till faktiska spänningen
actualVoltage = float (sensorValue) * 5/1024;
}
Detta är efter knappen trycks (b/c inte längre i while loop)
börja köra testet
berätta för dem att blåsa, skriva ut BAC varje gång
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow nu");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
Delay(1000);
loopa igenom och spela BAC över tiden för testning
för (int ii = 0; ii < 50; ii ++) {
Detta är koden för att faktiskt beräkna BAC från kretsen
Läs analogt värde:
sensorValue = analogRead(analogInPin);
konvertera värdet sensor till faktiska spänningen
actualVoltage = float (sensorValue) * 5/1024;
beräkna motståndet av Omformaren
transducerResistance = 5 * loadResistor/actualVoltage - loadResistor;
använda motståndet av givaren och givaren känslighet för att avgöra gaskoncentrationen
eftersom vi anger endast känsla > 50ppm, baserat på kalibrering BAC till 0 när motståndet är större än 1900
om (transducerResistance < 1900) {
gasConcentration = - 0.257 * transducerResistance + 538.55;
}
annat {
gasConcentration = 0;
}
använda gaskoncentrationen för att beräkna koncentrationen i blod
bloodConcentration = gasConcentration/0.21;
använda blod koncentrationen för att mata BAC
BAC = bloodConcentration/10000;
skriva ut resultatet till seriell bildskärmen:
Detta är användbart för oss under testfasen att spåra vad som händer
Serial.Print ("sensor =");
Serial.Print(sensorValue);
Serial.Print ("\t spänning =");
Serial.Print(actualVoltage);
Serial.Print ("\t motstånd =");
Serial.Print(transducerResistance);
Serial.Print ("\t gaskoncentrationen =");
Serial.Print(gasConcentration);
Serial.Print ("\t blod koncentration =");
Serial.Print(bloodConcentration);
Serial.Print ("\t BAC =");
Serial.println(BAC);
skriva ut resultatet till LCD-skärmen:
under test, skriva ut varje datapunkt samtidigt säga att blåsa
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow nu");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
LCD.Print(BAC);
BACvalues [ii] = TBK;
}
beräkna den slutliga BAC ska visas som genomsnittet av värdena över de mellersta tidpunkter
uteslutna slutpunkter eftersom de inte kan att blåsa i början eller slutet
hittade inte behovet av att filtrera eftersom resultaten var mycket stabil
för (int kk = 15; kk < 35; kk ++) {
summa = summa + BACvalues [kk];
}
få den sista BAC ska visas som medelvärdet över relevanta tidsramen
finalBAC = summa/20;
kod för att slå på lysdioderna
om BAC ligger under den lagliga gränsen, slå på den gröna lysdioden
IF(BAC<0.08) {
digitalWrite(greenLEDPin,HIGH);
digitalWrite(redLEDPin,LOW);
}
om BAC inte under den lagliga gränsen, slå på den röda lysdioden
annat {
digitalWrite(greenLEDPin,LOW);
digitalWrite(redLEDPin,HIGH);
}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Test avslutad");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
LCD.Print(finalBAC);
Delay(10000);
Serial.Print ("sista BAC =");
Serial.println(finalBAC);
}
Delay(1000);
}