2025-3-14 11:52:42 [显示全部楼层]
34浏览
查看: 34|回复: 0

[项目] 智能检测烟雾、可燃气体、震动,利用RGB灯带及嗡鸣器...

[复制链接]
智能检测烟雾、可燃气体、震动,利用RGB灯带及嗡鸣器实现报警的智能装置。
本程序利用点灯APP进行调控,可供所有人搬运及修改使用。
// 接口注释:A0(温度传感器),D0(蜂鸣器供电),D1(震动传感器),D2(可燃气体传感器MQ-9)
// 接口注释:D3(烟雾传感器),D4(温度传感器),D5(LED灯带控制信号),VV(3V供电),G(接地)
// 组件注释:
①警灯(点击时,灯带高频闪烁红蓝交替灯光)  
②检测模式(点击后,对可燃气体、烟雾、震动、温度进行检测,数值异常时翁鸣器工作并灯带高频闪烁红蓝交替灯光)
③色盘模式(点击后,可在手机APP调色盘中直接调节灯带颜色及亮度)
④彩虹模式(点击后,可在手机APP调节灯带为渐变效果,可调节灯带初始颜色、颜色过渡快慢及亮度)
⑤动态模式(点击后,可在手机APP调节灯带为动态效果,可调节灯带动态模式、颜色过渡快慢及亮度,内置模式有0云朵,1熔岩,2海洋,3森林,4彩虹,5线条,6派对,7心跳)
⑥天气模式(点击后,可在根据天气调节动态效果,0晴天-红橙色变化,1阴天-绿白色变化,2下雨-蓝白色缓慢变化,3雷雨-蓝白色快速变化,4下雪-白色淡入淡出,5大风-蓝色淡入淡出)
⑦RGB色盘(调节灯带颜色)
⑧调试滑块(在数值正常的情况下触发不同的异常情况,测试程序是否正常,0一切正常,1可燃气体异常,2烟雾异常,3温度异常,4震动异常)
#include <SoftwareSerial.h>
#define BLINKER_WIFI
#include <Blinker.h>
#include "FastLED.h"    // 此示例程序需要使用FastLED库
#define NUM_LEDS 120    // LED灯珠数量
#define LED_TD D5       // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 100; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
CRGB leds[NUM_LEDS]; // 建立光带leds
// 连接WiFi与模块
char auth[] = "8998b81475da";
char ssid[] = "WiFi2.0";
char pswd[] = "18979713677zzm";
// 新建组件对象
BlinkerButton Button1("jingden");
BlinkerButton Button2("tiaoshi");
BlinkerButton Button3("sepan");
BlinkerButton Button4("caihong");
BlinkerButton Button5("dongtai");
BlinkerButton Button6("tianqi");
BlinkerRGB RGB1("RGB");
BlinkerSlider Slider1("HKQ");
BlinkerSlider Slider2("HKC");
BlinkerSlider Slider3("HKT");
// 赋值
int n = 0;   // 基本模式
int w = 0;   // 天气模式
int W = 0;   // 天气运算
int m = 0;   // 动态模式
int M = 0;   // 动态运算
int YC = 20; // 延迟时间
int zhendongD = 0;
int keranD = 0;
int yanwuD = 0;
int wenduD = 0;
uint8_t R = 0; // LED红色数值
uint8_t G = 0; // LED绿色数值
uint8_t B = 0; // LED蓝色数值
uint8_t L = 0; // LED亮度数值
uint8_t Q = 0; // LED起始颜色
uint8_t C = 0; // LED色差
uint8_t T = 0; // 调试模式
//后面可以用  color.R = 值 去修改这个结构体
typedef struct // 结构体定义
{
  uint8_t R;
  uint8_t G;
  uint8_t B;
} color_t;
// 结构体初始化
color_t color = {
    .R = 0,
    .G = 0,
    .B = 0,
};
// 按下按键即会执行该函数
void button1_callback(const String &state)
{
  n = 1;
  Blinker.print("警灯已开启");
}
void button2_callback(const String &state)
{
  n = 2;
  Blinker.print("检测调试");
}
void button3_callback(const String &state)
{
  n = 3;
  Blinker.print("彩色模式");
}
void button4_callback(const String &state)
{
  n = 4;
  Blinker.print("彩虹模式");
}
void button5_callback(const String &state)
{
  n = 5;
  M++;
  m = M % 9;
  Blinker.print("0云朵,1熔岩,2海洋,3森林,4彩虹,5线条,6派对,7心跳", "动态模式", m);
}
void button6_callback(const String &state)
{
  n = 6;
  W++;
  w = W % 6;
  Blinker.print("0晴天,1阴天,2下雨,3雷雨,4下雪,5大风", w);
}
// APP RGB颜色设置回调
void rgb1_callback(uint8_t LR, uint8_t LG, uint8_t LB, uint8_t LL)
{
  R = LR;
  G = LG;
  B = LB;
  L = LL;
  Serial.printf("R=%d, G=%d, B=%d\r\n", R, G, B);
}
// APP 滑块设置回调
void slider1_callback(int32_t LQ)
{
  Q = LQ;
}
void slider2_callback(int32_t LC)
{
  C = LC;
}
void slider3_callback(int32_t LT)
{
  T = LT;
}
//自定义程序(警灯程序,请勿使用延迟delay();)
void jingden ()
{
  if (R == 255)
  {
  lan();
  CRGB myRGBcolor(R, G, B);
  fill_solid(leds, 120, myRGBcolor); // 设置光带颜色
  FastLED.setBrightness(L);          // 设置光带亮度
  FastLED.show();
  }
  else
  {
  hong();
  CRGB myRGBcolor(R, G, B);
  fill_solid(leds, 120, myRGBcolor); // 设置光带颜色
  FastLED.setBrightness(L);          // 设置光带亮度
  FastLED.show();
  }
}
void hong ()
{
  R = 255;
  G = 0;
  B = 0;
}
void lan ()
{
  R = 0;
  G = 0;
  B = 255;
}
  ///////////////////////////////以下为单次程序//////////////////////////////////
