项目介绍:
“简易酒精测试仪”的电路主要由Arduino UNO,酒精浓度检测电路、显示电路、键盘和电源电路组成。
酒精浓度信号经过酒精检测电路转化为模拟电压信号传输到AD接口,再由Arduino进行显示电压值和酒精浓度。
据酒精浓度的的不同和按键设置做其它相应动作或者提示(比如声光提示或者颜色提示或者报警)
。
认识酒精传感器MQ-3:
原理:MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精蒸汽浓度的增加而增大。
主要用途:车用酒精气体报警器和便携式酒精气体检测器
ppm:酒精检测浓度,通过读取的模拟量计算得出
测试传感器:
利用analogRead()通过串口显示模拟量
或者 AnalogInOutSerial串口显示模拟量
程序代码:
无需额外的库文件,传感器上电需预热一段时间,通过按键可控制酒精检测的阈值大小,达到阈值LED显示不同的颜色(电路连接请看宏定义)
#include "U8glib.h"
#include <DS3231.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
uint8_t openState = 0;
uint8_t openState2 = 0;
uint8_t openState3 = 0;
uint8_t openState4 = 0;
#define button1 2 //触摸按键接口定义
#define button2 3
#define button3 4
#define button4 5
const int analogInPin = A0;
int sensorValue = 0; // value read from the pot
int outputValue = 0;
int ppm = 0;
//DS2312
DS3231 Clock;
uint8_t h;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
int second,minute,hour,date,month,year,temperature;
static unsigned char deng[] U8G_PROGMEM = {0x00,0x00,0x7E,0x3E,0x40,0x22,0x40,0x12,0x42,0x12,0x24,0x0A,0x28,0x12,0x10,0x12,
0x10,0x22,0x28,0x22,0x28,0x22,0x44,0x16,0x42,0x0A,0x01,0x02,0x00,0x02,0x00,0x02,/*"邓",0*/};
static unsigned char zhao[] U8G_PROGMEM = {0x00,0x00,0xBE,0x3F,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x29,0xBE,0x10,0x22,0x3F,
0x22,0x21,0x22,0x21,0x22,0x21,0x3E,0x3F,0x00,0x00,0x12,0x11,0x22,0x22,0x21,0x22,/*"照",1*/};
static unsigned char quan[] U8G_PROGMEM = {0x08,0x00,0xC8,0x3F,0x88,0x20,0x88,0x20,0xBF,0x20,0x08,0x11,0x0C,0x11,0x1C,0x11,
0x2A,0x0A,0x2A,0x0A,0x09,0x04,0x08,0x04,0x08,0x0A,0x08,0x11,0x88,0x20,0x68,0x40,/*"权",2*/};
static unsigned char nian[] U8G_PROGMEM = {0x08,0x00,0x08,0x00,0xF8,0x3F,0x04,0x01,0x04,0x01,0x02,0x01,0xF8,0x1F,0x08,0x01,
0x08,0x01,0x08,0x01,0xFF,0x7F,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,/*"年",0*/};
static unsigned char yue[] U8G_PROGMEM = {0x00,0x00,0xF8,0x1F,0x08,0x10,0x08,0x10,0x08,0x10,0xF8,0x1F,0x08,0x10,0x08,0x10,
0x08,0x10,0xF8,0x1F,0x08,0x10,0x08,0x10,0x04,0x10,0x04,0x10,0x02,0x14,0x01,0x08,/*"月",1*/};
static unsigned char ri[] U8G_PROGMEM = {0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,/*"日",2*/};
static unsigned char zhou[] U8G_PROGMEM = {0x00,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0xF4,0x17,0x84,0x10,0x84,0x10,0xFC,0x1F,
0x04,0x10,0xE4,0x13,0x24,0x12,0x24,0x12,0xE4,0x13,0x02,0x10,0x02,0x14,0x01,0x08,/*"周",0*/};
static unsigned char si[] U8G_PROGMEM = {0x00,0x00,0x00,0x00,0xFE,0x3F,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x12,0x22,0x12,0x3C,0x0A,0x20,0x06,0x20,0x02,0x20,0xFE,0x3F,0x02,0x20,0x00,0x00,/*"四",1*/};
void button_State()
{
//A
if(digitalRead(button1)){ //按键切屏
openState++;
while(digitalRead(button1));
}
else if(digitalRead(button2)){ //按键-
openState2--; //设置阈值
while(digitalRead(button2));
}
else if(digitalRead(button3)){ //按键+
openState2++;
while(digitalRead(button3));
}
else if(digitalRead(button4)){ //确认按键
// openState3 =!openState3;
openState = 0;
while(digitalRead(button4));
}
}
void draw0(void) {
u8g.setFont(u8g_font_unifont);
// u8g.drawStr( 0, 45, "DengZhaoquan:");
// u8g.drawStr( 0, 12, "190306238");
u8g.drawXBMP( 16, 0, 16, 16, deng);
u8g.drawXBMP( 32, 0, 16, 16, zhao);
u8g.drawXBMP( 48, 0, 16, 16, quan);
u8g.setPrintPos(10,29);
u8g.print("sensor = ");
u8g.print(sensorValue);
u8g.setPrintPos(10,43);
u8g.print("output = ");
u8g.print(outputValue);
u8g.print("mv");
u8g.setPrintPos(10,58);
u8g.print("MQ3_PPM = ");
u8g.print(ppm);
}
void draw1(void) {
// u8g.setFont(u8g_font_unifont);
// u8g.drawStr( 0, 45, "Numb:");
u8g.setPrintPos(20,10);
u8g.print("SET = ");
u8g.print(openState2);
}
void draw2(void) {
u8g.drawXBMP( 0, 0, 16, 16, deng);
u8g.drawXBMP( 16, 0, 16, 16, zhao);
u8g.drawXBMP( 32, 0, 16, 16, quan);
u8g.drawXBMP( 79, 48, 16, 16, zhou);
u8g.drawXBMP( 96, 48, 16, 16, si);
u8g.setFont(u8g_font_unifont);
// u8g.drawStr( 0, 45, "DengZhaoquan:");
// u8g.drawStr( 0, 12, "190306238");
u8g.setPrintPos(52,14);
u8g.print("Hum:");
u8g.print(h);
u8g.print("%");
u8g.setPrintPos(0,45);
u8g.print("20");
u8g.print(year,DEC);
u8g.drawXBMP( 32, 32, 16, 16, nian);
u8g.setPrintPos(48,45);
u8g.print(month);
u8g.drawXBMP( 66, 32, 16, 16, yue);
u8g.setPrintPos(82,45);
u8g.print(date);
u8g.drawXBMP( 98, 32, 16, 16, ri);
u8g.setPrintPos(0,60);
u8g.print(hour);
u8g.print(":");
u8g.print(minute);
u8g.print(":");
u8g.print(second);
// sensors.requestTemperatures();
// TempC = sensors.getTempCByIndex(0);
u8g.setPrintPos(0,30);
u8g.print("TempC:");
u8g.print(temperature);
u8g.print(" C");
}
void mode_0()
{
u8g.firstPage();
do {
draw0();
} while( u8g.nextPage() );
}
void mode_1()
{
u8g.firstPage();
do {
draw1();
} while( u8g.nextPage() );
}
void mode_2()
{
u8g.firstPage();
do {
draw2();
} while( u8g.nextPage() );
}
void setup() {
Serial.begin(115200);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
pinMode(button4, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
Wire.begin();
Clock.setSecond(50);//Set the second
Clock.setMinute(25);//Set the minute
Clock.setHour(15); //Set the hour
Clock.setDoW(4); //Set the day of the week
Clock.setDate(29); //Set the date of the month
Clock.setMonth(4); //Set the month of the year
Clock.setYear(21); //Set the year (Last two digits of the year)
}
void loop() {
button_State();
sensorValue = analogRead(analogInPin);
outputValue = map(sensorValue, 0, 1023, 0, 5000);
// Serial.print("sensor = ");
// Serial.print(sensorValue);
// Serial.print("\t output = ");
// Serial.println(outputValue);
ppm = outputValue/100-8;
if(ppm<0)
ppm = 0;
Serial.print("output = ");
Serial.println(ppm);
if(ppm>openState2)
digitalWrite(LED_BUILTIN, HIGH);
else
digitalWrite(LED_BUILTIN, LOW);
switch (openState)
{
case 0:
// openState = 0;
mode_0(); //
break;
case 1:
mode_1(); //
break;
case 2:
ReadDS3231();
mode_2(); //
break;
case 3:
// mode_3(); //
break;
default:
break;
}
if(openState == 3) openState = 0;
// Serial.println(openState);
}
void ReadDS3231()
{
second=Clock.getSecond();
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);
date=Clock.getDate();
month=Clock.getMonth(Century);
year=Clock.getYear();
temperature=Clock.getTemperature();
// mode_0();
}