Paso 7: Software
Hemos pegado el código de ejemplo más abajo. Este código supone que el divisor de tensión está conectado al pin A0, el LED verde está conectado a la entrada-salida Digital Pin 2 y el LED rojo está conectado a la entrada-salida Digital del Pin 3.
Claire y Kyle
Código de Arduino para Proyecto Final
incluir el código de biblioteca:
#include
inicializar la biblioteca con los números de los pines de interfaz
LiquidCrystal lcd(8,9,4,5,6,7);
sistema de entrada de pin a pin A0
const int analogInPin = A0; Clavija de entrada analógica que el potenciómetro está conectado a
int sensorValue = 0; valor leído desde el circuito
int loadResistor = 1465; valor de la resistencia de carga que nos hemos decidido a utilizar (BAC de 0,08 corresponde a R del valor de la resistencia cerca de 1440 por lo que utiliza para maximizar la sensibilidad en este punto)
int greenLEDPin = 2; pin digital IO donde está conectado el LED verde
int redLEDPin = 3; pin digital IO donde está conectado el LED rojo
inicializar todas las variables para el cálculo de BAC
Float actualVoltage;
Float transducerResistance;
Float gasConcentration;
Float bloodConcentration;
flotador BAC;
Float BACvalues [50];
Float finalBAC;
suma de flotador;
void setup() {}
fijar número la pantalla del LCD de filas y columnas:
LCD.Begin (16, 2);
inicializar comunicaciones serie a 9600 bps:
Serial.Begin(9600);
configurar los pines donde LEDs están conectados a la salida
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
}
void loop() {}
Cuando la alcoholemia es conectado por primera vez (intro)
imprimir nuestros nombres y el nombre de clase
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("Claire & Kyle");
lcd.setCursor(0,1);
LCD.Print ("BME 3300L");
Asegúrese de que el comienzo de LEDs apagados y la suma empieza en 0
digitalWrite(greenLEDPin,LOW);
digitalWrite(redLEDPin,LOW);
suma = 0;
Lectura analógica de valor:
sensorValue = analogRead(analogInPin);
convertir el valor del sensor en el voltaje de entrada actual
actualVoltage = float (sensorValue) * 5/1024;
Aquí decir si boton, ir a pantalla de inicio de alcoholemia (pre prueba)
Si (actualVoltage > = 0 & & actualVoltage < = 2.00) {}
Imprima las instrucciones para la prueba
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("soplo (3 segundos)");
lcd.setCursor(0,1);
LCD.Print ("pulse iniciar");
Delay(1000);
Lectura analógica de valor:
sensorValue = analogRead(analogInPin);
convertir el valor del sensor en el voltaje de entrada actual
actualVoltage = float (sensorValue) * 5/1024;
mientras no se pulse el botón, seguir mostrando las instrucciones de la prueba
mientras que (actualVoltage > = 2.00 || actualVoltage < = 0) {}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("soplo (3 segundos)");
lcd.setCursor(0,1);
LCD.Print ("pulse iniciar");
Delay(1000);
Lectura analógica de valor:
sensorValue = analogRead(analogInPin);
convertir el valor del sensor en el voltaje de entrada actual
actualVoltage = float (sensorValue) * 5/1024;
}
Esto es cuando se pulsa el botón (b y c ya no está en el tiempo bucle)
empezar a correr la prueba de
Dile que sople, imprimir el BAC en cada punto de
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("golpe ahora");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
Delay(1000);
bucle y registrarlas BAC durante el tiempo de prueba
para (int ii = 0; ii < 50; ii ++) {}
Este es el código para calcular realmente BAC del circuito
Lectura analógica de valor:
sensorValue = analogRead(analogInPin);
convertir el valor del sensor en el voltaje de entrada actual
actualVoltage = float (sensorValue) * 5/1024;
calcular la resistencia del transductor
transducerResistance = 5 * loadResistor/actualVoltage - loadResistor;
utilizar la resistencia del transductor y la sensibilidad del transductor para determinar la concentración de gas
ya que puede sólo sentido > 50ppm, basado en calibración establecer BAC 0 cuando la resistencia es mayor a 1900
Si (transducerResistance < 1900) {}
gasConcentration = - 0.257 * transducerResistance + 538.55;
}
Else {}
gasConcentration = 0;
}
utilizar la concentración de gas para calcular la concentración en sangre
bloodConcentration = gasConcentration/0.21;
utilizar la concentración de la sangre a la salida del BAC
BAC = bloodConcentration/10000;
imprimir los resultados en el monitor serial:
Esto es útil durante la fase de prueba para rastrear lo que está sucediendo
Serial.Print ("sensor =");
Serial.Print(sensorValue);
Serial.Print ("\t voltaje =");
Serial.Print(actualVoltage);
Serial.Print ("\t resistencia =");
Serial.Print(transducerResistance);
Serial.Print ("\t concentración =");
Serial.Print(gasConcentration);
Serial.Print ("\t concentración en la sangre =");
Serial.Print(bloodConcentration);
Serial.Print ("\t BAC =");
Serial.println(BAC);
imprimir los resultados en la pantalla LCD:
durante la prueba, imprima cada punto de datos diciendo a soplar
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("golpe ahora");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
LCD.Print(BAC);
BACvalues [ii] = BAC;
}
calcular el BAC final quieras promediando los valores de los puntos de tiempo medio
excluidos los extremos porque no puede ser soplado al principio o al final
no encuentra la necesidad de filtrar porque los resultados eran muy estables
para (int kk = 15; kk < 35; kk ++) {}
suma = suma + BACvalues [kk];
}
obtener el final BAC para mostrar promediando sobre los plazos pertinentes
finalBAC = sum/20;
código para encender los LEDs
Si el BAC está por debajo del límite legal, enciende el LED verde
if(BAC<0.08) {}
digitalWrite(greenLEDPin,HIGH);
digitalWrite(redLEDPin,LOW);
}
Si el BAC no esté por debajo del límite legal, enciende el LED rojo
Else {}
digitalWrite(greenLEDPin,LOW);
digitalWrite(redLEDPin,HIGH);
}
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print ("prueba completada");
lcd.setCursor(0,1);
LCD.Print ("BAC =");
LCD.Print(finalBAC);
Delay(10000);
Serial.Print ("BAC final =");
Serial.println(finalBAC);
}
Delay(1000);
}