void setup()
{
  pinMode(D0, OUTPUT); // 蜂鸣器供电
  pinMode(D1, INPUT); // 震动传感器(数字信号)
  pinMode(D2, INPUT); // 可燃气体传感器(MQ-9)
  pinMode(D3, INPUT); // 烟雾传感器(MQ-2)
  pinMode(D4, INPUT); // 温度传感器(数字信号)
#if defined(BLINKER_PRINT)
  BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
  // 初始化blinker
  Blinker.begin(auth, ssid, pswd);
  Button1.attach(button1_callback);
  Button2.attach(button2_callback);
  Button3.attach(button3_callback);
  Button4.attach(button4_callback);
  Button5.attach(button5_callback);
  Button6.attach(button6_callback);
  // 注册调节颜色的回调函数
  RGB1.attach(rgb1_callback);
  // 注册滑块的回调函数
  Slider1.attach(slider1_callback);
  Slider2.attach(slider2_callback);
  Slider3.attach(slider3_callback);
  LEDS.addLeds<LED_TYPE, LED_TD, COLOR_ORDER>(leds, NUM_LEDS);   // 初始化光带
  FastLED.setBrightness(max_bright);                             // 设置光带亮度
  Serial.begin(9600); // 启动串行通讯
  delay(2000);        // 稳定性等待
}
  ///////////////////////////////以下为循环程序//////////////////////////////////
