Алкотестер – это обобщенное название разновидности устройств, используемых для определения содержания алкоголя в крови по образцу выдыхаемого воздуха. Это означает, что устройство может определять количество выпитого вами алкоголя. Это устройство становится очень полезным для предупреждения аварий, вызванных вождением в нетрезвом виде.

С помощью этого устройства вы можете легко предупредить водителя автомобиля, когда он слишком пьян, чтобы водить машину. Важно отметить, что этот проект недостаточно точен, чтобы заменить стандартный алкотестер, тем не менее с его помощью можно понять о том, что человек выпил достаточно, чтобы не садиться за руль.
В этом проекте мы будем использовать датчик алкоголя MQ3. Это дешевый полупроводниковый датчик, способный обнаруживать присутствие спирта в воздухе при концентрациях от 0,05 до 10 мг/л. Датчик использует химическую реакцию для определения уровня алкоголя, и основным чувствительным элементом в датчике является SnO2, проводимость SnO2 низкая в чистом воздухе, но увеличивается по мере увеличения концентрации газообразного спирта в воздухе (дыхании). Он обладает высокой чувствительностью к алкоголю и хорошей устойчивостью к помехам и шуму от таких вещей, как дым и бензин. Данные об уровне алкоголя с предупреждением будем выводить на компактный ЖК-дисплей по последовательному интерфейсу I2C.
Схема подключения компонентов алкотестера на основе Arduino представлена далее:

Код программы следующий:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
int TIME_UNTIL_WARMUP = 900;
unsigned long time;
int analogPin = 0;
int val = 0;
Adafruit_SSD1306 display(OLED_RESET);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
}
void loop() {
delay(100);
val = readAlcohol();
printTitle();
printWarming();
time = millis()/1000;
if(time<=TIME_UNTIL_WARMUP)
{
time = map(time, 0, TIME_UNTIL_WARMUP, 0, 100);
display.drawRect(10, 50, 110, 10, WHITE);
display.fillRect(10, 50, time,10,WHITE);
}else
{
printTitle();
printAlcohol(val);
printAlcoholLevel(val);
}
display.display();
}
void printTitle()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(22,0);
display.println("Breath Analyzer");
}
void printWarming()
{
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,20);
display.println("Warming up");
}
void printAlcohol(int value)
{
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(45,25);
display.println(val);
}
void printAlcoholLevel(int value)
{
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(10,55);
if(value<200)
{
display.println("You are sober.");
}
if (value>=200 && value<280)
{
display.println("You had a beer.");
}
if (value>=280 && value<350)
{
display.println("Two or more beers.");
}
if (value>=350 && value <450)
{
display.println("I smell Oyzo!");
}
if(value>450)
{
display.println("You are drunk!");
}
}
int readAlcohol()
{
int val = 0;
int val1;
int val2;
int val3;
display.clearDisplay();
val1 = analogRead(analogPin);
delay(10);
val2 = analogRead(analogPin);
delay(10);
val3 = analogRead(analogPin);
val = (val1+val2+val3)/3;
return val;
}
© digitrode.ru