任务7 简易酒精测试仪(arduino程序)

项目介绍:

“简易酒精测试仪”的电路主要由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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值