基于Arduino的烟雾报警系统(烟雾传感器、蜂鸣器、温湿度模块、OLED12864显示屏)

1、概述

我们将各种示例组合成一套相对于使用的系统装置。您可以将其放置在天然气或者煤气旁。

对于模块不了解的,可以先看一下我们的模块教程[传送门],了解掌握模块使用方法后,再尝试本小实验。因为综合实验一般涉及多个模块,我们仅对全部使用我司产品的客户做技术支持,若只是部分使用我司产品的,我们只对我司产品部分是否有故障进行排查。

2、模块所需材料(点击即可跳转购买)

1、UNO主控板:官方板 或者 国产板
2、辅助配件:面包板杜邦线
3、传感器和模块:温湿度模块烟雾传感器无源蜂鸣器显示屏LED

3、接线方式

4、示例程序

/*
Arduino+OLED12864显示屏+DHT11温湿度传感器+MQ-2烟雾传感器+蜂鸣器
功能:安全、警告、危险情况的烟雾报警装置,室内温湿度显示。
*/
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
} //摄氏温度度转化为华氏温度
double Kelvin(double celsius)
{
return celsius + 273.15;
} //摄氏温度转化为开氏温度

// 露点(点在此温度时,空气饱和并产生露珠)
// 参考: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}

// 快速计算露点,速度是5倍dewPoint()
// 参考: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
//==========================================================
#include <dht11.h>//程序中调用了dht11的库
#include <SPI.h>//SPI头文件
#include <Wire.h>//I2C头文件
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>//OLED头文件

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define LOGO16_GLCD_HEIGHT 16 //定义显示高度
#define LOGO16_GLCD_WIDTH 16 //定义显示宽度

static const unsigned char PROGMEM str_1[] =
{
0x00,0x08,0x43,0xFC,0x32,0x08,0x12,0x08,
0x83,0xF8,0x62,0x08,0x22,0x08,0x0B,0xF8,
0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,
0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x20,0x00,
};//温

static const unsigned char PROGMEM str_2[] =
{
0x01,0x00,0x00,0x84,0x3F,0xFE,0x22,0x20,
0x22,0x28,0x3F,0xFC,0x22,0x20,0x23,0xE0,
0x20,0x00,0x2F,0xF0,0x22,0x20,0x21,0x40,
0x20,0x80,0x43,0x60,0x8C,0x1E,0x30,0x04,
}; // 度

static const unsigned char PROGMEM str_3[] =
{
0x00,0x08,0x47,0xFC,0x34,0x08,0x14,0x08,
0x87,0xF8,0x64,0x08,0x24,0x08,0x0F,0xF8,
0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,
0x23,0x30,0x21,0x24,0x3F,0xFE,0x20,0x00,
}; //湿
static const unsigned char PROGMEM str_4[] =
{
0x02,0x00,0x01,0x00,0x3F,0xFC,0x20,0x04,0x42,0x08,0x02,0x00,0x02,0x00,0xFF,0xFE,
0x04,0x20,0x08,0x20,0x18,0x40,0x06,0x40,0x01,0x80,0x02,0x60,0x0C,0x10,0x70,0x08,
}; //安
static const unsigned char PROGMEM str_5[] =
{
0x01,0x00,0x01,0x00,0x02,0x80,0x04,0x40,0x08,0x20,0x10,0x10,0x2F,0xE8,0xC1,0x06,
0x01,0x00,0x01,0x00,0x1F,0xF0,0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x00,0x00,
}; //全
static const unsigned char PROGMEM str_6[] =
{
0x24,0x20,0xFF,0x20,0x24,0x7E,0x7E,0xC4,0x82,0x28,0x7A,0x10,0x4A,0x28,0x7A,0xC6,
0x05,0x00,0xFF,0xFE,0x00,0x00,0x3F,0xF8,0x00,0x00,0x3F,0xF8,0x20,0x08,0x3F,0xF8,

}; //警
static const unsigned char PROGMEM str_7[] =
{
0x01,0x00,0x11,0x00,0x11,0x00,0x1F,0xF8,0x21,0x00,0x41,0x00,0x01,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,

}; //告
static const unsigned char PROGMEM str_8[] =
{
0x04,0x00,0x04,0x00,0x0F,0xF0,0x10,0x10,0x20,0x20,0x5F,0xFC,0x10,0x00,0x13,0xF0,
0x12,0x10,0x12,0x10,0x12,0x50,0x12,0x20,0x22,0x04,0x22,0x04,0x41,0xFC,0x80,0x00,
}; //危
static const unsigned char PROGMEM str_9[] =
{
0x00,0x40,0x78,0x40,0x48,0xA0,0x50,0xA0,0x51,0x10,0x62,0x08,0x55,0xF6,0x48,0x00,
0x48,0x88,0x48,0x48,0x6A,0x48,0x51,0x50,0x41,0x10,0x40,0x20,0x47,0xFE,0x40,0x00,

}; //险
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

dht11 DHT11;//定义一个名字叫做DHT11,类型为dht11的值。

