查看: 2639|回复: 3

基于机智云的智能燃气灶插件

[复制链接]
回帖奖励 40 金币 回复本帖可获得 2 金币奖励! 每人限 2 次(中奖概率 80%)
  • TA的每日心情
    开心
    2018-11-1 22:10
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-1-25 21:47 | 显示全部楼层 |阅读模式
    本帖最后由 诚哥崽 于 2018-4-6 16:07 编辑

    一、项目介绍
            如今,智能家居不断提高人们的生活质量,优化人们的生活,大大减轻人们的生活压力,智能家居革命已经进行得热火朝天。
            而近年来,由于烧水或做饭忘记关闭煤气炉而引发的火灾事件层出不穷,为了解决这一安全隐患,我们研发了这一款智能煤气炉插件。
            它是由一块Arduino mega2560 进行控制,周围连接了火焰传感器、烟雾传感器、步进电机、OLED显示屏、ESP8266 WIFI模块等。通过物联网技术与手机端建立连接。用户可以通过手机远程控制旋钮所指向的角度与熄火的时间。当插件检测到危险时,蜂鸣器会发出警报。同时,步进电机会自动旋转关闭燃气灶。
    二、基本介绍
           智能煤气炉插件是燃气灶的一次“革命”,它可以实现远程控制煤气炉插件,使得燃气炉可以实现自动蒸热食物。另外,它还能智能控制蒸煮时间,及时关闭煤气炉开关,消除安全隐患。此外,该产品可以直接把大部分普通燃气灶升级为智能燃气灶,轻松实现家居智能化。
    演示视频:
    视频地址:基于机智云的智能燃气灶插件
    三、设计的目的
           这一想法,主要源自日常生活:常常有人因为出门忘关燃气炉而导致火灾发生,据2015公安消防局给出的数据。全年10.2起火灾中,有56.7%是由于电气原因引发,用火不慎占17.7%。其二则是上班一族由于加班而导致常常吃方便面。为了解决这些问题,我们决定开发这一工具。


    四、基本程序流程图
    QQ图片20180125220509.png


    五、基本原理介绍
      首先,附上项目完成图:
    QQ截图20180125215748.png QQ截图20180125215755.png QQ截图20180125215802.png QQ截图20180125215808.png QQ截图20180125215915.png QQ截图20180125215947.png QQ截图20180125215955.png




      旋转原理
          从上图可以看到,原来的燃气灶旋钮被替换成为一个带齿旋钮,步进电机上套着一个齿轮,通过齿轮的咬合,驱动旋钮旋转。
    • 3D打印旋钮
    QQ截图20180125220002.png
      
      按压原理  使用偏心轮结构,转动偏心轮,把连接旋钮铜柱的连接件顶下去
    • GIF动态原理图


    • 使用solidworks进行3D建模
    QQ截图20180125215932.png
    • 打印并进行组装(此处偏心轮照片为第一代,与上图略有不同)
    QQ截图20180125215726.png
    WIFI联网原理
    使用机智云物联网平台进行联网通信
    093041vozjchwwhhoxjuso.png QQ截图20180125220032.png QQ截图20180125220013.png

    • 所用WIFI模块- esp8266-01

    使用机智云物联网平台前需要进行固件刷写,教程请见:
    【G友经验】ESP8266烧写机智云固件教程详解

    六、程序与硬件连接
    • 刷写好固件后,需要按照安信可给出的资料进行接线
    • 附上程序
    [kenrobot_code]/**
    ************************************************************
      @file         Gizwits + ArduinoUnoR3 Library
      @brief        Datapoints handle , Gizwits Process
      @author       Gizwits
      @date         2017-08-01
      @version      V03030000
      @copyright    Gizwits

      @note         机智云.只为智能硬件而生
                    Gizwits Smart Cloud  for Smart Products
                    链接|增值ֵ|开放|中立|安全|自有|自由|生态
                    www.gizwits.com
      v1.52
    ***********************************************************/
    #define STEPS 100//步进电机每转步长为100

    #include <pt.h>
    #include "Gizwits.h"
    #include <Wire.h>
    #include <SoftwareSerial.h>
    #include "U8glib.h"   //预加载OLED显示屏控制库
    #include"Beep_tone.h" //预加载音乐库
    #include <Stepper.h> //预加载步进电机控制库

    Gizwits myGizwits;
    Stepper dianji_one(STEPS, 22, 24, 23, 25); //引脚安装正常顺序接,定义引脚时中间两个要调换位置
    Stepper dianji_two(STEPS, 26, 28, 27, 29); //引脚安装正常顺序接,定义引脚时中间两个要调换位置

    unsigned long shengyu_time; //剩余时间
    unsigned long varR_set_the_time = 0;
    unsigned long shengyu_time_two;//转化用
    unsigned long varR_dianji_one = 0;
    unsigned long varW_time_left = shengyu_time_two; //Add Sensor Data Collection
    unsigned long yanwu;
    unsigned long varW_yanwu = yanwu; //Add Sensor Data Collection
    bool varR_submit = 0;
    bool varR_ignition = 0;

    int sudu = 60; //步进电机速度为60转/min
    int i;
    int jiezou = 0; //节奏
    long s = 0;   //储存当前角度

    long p;
    static int protothread1_flag, protothread2_flag, protothread3_flag, protothread4_flag, protothread5_flag, protothread6_flag; //线程1、2、3
    static struct pt pt1, pt2, pt3, pt4, pt5, pt6;

    U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);   //D0=13  D1=11 RES=5V DC=9 CS=10
    /**
      Serial Init , Gizwits Init
      @param none
      @return none
    */
    void start() {
      u8g.setFont(u8g_font_gdr11r);          // 设定字体
      u8g.drawStr(30, 30, "Welcome");        //定位、输入
      u8g.setFont(u8g_font_tpss);            //设定字体
      u8g.drawStr(20, 50, "Timingprogram V1.52");
    }

    void work1() {                               //倒计时开始
      u8g.setFont(u8g_font_fur11);
      u8g.drawStr(20, 40, "start the timer");
      u8g.setPrintPos(40, 55);
      u8g.print(varR_set_the_time);
      u8g.drawStr(90, 55, "min");
    }

    void work2() {
      u8g.setFont(u8g_font_fur11);
      u8g.drawStr(20, 30, "Set the time");
      u8g.setFont(u8g_font_tpss);
      u8g.setPrintPos(40, 55);
      u8g.print(shengyu_time / 10);
      u8g.drawStr(90, 55, "S");
    }


    void song() {
      for (int i = 0; i < length; i++) {
        if (notes == ' ') {
          delay(beats * tempo); // rest
        } else {
          playNote(notes, beats * tempo);
        }

        // pause between notes
        delay(tempo / 2);
      }
    }


    static int protothread1(struct pt *pt) {
      PT_BEGIN(pt);
      while (1) {
        PT_WAIT_UNTIL(pt, myGizwits.hasBeenSet(EVENT_submit));
        myGizwits.read(EVENT_set_the_time, &varR_set_the_time);
        shengyu_time = varR_set_the_time * 60 * 10;
        u8g.firstPage();
        do
        {
          work1();                        //运行start函数
        } while (u8g.nextPage());
        delay(2000);
        PT_YIELD(pt);
      }
      PT_END(pt);
    }

    static int protothread2(struct pt *pt) {
      PT_BEGIN(pt);
      while (1) {
        PT_WAIT_UNTIL(pt, shengyu_time );
        for (; shengyu_time > 0; shengyu_time--) {
          u8g.firstPage();
          do
          {
            work2();                        //运行work函数
          } while (u8g.nextPage());
          delay(100);
          shengyu_time_two = shengyu_time;
          myGizwits.write(VALUE_time_left, varW_time_left);
          PT_YIELD(pt);
        }
      }
      PT_END(pt);
    }

    static int protothread3(struct pt *pt) {
      PT_BEGIN(pt);
      while (1) {
        PT_WAIT_UNTIL(pt, myGizwits.hasBeenSet(EVENT_ignition));
        i = 90;
        i = i - s;
        p = i * 256 / 45 * 4;
        s = s + i;
        dianji_two.step(500);
        for (; p > 0; p = p - 40) {
          dianji_one.step(40);
          PT_YIELD(pt);
        }
      }
      PT_END(pt);
    }

    static int protothread4(struct pt *pt) {
      PT_BEGIN(pt);
      while (1) {
        PT_WAIT_UNTIL(pt, analogRead(A0) > 0);
        if (analogRead(A0) > 900) {
          varW_yanwu = 1;
        }
        else {
          varW_yanwu = 0;
        }
        // myGizwits.write(VALUE_yanwu, varW_yanwu);

        PT_YIELD(pt);
      }
      PT_END(pt);
    }

    static int protothread5(struct pt *pt) {
      PT_BEGIN(pt);
      PT_WAIT_UNTIL(pt, shengyu_time > 1 && shengyu_time < 100);
      for (; jiezou < length; jiezou++) {
        if (notes == ' ') {
          delay(beats * tempo); // rest
        } else {
          playNote(notes, beats * tempo);
        }
        PT_YIELD(pt);
        // pause between notes
        delay(tempo / 2);
      }
      PT_END(pt);
    }

    static int protothread6(struct pt *pt) {
      PT_BEGIN(pt);
      PT_WAIT_UNTIL(pt, myGizwits.hasBeenSet(EVENT_dianji_one));
      myGizwits.read(EVENT_dianji_one, &varR_dianji_one); //Address for storing data
      i = varR_dianji_one ;
      i = i - s;
      p = i * 256 / 45 * 4;
      s = s + i;
      for (; p > 0; p = p - 40) {
        dianji_one.step(40);
        PT_YIELD(pt);
      }
      PT_END(pt);
    }

    void setup() {
      // put your setup code here, to run once:

      //mySerial.begin(115200);
      //pinMode(7, INPUT);
      //pinMode(8, INPUT);
      pinMode(speakerPin, OUTPUT);
      dianji_one.setSpeed(sudu);
      dianji_two.setSpeed(sudu);
      myGizwits.setBindMode(WIFI_AIRLINK_MODE);
      myGizwits.begin();
      u8g.firstPage();
      do
      {
        start();                        //运行start函数
      } while (u8g.nextPage());
      song();

      // mySerial.println("GoKit init  OK \n");

    }

    /**
      Arduino loop
      @param none
      @return none
    */



    void loop() {

      //Configure network
      //if(XXX) //Trigger Condition
      //myGizwits.setBindMode(0x02);  //0x01:Enter AP Mode;0x02:Enter Airlink Mode
      /*
        unsigned long varW_yanwu = 0;//Add Sensor Data Collection
        myGizwits.write(VALUE_yanwu, varW_yanwu);
        unsigned long varW_time_left = 0;//Add Sensor Data Collection
        myGizwits.write(VALUE_time_left, varW_time_left);


        bool varR_LED_OnOff = 0;
        if(myGizwits.hasBeenSet(EVENT_LED_OnOff))
        {
        myGizwits.read(EVENT_LED_OnOff,&varR_LED_OnOff);//Address for storing data
        mySerial.println(F("EVENT_LED_OnOff"));
        mySerial.println(varR_LED_OnOff,DEC);

        }
        bool varR_submit = 0;
        if(myGizwits.hasBeenSet(EVENT_submit))
        {
        myGizwits.read(EVENT_submit,&varR_submit);//Address for storing data
        mySerial.println(F("EVENT_submit"));
        mySerial.println(varR_submit,DEC);

        }
        bool varR_ignition = 0;
        if(myGizwits.hasBeenSet(EVENT_ignition))
        {
        myGizwits.read(EVENT_ignition,&varR_ignition);//Address for storing data
        mySerial.println(F("EVENT_ignition"));
        mySerial.println(varR_ignition,DEC);

        }
        unsigned long varR_dianji_one = 0;
        if(myGizwits.hasBeenSet(EVENT_dianji_one))
        {
        myGizwits.read(EVENT_dianji_one,&varR_dianji_one);//Address for storing data
        mySerial.println(F("EVENT_dianji_one"));
        mySerial.println(varR_dianji_one,DEC);

        }
        unsigned long varR_set_the_time = 0;
        if(myGizwits.hasBeenSet(EVENT_set_the_time))
        {
        myGizwits.read(EVENT_set_the_time,&varR_set_the_time);//Address for storing data
        mySerial.println(F("EVENT_set_the_time"));
        mySerial.println(varR_set_the_time,DEC);

        }


        //binary datapoint handle
      */

      /*  if (digitalRead(7) == LOW) //Trigger Condition
        {
          delay(10);
          while (digitalRead(7) == LOW);
          myGizwits.setBindMode(WIFI_RESET_MODE);  //0x01:Enter AP Mode;0x02:Enter Airlink Mode
          // Serial.println("START_AIRLINK");
        }
        if (digitalRead(8) == LOW) //Trigger Condition
        {
          delay(10);
          while (digitalRead(8) == LOW);
          myGizwits.setBindMode(WIFI_AIRLINK_MODE);  //0x01:Enter AP Mode;0x02:Enter Airlink Mode
          // Serial.println("START_AIRLINK");
        }
      */
      protothread1(&pt1);
      protothread2(&pt2);
      protothread3(&pt3);
      protothread4(&pt4);
      protothread5(&pt5);
      protothread6(&pt6);
      myGizwits.write(VALUE_yanwu, varW_yanwu);
      myGizwits.process();[/kenrobot_code]
    • 运行照片
    QQ截图20180125220023.png
    六、插件底板
    • 本参赛项目之所以叫做智能燃气灶插件,是因为此产品呈插件状,可以把老式燃气灶改装
    • 下图为Solidworks效果图
    03渲染图.JPG 06插件效果2.JPG
    • 插件效果图

    • 3D打印成功,准备拧螺丝
    QQ截图20180125215939.png
    七、结尾
    • Arduino是从去年暑假开始学的,项目从今年九月份开始做,准备参加今年3月初的-全国青少年科技创新大赛-省赛
    • 最后,感谢Kittenbot与Arduino中文社区,使得我们有这次学习交流的机会
    • 本人QQ,请各位大神们指教(601596643)



    如果觉得对你有所帮助的话可以打赏一下我哦(~ ̄▽ ̄)~
  • TA的每日心情
    开心
    2018-7-28 16:59
  • 签到天数: 34 天

    [LV.5]常住居民I

    发表于 2018-4-1 13:08 | 显示全部楼层
    猴赛雷啊,膜拜一下

    该用户从未签到

    发表于 2018-4-6 20:47 | 显示全部楼层
    6666,膜拜一下。
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【Arduino】u8g2中文字库制作教程 小白请进
    【Arduino】u8g2中文字库
    我知道对于这个话题许多大佬们都会,发这个贴子也算是炒冷饭了,所以一开始我也十分纠
    请问Arduino可以和这种NB-IOT模块连接吗
    请问Arduino可以和这种NB-
    如图
    【干货分享】mega2560原理图PCB图纸altium designer18
    【干货分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表