void loop()
{
  Blinker.run();
  // 赋值
  zhendongD = digitalRead(D1);
  keranD = digitalRead(D2);
  yanwuD = digitalRead(D3);
  wenduD = digitalRead(D4);
  ///////////////////////////////以下为报警模式//////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////
  
  if (n == 2)
  {
    if (keranD == 0 || T == 1 ) // 检测到可燃气体过高蜂鸣及报警条件
    {
      digitalWrite(D0, HIGH);
      jingden ();
      Blinker.vibrate(1000);
      Blinker.notify("!!注意!!检测到有可燃气体泄露!!立即检查!!开窗通风!!");
    }
    else if (yanwuD == 0 || T == 2 ) // 检测到烟雾气体过高蜂鸣及报警条件
       {
      digitalWrite(D0, HIGH);
      jingden ();
      Blinker.vibrate(1000);
      Blinker.notify("!!注意!!烟雾浓度过高!!立即检查!!开窗通风!!");
    }
    else if (wenduD == 0 || T == 3 ) // 检测到温度过高蜂鸣及报警条件
    {
      digitalWrite(D0, HIGH);
      jingden ();
      Blinker.vibrate(1000);
      Blinker.notify("!!注意!!温度异常!!立即检查!!");
    }
    else if (zhendongD == 0 || T == 4 ) // 检测到震动异常蜂鸣及报警条件
    {
      digitalWrite(D0, HIGH);
      jingden ();
      Blinker.vibrate(1000);
      Blinker.notify("!!注意!!存在异常震动!!立即检查!!");
    }
    else if (zhendongD == 1 && keranD == 1 && wenduD == 1 && yanwuD == 1)
    {
      digitalWrite(D0, LOW);
    }
    else
    {
      digitalWrite(D0, LOW);
    }
  }
  ///////////////////////////////以下为灯带模式//////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////
  if (n == 1)
  {
  jingden ();
  }
  if (n == 3)
  {
    digitalWrite(D0, LOW);
    CRGB myRGBcolor(R, G, B);
    fill_solid(leds, 120, myRGBcolor); // 设置光带颜色
    FastLED.setBrightness(L);          // 设置光带亮度
    FastLED.show();
  }
  if (n == 4)
  {
    digitalWrite(D0, LOW);
    fill_rainbow(leds, 120, Q, C);
    FastLED.setBrightness(L); // 设置光带亮度
    FastLED.show();
  }
  if (n == 5)
  {
    digitalWrite(D0, LOW);
    Q++;
    delay(YC);
    switch (m)
    {
    case 1:
      fill_palette(leds, 120, Q, C, CloudColors_p, L, LINEARBLEND);
      break;
    case 2:
      fill_palette(leds, 120, Q, C, LavaColors_p, L, LINEARBLEND);
      break;
    case 3:
      fill_palette(leds, 120, Q, C, OceanColors_p, L, LINEARBLEND);
      break;
    case 4:
      fill_palette(leds, 120, Q, C, ForestColors_p, L, LINEARBLEND);
      break;
    case 5:
      fill_palette(leds, 120, Q, C, RainbowColors_p, L, LINEARBLEND);
      break;
    case 6:
      fill_palette(leds, 120, Q, C, RainbowStripeColors_p, L, LINEARBLEND);
      break;
    case 7:
      fill_palette(leds, 120, Q, C, PartyColors_p, L, LINEARBLEND);
      break;
    case 8:
      fill_palette(leds, 120, Q, C, HeatColors_p, L, LINEARBLEND);
      break;
    }
    FastLED.setBrightness(L);
    FastLED.show();
  }
  ///////////////////////////////以下为天气模式//////////////////////////////////
  //////////////////////////////////////////////////////////////////////////////
  if (n == 6)
  {
    digitalWrite(D0, LOW);
    if (w == 0)
    {
      n = 5;
      m = 8;
      Q = 28;
      C = 2;
    }
    if (w == 1)
    {
      n = 5;
      m = 4;
    }
    if (w == 2)
    {
      n = 5;
      m = 1;
      YC = 25;
      C = 25;
    }
    if (w == 3)
    {
      n = 5;
      m = 1;
      YC = 5;
      C = 1;
    }
    if (w == 4)
    {
      R = 255;
      G = 255;
      B = 255;
      CRGB myRGBcolor(R, G, B);
      for (int L = 0; L <= 255; L++)
      {
        delay(5);
        fill_solid(leds, 120, myRGBcolor);
        FastLED.setBrightness(L);
        FastLED.show();
      }
      for (int L = 255; L >= 0; L--)
      {
        delay(5);
        fill_solid(leds, 120, myRGBcolor);
        FastLED.setBrightness(L);
        FastLED.show();
      }
    }
    if (w == 5)
    {
      R = 59;
      G = 255;
      B = 255;
      CRGB myRGBcolor(R, G, B);
      for (int L = 0; L <= 255; L++)
      {
        delay(5);
        fill_solid(leds, 120, myRGBcolor);
        FastLED.setBrightness(L);
        FastLED.show();
      }
      for (int L = 255; L >= 0; L--)
      {
        delay(5);
        fill_solid(leds, 120, myRGBcolor);
        FastLED.setBrightness(L);
        FastLED.show();
      }
    }
  }
}
/*
// 输出数据到串口监视器在loop运行卡顿时,请将loop中此代码删除
Serial.print("温度A: ");
Serial.println(wenduA);
Serial.print("温度S: ");
Serial.println(wenduS);
Serial.print("震动D: ");
Serial.println(zhendongD);
Serial.print("温度D: ");
Serial.println(wenduD);
Serial.print("可燃D: ");
Serial.println(keranD);
Serial.print("烟雾D: ");
Serial.println(yanwuD);*/
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail