For this project, we had to create a data logging device that integrates three different sensing modes. My partner Richard and I decided to create a breathalizer. We used an alcohol sensor, a temperature sensor, and DIY heartbeat sensor.
INDIVIDUAL PROJECT CONTRIBUTION:
In this project, Richard and I created a breathlizer that integrated three distinct sensing modes: an alcohol sensor, a temperature sensor, and a DIY heartbeat sensor. I wrote the function for the alcohol sensor. More specifically, I used linear regression to create a linear function (y=mx+b) for sensor voltage(y) in terms of analog reading(x). I also used another mathematical function---the source to which can be found on my blog--- to derive PPM in terms of sensor voltage. I did this in order to convert PPM into % BAC more easily. Additionally, I located a backbone for our LCD menu system online---a link to which can also be found on my blog--- and modified it so that it would display the name of our sensors and our sensor readings. Together, Richard and I engineered a solution for our broken heartbeat module using a photoresistor and an LED.
Disclaimer:
This project is meant for recreational and educational purposes only. Our alcohol sensor calibrations and heart sensor calibrations are estimates and are therefore not as accurate as the professional-grade devices. They should NOT be used as a substitute for a police breathalizer or medical heart-rate sensor.
COMPONENTS USED:
- Arduino Uno
- Arduino LCD Keypad Shield
- TMP36 Temperature Sensor
- MQ3 Alcohol sensor (with IDUINO breakout board)
- DIY Heartrate Sensor
- Photoresistor
- Red LED
- 4.7k ohm resistor
PROJECT CODE:
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);
/*---Create the square for the bar-----*/
byte p100[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
/*-----Alcohol Sensor Constants------*/
const int alcohol_Pin = 1;
int alcohol_Reading;
double v = 0;
double PPM = 0;
double BAC = 0;
/*-----HeartBeat Sensor Constants------*/
int heart_sensor = A2;
int val = 0;
long BPM;
int i=0;
unsigned int raw;
unsigned long times=0;
/*-----Temperature Sensor Constants------*/
float temp_sensor = 0;
float voltage = 0; // setup some variables
float celsius = 0;
float farheint ;
/*-----Main Menu Constants------*/
int keypad_pin = A0;
int keypad_value = 0;
int keypad_value_old = 0;
char btn_push;
byte mainMenuPage = 1;
byte mainMenuPageOld = 1;
byte mainMenuTotal = 4;
void setup()
{
lcd.begin(16,2); //Initialize a 2x16 type LCD
lcd.createChar(1, p100); //
Serial.begin(9600);
MainMenuDisplay(); //Displays the main menu
delay(1000);
}
void loop()
{
btn_push = ReadKeypad(); // This line calls a function that reads the analog button value.
MainMenuBtn();
if(btn_push == 'S')//enter selected menu (aka sub-menus)
{
WaitBtnRelease(); // while a button is pressed
switch (mainMenuPage)
{
case 1:
MenuA();
break;
case 2:
MenuB();
break;
case 3:
MenuC();
break;
case 4:
MenuD();
break;
}
MainMenuDisplay();
WaitBtnRelease();
}
delay(10);
}//--------------- End of loop() loop ---------------------
void MenuA()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Don't D & D");
lcd.setCursor(0,1);
lcd.print("OFF MODE");
while(ReadKeypad()!= 'L')
{
//Insert Task for Menu A here
}
}
void MenuB()
{
while(ReadKeypad()!= 'L')
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(BAC);
lcd.print("% BAC");
AlcoholSensor(); //Function for alcohol sensor value
/*---- program for bargraph on lcd ---*/
if(alcohol_Reading <= .02)
{
for(i=0;i<=1;i++);
{
lcd.setCursor(0,1);
lcd.write(1);
}
}
else if(BAC > .02 && BAC < .03)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
}
else if(BAC > .03 && BAC < .04)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
}
else if(BAC > .04 && BAC < .05)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
}
else if(BAC > .05 && BAC < .06)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
}
else if(BAC > .06 && BAC < .07)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
}
else if(BAC > .07 && BAC < .08)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
}
else if(BAC > .08 && BAC < .09)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
}
else if(BAC > .09 && BAC < .10)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
}
else if(BAC > .10 && BAC < .11)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
}
else if(BAC > .11 && BAC < .12)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
}
else if(BAC > .12 && BAC < .13)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
}
else if(BAC > .13 && BAC < .14)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
}
else if(BAC > .14 && BAC < .15)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
}
else if(BAC > .15 && BAC < .16)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
lcd.setCursor(14,1);
lcd.write(1);
}
else if(BAC > .16 && BAC < .17)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
lcd.setCursor(14,1);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(1);
}
else if(BAC > .17 && BAC < .18)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
lcd.setCursor(14,1);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(1);
lcd.setCursor(16,1);
lcd.write(1);
}
else if(BAC >.18 && BAC < .19)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
lcd.setCursor(14,1);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(1);
lcd.setCursor(16,1);
lcd.write(1);
lcd.setCursor(17,1);
lcd.write(1);
}
else if(BAC > .19 && BAC < .20)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
lcd.setCursor(14,1);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(1);
lcd.setCursor(16,1);
lcd.write(1);
lcd.setCursor(17,1);
lcd.write(1);
lcd.setCursor(18,1);
lcd.write(1);
}
delay (500);
}
}
void MenuC()
{
Serial.print("calibrating..." );
delay(2000);
while(ReadKeypad()!= 'L')
{
lcd.clear();
lcd.setCursor(0,0);
val=analogRead(heart_sensor);
times= (millis()/1000);
heartbeatfunction (val,times); //Function for heartbeat sensor value
lcd.print(BPM);
lcd.print("bpm");
/*---- program for bargraph on lcd ---*/
if(BPM<=60)
{
lcd.setCursor(0,0);
lcd.print("Please put more pressure");
lcd.setCursor(0,1);
lcd.print("Pressure");
}
else if(BPM>60 && BPM<63)
{
lcd.setCursor(0,1);
lcd.write(1);
}
else if(BPM>=63 && BPM<=66)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
}
else if(BPM>=69 && BPM<=72)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
}
else if(BPM>=72 && BPM<=75)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
}
else if(BPM>=75 && BPM<=78)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
}
else if(BPM>=81 && BPM<=84)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
}
else if(BPM>=84 && BPM<=87)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
}
else if(BPM>=87 && BPM<=91)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
}
else if(BPM>=91 && BPM<=94)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
lcd.setCursor(14,1);
lcd.write(1);
lcd.setCursor(15,1);
lcd.write(1);
lcd.setCursor(16,1);
lcd.write(1);
}
else if(BPM>300)
lcd.setCursor(0,0);
delay(500);
}
}
void MenuD()
{
while(ReadKeypad()!= 'L')
{
lcd.clear();
lcd.setCursor(0,0);
temperature_function();
lcd.print(celsius);
lcd.print("C");
lcd.print((char)223);
lcd.setCursor(8,0);
lcd.print(farheint);
lcd.print("F");
lcd.print((char)223); //prints out special character degrees
/*---- program for bargraph on lcd ---*/
if(farheint<77) //if farheint is less then 10 then light up one box
{
lcd.setCursor(0,1);
lcd.write(1);
}
else if(farheint>79 && farheint<80)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
}
else if(farheint>80 && farheint<81)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
}
else if(farheint>81 && farheint<82)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
}
else if(farheint>83 && farheint<84)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
}
else if(farheint>84 && farheint<85)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
}
else if(farheint>86 && farheint<87)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
}
else if(farheint>87 && farheint<88)
{
lcd.setCursor(0,1);
lcd.write(1);
lcd.setCursor(1,1);
lcd.write(1);
lcd.setCursor(2,1);
lcd.write(1);
lcd.setCursor(3,1);
lcd.write(1);
lcd.setCursor(4,1);
lcd.write(1);
lcd.setCursor(5,1);
lcd.write(1);
lcd.setCursor(6,1);
lcd.write(1);
lcd.setCursor(7,1);
lcd.write(1);
lcd.setCursor(8,1);
lcd.write(1);
lcd.setCursor(9,1);
lcd.write(1);
lcd.setCursor(10,1);
lcd.write(1);
lcd.setCursor(11,1);
lcd.write(1);
lcd.setCursor(12,1);
lcd.write(1);
lcd.setCursor(13,1);
lcd.write(1);
}
delay (500);
}
}
void MainMenuDisplay() // This function labels the different menu options
{
lcd.clear();
lcd.setCursor(0,0);
switch (mainMenuPage)
{
case 1:
lcd.print("BREATHALIZER");
lcd.setCursor(0,1);
lcd.print("");
break;
case 2:
lcd.print("1.Alcohol Sensor");
lcd.setCursor(0,1);
lcd.print("");
break;
case 3:
lcd.print("2.Heartbeat Snsr");
lcd.setCursor(0,1);
lcd.print("");
break;
case 4:
lcd.print("3.Temp Sensor");
lcd.setCursor(0,1);
lcd.print("");
break;
}
}
void MainMenuBtn()
{
WaitBtnRelease(); // while a button is being pressed...
if(btn_push == 'U') // Check if the up button was pressed
{
mainMenuPage++; // Increment the page count
if(mainMenuPage > mainMenuTotal) //if you've reached the last page
mainMenuPage = 1; // Loop back around
}
else if(btn_push == 'D') // Check if the down button was pressed
{
mainMenuPage--; // Decrement the page
if(mainMenuPage == 0) //if
mainMenuPage = mainMenuTotal;
}
if(mainMenuPage != mainMenuPageOld) //only update display when page change
{
MainMenuDisplay();
mainMenuPageOld = mainMenuPage;
}
}
char ReadKeypad() //This function assigns a letter to btn_push that corresponds to the analog value read.
{
keypad_value = analogRead(keypad_pin);
if(keypad_value < 100) //You've pressed the right key
return 'R';
else if(keypad_value < 200) //You've pressed the up key
return 'U';
else if(keypad_value < 400) //You've pressed the down key
return 'D';
else if(keypad_value < 600) //You've pressed the left key
return 'L';
else if(keypad_value < 800) //You've pressed the Select key
return 'S';
else
return 'N'; //Nothing pressed
}
void WaitBtnRelease()
{
while( analogRead(keypad_pin) < 800){}
}
void AlcoholSensor()
{
alcohol_Reading = analogRead(alcohol_Pin);
v = (.00488759)*alcohol_Reading;
PPM = 150.4351049*v*v*v*v*v - 2244.75988*v*v*v*v + 13308.5139*v*v*v -39136.08594*v*v + 57082.6258*v - 32982.05333;
BAC = (double)PPM/2600;
if (alcohol_Reading < 410)
{
PPM = 0;
BAC = 0;
Serial.println("You are sober\t");
}
else if (alcohol_Reading < 610)
{
PPM = 0;
BAC = 0;
Serial.println("You are OK\t");
}
else if (alcohol_Reading > 859)
{
PPM = 0;
BAC = 0;
Serial.println("Error: Above Range\t");
}
else
Serial.println("You are drunk");
Serial.print(BAC);
Serial.print("% BAC\t");
Serial.print(PPM);
Serial.print("ppm \t");
}
void heartbeatfunction(int raw, int times)
{
Serial.print("times:");
Serial.println(times);
Serial.print("value:");
Serial.println(val);
Serial.println(i);
if(val>100)
{
i++;
}
raw=60*i;
BPM=(raw/times);
if(BPM<100)
{
Serial.print("BPM:");
Serial.println(BPM);
}
else if(BPM>100)
{
Serial.println("please put more pressure");
}
else if(BPM<60)
{
Serial.println("Too much pressure");
}
//delay(100);
}
void temperature_function()
{
temp_sensor = analogRead(A3);
voltage = (temp_sensor*5000)/1024; // convert sensor value to millivolts
voltage = voltage-500; // remove voltage offset
celsius = voltage/10; // convert millivolts to Celsius
farheint= ((celsius*1.8)+32);
Serial.print("Temperature: "); // these four lines send the temp to the port
Serial.print(celsius);
Serial.println(" degrees C");
Serial.print("farheint");
Serial.println(farheint);
}
BREATHALIZER PICS:
![]() |
| Temperature Sensor up close |
![]() |
| MQ3 Alcohol Sensor (w/ breakout board) up close |
![]() |
| DIY Heart Rate Sensor up close |
![]() |
| Breathalizer (lateral view) |
![]() |
| Breathalizer (upward view) |
SOURCES USED:
- MQ3 Alcohol Sensor with IDUINO breakout board
- Main Menu Display Template
- Alcohol BAC Lookup Table
- DIY Heart rate Sensor





No comments:
Post a Comment