文档章节

有毒有害气体报警器

素人派
 素人派
发布于 2015/07/22 07:55
字数 743
阅读 2
收藏 0
[codesyntax lang="c" lines="normal"]
/*
 The circuit:
 DHT11    - PIN 4
 RCLK     - PIN 8
 SCLK     - PIN 7
 DIO      - PIN 9
 BUZZER   - PIN 10
 MQ-7-D   - PIN 2
 MQ-7-A   - PIN A0
 MQ-1o35-D - PIN 3
 MQ-135-A - PIN A1
 
 Created by SuRen, 2014-11-29
*/

#include <dht.h>
#include <string.h>

dht DHT;

#define DHT11_PIN 4

#define latchPin 8 //RCLK
#define clockPin 7 //SCLK
#define dataPin 9 //DIO

#define BUZZER_PIN 10

#define MQ7_PIN_D 2
#define MQ7_PIN_A 0
#define MQ135_PIN_D 3
#define MQ135_PIN_A 1

//#define DEBUG

byte nums[] = {
  0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff
};

byte pos[] = {
  0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80
};

void alarm(int count = 5)
{
  float sinVal;
  int toneVal;
  
  for(int i = 0; i < count; i++)
  {
    for(int x = 0; x < 180; x++)
    {
      sinVal = (sin(x * (3.1415 / 180)));
      toneVal = 2000 + (int(sinVal * 1000));
      
      tone(BUZZER_PIN, toneVal, 100);
      
      delay(2);
    }
  }
}

void setup()
{
  Serial.begin(9600);
  Serial.flush();
  
  setup_tip();
  
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(MQ7_PIN_D, INPUT);
  pinMode(MQ135_PIN_D, INPUT);
  
  clear_text();
  
//  attachInterrupt(0, mq7_state_change, LOW | FALLING);
//  attachInterrupt(1, mq135_state_change, LOW | FALLING);
  
  setup_tip();
}

void setup_tip()
{
  tone(BUZZER_PIN, 100, 100);
  delay(10);
  noTone(BUZZER_PIN);
}

byte get_value(char c)
{
  byte value = 0xff;
  
  switch(c)
  {
    case '0':
      value = nums[0];
      break;
    case '1':
      value = nums[1];
      break;
    case '2':
      value = nums[2];
      break;
    case '3':
      value = nums[3];
      break;
    case '4':
      value = nums[4];
      break;
    case '5':
      value = nums[5];
      break;
    case '6':
      value = nums[6];
      break;
    case '7':
      value = nums[7];
      break;
    case '8':
      value = nums[8];
      break;
    case '9':
      value = nums[9];
      break;
  }
  
  return value;
}

void dis_text(const char text[])
{
  char re_text[8];
  for(int i = strlen(text) - 1, index = 0; i >=0; i--)
  {
    re_text[index++] = text[i];
  }
  
  for(int i = 0; i < sizeof(re_text); i++)
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, get_value(re_text[i]));
    shiftOut(dataPin, clockPin, MSBFIRST, pos[i]);
    digitalWrite(latchPin, HIGH);
  }
}

void clear_text()
{
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
  digitalWrite(latchPin, HIGH);
}

void display_text(char *buf, int count = 1500)
{
  for(int i = 0; i < count; i++)
  {
    dis_text(buf);
    
    delay(1);
  }
  
  clear_text();
}

void mq_info_display()
{
  char buf[9] = {0};
  int mq7_a = analogRead(MQ7_PIN_A);
  int mq135_a = analogRead(MQ135_PIN_A);
  
  snprintf(buf, sizeof(buf) / sizeof(char), "%4d%4d", mq7_a, mq135_a);
  
  display_text(buf, 1000);
}

void loop()
{
  int chk = DHT.read11(DHT11_PIN);
  char buf[9] = {0};
  switch(chk)
  {
    case 0:
      Serial.print(DHT.humidity);
      Serial.print(",");
      Serial.println(DHT.temperature);
      snprintf(buf, sizeof(buf) / sizeof(char), "%4d%4d", (int) DHT.temperature, (int) DHT.humidity);

      display_text(buf);
      break;
    case -1:
      Serial.println("dht error -1");
      break;
    case -2:
      Serial.println("dht error -2");
      break;
    default:
      Serial.println("dht unknow error");
      break;
  }

  mq_detect();
  
  mq_info_display();

  mq_detect();
}

int mq7_analog_array[10] = {0};
int mq135_analog_array[10] = {0};

/*
* push a int value into array, if array is full return false, or return true
**/
boolean array_push(int array[],int len, int initValue, int newValue)
{  
  for(int i = 0; i < len; i++)
  {
    if(array[i] == initValue)
    {
      array[i] = newValue;
      #ifdef DEBUG
      Serial.print("new Value : ");
      Serial.print(newValue);
      Serial.print("; index : ");
      Serial.println(i);
      #endif
      return true;
      break;
    }
  }
  
  int last_index = len - 1;
  for(int i = 0; i < last_index; i++)
  {
    array[i] = array[i + 1];
    
    #ifdef DEBUG
    Serial.print(array[i]);
    Serial.print("\t");
    #endif
  }
  #ifdef DEBUG
  Serial.println();
  #endif
  
  array[last_index] = newValue;
  
  return false;
}

boolean isSmooth(int array[], int len, int gap)
{
  int maxValue = 0;
  for(int i = 0; i < len; i++)
  {
    if(array[i] > maxValue)
    {
      maxValue = array[i];
    }
  }
  
  int minValue = maxValue;
  for(int i = 0; i < len; i++)
  {
    if(array[i] < minValue)
    {
      minValue = array[i];
    }
  }
  
  if(maxValue - minValue <= gap)
  {
    return true;
  }
  else
  {
    return false;
  }
}

boolean isNotSmooth(int array[], int len, int gap)
{
  return !isSmooth(array, len, gap);
}

/*
* if is a bule alert return true, or return false
**/
boolean isAlert(int analog_array[], int len, int digital, int analog)
{
  if(array_push(analog_array, len, 0, analog))
  {
    return false;
  }
  
  if(isNotSmooth(analog_array, len, 10))
  {
    return false;
  }
  
  if(digital == LOW)
  {
    return true;
  }
  else
  {
    return false;
  }
}

void mq_detect()
{
  mq7_state_change();
  mq135_state_change();
}

void mq7_state_change()
{
  int mq7_a = analogRead(MQ7_PIN_A);
  int mq7_d = digitalRead(MQ7_PIN_D);
  
  int len = sizeof(mq7_analog_array) / sizeof(mq7_analog_array[0]);
  if(isAlert(mq7_analog_array, len, mq7_d, mq7_a))
  {
    alarm();
    
    delay(10);
    
    mq7_state_change();
  }
}

void mq135_state_change()
{
  int mq135_a = analogRead(MQ135_PIN_A);
  int mq135_d = digitalRead(MQ135_PIN_D);
  
  int len = sizeof(mq135_analog_array) / sizeof(mq135_analog_array[0]);
  if(isAlert(mq135_analog_array, len, mq135_d, mq135_a))
  {
    alarm();
    
    delay(10);
    
    mq135_state_change();
  }
}
[/codesyntax]

本文转载自:http://surenpi.com/2014/12/26/%e6%9c%89%e6%af%92%e6%9c%89%e5%ae%b3%e6%b0%94%e4%bd%93%e6%8a%a5%e8%...

素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
基于MicroPython的家庭可燃气体泄露微信报警器

在我们平时的生活中,经常看到因气体泄漏发生爆炸事故的新闻。房屋起火、人体中毒等此类的新闻报道层出不穷。这种情况下,人民就发明了可燃气体报警器。当工业环境、日常生活环境(如使用天然...

bodasisiter
03/02
0
0
帮安迪旗下安监宝上市,特殊作业进入智能监控时代

随着社会科技的发展,智能设备和互联网技术的普及,智能设备已经成为特殊作业场所的“基础设施”。近日,为了加强特殊场所作业过程安全监控,提高应急响应能力,避免和减少特殊作业场所作业过...

玄学酱
2018/05/09
0
0
SCADA组态系统将主宰新的网络安全领域

自动化时代,SCADA系统扮演着很重要的角色,透过远程监控以及警报系统的提醒,使得自动化生产更有效率。但因为SCADA系统的历史原因,比较少考虑到网络安全的因素,因此随著越来越多的重要设备...

kongjianxuanxing
2015/08/30
0
0
动物会产生“鸡尾酒”模式毒素

已知有一些生物,譬如植物,会用化学毒素保护自己。但英国考文垂大学研究人员在《英国皇家学会学报B》上发表论文称,有毒动物还会产生靶向其猎物的毒素,而其整个毒液变成了一种“鸡尾酒”模...

软件达人
2018/01/18
0
0
智能家居新风系统:明年将迎来新转机?

  如今,谈到空气,很多的人都是一声叹息……   的确,在经济高速发展的今天,让环境不堪重负,让空气质量从外到内全面坍塌,但是,我们也看到,先进的科技和人工智能的发展,也给我们的...

中国机器人
2018/01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Disable Autostart of MySQL Server on Ubuntu

OSC Markdown Editer 真香,笔记一篇,懒得转中文,如有表述问题,请不吝指出,先谢为敬! OS: Ubuntu 19.04 When the MySQL server is installed, it automatically started with the OS. I...

Iridium
17分钟前
0
0
OpenStack RDO + S3

Packstack(RDO) installation "sync db timeout" issue version: openstack-packstack-13.0.0-0.1.0rc1.el7.noarchopenstack-packstack-puppet-13.0.0-0.1.0rc1.el7.noarch add timeout =>......

Firxiao
19分钟前
0
0
java运算符的优先级

https://www.cnblogs.com/zjfjava/p/5996666.html

南桥北木
24分钟前
0
0
线性代数的静态观-向量空间(一)

向量是一个具有大小和方向的量,因此只要大小与方向相同则向量也相同,从而向量可以自由平行移动。 向量与点不同,它反映的是从A到B的位移(既包含位移的方向又包含位移的大小),而点仅仅是...

FAT_mt
25分钟前
0
0
Redis缓存穿透、缓存雪崩和缓存击穿

Redis缓存穿透、缓存雪崩 缓存雪崩,是指在某一个时间段,缓存集中过期失效。 产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中...

architect刘源源
47分钟前
10
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部