Stap 7: Software
We hebben onze onderstaande voorbeeldcode geplakt. Deze code wordt ervan uitgegaan dat de spanning scheidingslijn is verbonden met pin A0, de groene LED is aangesloten op de digitale i/o-Pin 2 en de rode LED is aangesloten op de digitale i/o-Pin 3.
Claire & Kyle
Arduino Code voor afstudeerproject
de code van de bibliotheek omvatten:
#include
initialiseren van de bibliotheek met de nummers van de pennen van de interface
LiquidCrystal lcd(8,9,4,5,6,7);
input pincode instellen om te worden pin A0
Const int analogInPin = A0; Analoge invoer pin die de potentiometer is aangesloten op
int sensorValue = 0; waarde van het circuit leest
int loadResistor = 1465; waarde van de weerstand van de belasting die we hebben besloten te gebruiken (BAC van 0,08 overeenkomt met R van nauwe weerstandswaarde van 1440 zo gewend om te maximaliseren gevoeligheid op dit punt)
int greenLEDPin = 2; digitale IO-pin waarop onze groene LED is aangesloten
int redLEDPin = 3; digitale IO-pin waarop rode LED is aangesloten
initialiseren van alle variabelen voor de berekening van BAC
float actualVoltage;
float transducerResistance;
float gasConcentration;
float bloodConcentration;
float BAC;
float BACvalues [50];
float finalBAC;
float som;
VOID Setup {}
de LCD's aantal kolommen en rijen instellen:
LCD.begin (16, 2);
seriële communicatie 9600 bps te initialiseren:
Serial.begin(9600);
Stel de pinnen waar LEDs zijn aangesloten op de uitgang
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
}
void loop {}
Wanneer de breathalyzer is eerst aangesloten (intro)
onze namen en de klassenaam afdrukken
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Claire & Kyle");
lcd.setCursor(0,1);
LCD.Print ("BMT 3300L");
Zorg ervoor dat het begin van de LEDs uitgeschakeld en de som begint bij 0
digitalWrite(greenLEDPin,LOW);
digitalWrite(redLEDPin,LOW);
som = 0;
Lees de analoge waarde:
sensorValue = analogRead(analogInPin);
de sensor-waarde omzetten in de werkelijke ingangsspanning
actualVoltage = float (sensorValue) * 5/1024;
hier zeggen als knop wordt ingedrukt, gaat u naar het startscherm breathalyzer (pre-test)
Als (actualVoltage > = 0 & & actualVoltage < = 2,00) {}
instructies voor de test uitprinten
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow (3 seconden)");
lcd.setCursor(0,1);
LCD.Print ("Push to start");
delay(1000);
Lees de analoge waarde:
sensorValue = analogRead(analogInPin);
de sensor-waarde omzetten in de werkelijke ingangsspanning
actualVoltage = float (sensorValue) * 5/1024;
zo lang als de knop niet is ingedrukt, de instructies voor de test vieren vertoning
terwijl (actualVoltage > = 2.00 || actualVoltage < = 0) {}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow (3 seconden)");
lcd.setCursor(0,1);
LCD.Print ("Push to start");
delay(1000);
Lees de analoge waarde:
sensorValue = analogRead(analogInPin);
de sensor-waarde omzetten in de werkelijke ingangsspanning
actualVoltage = float (sensorValue) * 5/1024;
}
Dit is nadat de knop is ingedrukt (b/c niet langer in de while lus)
Start de test uitvoeren
Vertel hen te blazen, de BAC op elk punt uitprinten
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow nu");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
delay(1000);
doorlopen en BAC opnemen over de beproeving tijd
voor (int ii = 0; ii < 50; ii ++) {}
Dit is de code voor het daadwerkelijk berekenen van BAC uit het circuit
Lees de analoge waarde:
sensorValue = analogRead(analogInPin);
de sensor-waarde omzetten in de werkelijke ingangsspanning
actualVoltage = float (sensorValue) * 5/1024;
berekenen de weerstand van de transducer
transducerResistance = 5 * loadResistor/actualVoltage - loadResistor;
de weerstand van de transducer en de gevoeligheid van de transducer gebruiken om te bepalen van de gasconcentratie
Sinds wij kan alleen zin > 50ppm, gebaseerd op kalibratie ingesteld BAC op 0 wanneer weerstand groter dan 1900 is
Als (transducerResistance < 1900) {}
gasConcentration = - 0.257 * transducerResistance + 538.55;
}
else {}
gasConcentration = 0;
}
de gasconcentratie gebruiken voor het berekenen van de concentratie in het bloed
bloodConcentration = gasConcentration/0.21;
gebruik van de concentratie van bloed aan output de BAC
BAC = bloodConcentration/10000;
de resultaten naar de seriële monitor wilt afdrukken:
Dit is handig voor ons tijdens de testfase om te volgen wat er gebeurt
Serial.Print ("sensor =");
Serial.Print(sensorValue);
Serial.Print ("\t spanning =");
Serial.Print(actualVoltage);
Serial.Print ("\t weerstand =");
Serial.Print(transducerResistance);
Serial.Print ("\t gasconcentratie =");
Serial.Print(gasConcentration);
Serial.Print ("\t bloed concentratie =");
Serial.Print(bloodConcentration);
Serial.Print ("\t BAC =");
Serial.println(BAC);
de resultaten op de LCD-afdrukken:
tijdens de test, drukt u elk gegevenspunt met zeggen te blazen
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Blow nu");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
LCD.Print(BAC);
BACvalues [ii] = BAC;
}
de definitieve BAC om weer te geven door het gemiddelde van de waarden op de punten van de middelste tijd te berekenen
de eindpunten uitgesloten omdat ze niet worden aan het begin of einde blazen kunnen
de noodzaak om te filteren omdat resultaten zeer stabiel waren vinden niet
voor (int kk = 15; kk < 35; kk ++) {}
som = som + BACvalues [kk];
}
de definitieve BAC om weer te geven door het gemiddelde over het relevante tijdschema te krijgen
finalBAC = som/20;
code om te schakelen de LEDs
Als de BAC lager dan de wettelijk toegestane limiet is, schakelt u de groene LED
if(BAC<0.08) {}
digitalWrite(greenLEDPin,HIGH);
digitalWrite(redLEDPin,LOW);
}
Als de BAC niet onder de wettelijke limiet is, het inschakelen van de rode LED
else {}
digitalWrite(greenLEDPin,LOW);
digitalWrite(redLEDPin,HIGH);
}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Test voltooid");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
LCD.Print(finalBAC);
delay(10000);
Serial.Print ("definitieve BAC =");
Serial.println(finalBAC);
}
delay(1000);
}