#define DHT11PIN 2//定义DHT11的引脚号为D2。
int led=9;//红灯接PWM引脚9
int alarm=4;//蜂鸣器

void setup(){
Wire.begin();//I2C初始化
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
// init done
display.clearDisplay();//清屏
pinMode(led,OUTPUT);//led引脚输出
pinMode(alarm,OUTPUT);//蜂鸣器引脚输出
}
void loop(){
int chk = DHT11.read(DHT11PIN);//读取DHT11的值
display.clearDisplay();//清屏
//英文字符显示
display.setTextSize(1); //设置字体大小
display.setTextColor(WHITE); //设置字体颜色白色
display.setCursor(0,0); //设置字体的起始位置
display.drawBitmap(0, 5, str_1, 16, 16, 1); //在坐标X:0 Y:5的位置显示中文字符温
display.drawBitmap(18, 5, str_2, 16, 16, 1);//在坐标X:18 Y:5的位置显示中文字符度
display.setCursor(36,11); //设置字体的起始位置
display.setTextSize(1); //设置字体大小
display.print(":"); //输出冒号
display.println((float)DHT11.temperature, 2);//输出温度值
display.drawBitmap(0, 25, str_3, 16, 16, 1); //在坐标X:0 Y:25的位置显示中文字符湿
display.drawBitmap(18, 25, str_2, 16, 16, 1);//在坐标X:18 Y:25的位置显示中文字符度
display.setCursor(36,30); //设置字体的起始位置
display.setTextSize(1); //设置字体大小
display.print(":"); //输出冒号
display.println((float)DHT11.humidity, 2);//输出湿度值
int x=analogRead(A0);//读取MQ-2的值
float vol=5.00*(x/1023.00);//输出值转换成电压,该程序未显示。
display.setCursor(0,45);//在坐标X:0 Y:45的位置显示英文MQ-2:
display.print("MQ-2: ");//输出MQ-2:
display.println(x);//输出变量x,即MQ-2的值
display.display();//显示上述内容
if(x<310){//判断x大小
analogWrite(led,0);//LED灯默认不亮
display.drawBitmap(74, 45, str_4, 16, 16, 1); //在坐标X:74 Y:45的位置显示中文字符安
display.drawBitmap(90, 45, str_5, 16, 16, 1); //在坐标X:90 Y:45的位置显示中文字符全
display.display();//显示上述内容
}
else if(x>310&&x<600){//判断x值大小
analogWrite(led,analogRead(A0)/4);//LED灯按照A0端口的值显示
display.drawBitmap(74, 45, str_6, 16, 16, 1);//在坐标X:74 Y:45的位置显示中文字符警
display.drawBitmap(90, 45, str_7, 16, 16, 1); //在坐标X:90 Y:45的位置显示中文字符告
display.display();
tone(alarm,500);
delay(500);
noTone(alarm);//蜂鸣器发声
}
if(x>600){//判断x值大小
analogWrite(led,255);//LED灯最亮显示
display.drawBitmap(74, 45, str_8, 16, 16, 1); //在坐标X:74 Y:45的位置显示中文字符危
display.drawBitmap(90, 45, str_9, 16, 16, 1); //在坐标X:90 Y:45的位置显示中文字符险
display.display();
tone(alarm,1200);
delay(200);
noTone(alarm);//蜂鸣器发声
analogWrite(led,0);
}
}

上传程序,OLED显示屏显示温湿度以及MQ-2的值。当值超过范围,显示相应的警示,蜂鸣器对应的报警。

5、相关下载

库文件

2
分享到:

评论13

请先

  1. 请问如何获取传感器的单一气体呢?(ppm)打个比方说我要获取 CO 的ppm
    lukason2018-05-23 12:57:59
    • 烟雾传感器是感测可燃性气体和烟雾浓度。属于广谱型传感器。
      arron2018-05-28 16:49:43
  2. 那请问其他的呢, 类似MQ7,6,9
    lukason2018-05-28 21:48:58
    • 目前我们所售的就该一款烟雾传感器。其他的不清楚。
      arron2018-06-04 11:30:40
  3. 楼主,请问一下问什么在arduino上边编译时候他讲编译出错呢?显示为开发板 Arduino/Genuino Mega or Mega 2560 编译时出错。
    dc7_2018-05-30 21:22:19
    • 按照报错内容解决问题。程序是得添加库文件的。
      arron2018-06-04 11:33:47
    • 请问你解决了吗?填上库文件程序可以了吗
      sgx5212019-09-02 18:43:31
  4. 那个黄色的元器件是什么?
    kalo2019-05-23 11:05:08
  5. 加上库文件上面那个程序可以吗
    sgx5212019-09-02 20:17:40
  6. 为啥做这个东西 ,连线和代码都是上面的,但显示屏上全是白点,不现实温湿度呢
    sgx5212019-09-11 21:43:08
  7. 你好,我的0.96寸OLED显示不完全该怎么更改呢
    21zrr2019-10-11 17:59:00
原Arduino365.com域名更改为品牌域名ultirobot.com,承载内容要将更丰富,网站也进行了改版,改善阅读体验。
没有账号? 忘记密码?