震惊!燃气灶无人值守竟会自动点火!-Arduino中文社区 - Powered by Discuz! Archiver

诚哥崽 发表于 2017-10-15 11:03

震惊!燃气灶无人值守竟会自动点火!

本帖最后由 诚哥崽 于 2018-4-5 20:21 编辑

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

四、基本程序流程图



五、基本原理介绍首先,附上项目完成图:




旋转原理
      从上图可以看到,原来的燃气灶旋钮被替换成为一个带齿旋钮,步进电机上套着一个齿轮,通过齿轮的咬合,驱动旋钮旋转。

[*]3D打印旋钮



按压原理使用偏心轮结构,转动偏心轮,把连接旋钮铜柱的连接件顶下去

[*]GIF动态原理图



[*]使用solidworks进行3D建模


[*]打印并进行组装(此处偏心轮照片为第一代,与上图略有不同)



WIFI联网原理
使用机智云物联网平台进行联网通信



[*]所用WIFI模块- esp8266-01

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

六、程序与硬件连接

[*]刷写好固件后,需要按照安信可给出的资料进行接线


[*]接线后图片

[*]附上程序

/**
************************************************************
@file         Gizwits + ArduinoUnoR3 Library
@brief      Datapoints handle , Gizwits Process
@author       Gizwits
@date         2017-08-01
@version      V03030000
@copyright    Gizwits

@note         机智云.只为智能硬件而生
                Gizwits Smart Cloudfor 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=13D1=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 initOK \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();
}
[*](程序使用了虚拟多线程技术,如有不同请查看:利用 ProtoThreads实现Arduino多线程处理)
[*]这段程序只是主程序,若要使用,还需按照机智云的库

[*]运行照片

六、插件底板

[*]本参赛项目之所以叫做智能燃气灶插件,是因为此产品呈插件状,可以把老式燃气灶改装
[*]下图为Solidworks效果图


[*]插件效果图

[*]3D打印成功,准备拧螺丝

七、结尾

[*]此贴未完,准备拍摄使用说明,敬请期待!
[*]附上团队照片(左二为本人、左三为另一位组员,其他同学请无视~( ̄▽ ̄)~*)
[*]Arduino是从今年暑假开始学的,项目从今年九月份开始做,参加了青少年科技创新大赛,但很遗憾的是在省赛的时候被淘汰了
[*]下面发一些我比赛时拍的照片:lol---------坐标:华南农业大学


[*]最后,感谢Kittenbot与Arduino中文社区,使得我们有这次学习交流的机会


[*]下图为两位组员,本人为摄影师

[*]本人QQ
601596643











michael_llh 发表于 2017-10-15 19:00

很棒!!!

诚哥崽 发表于 2017-10-15 22:30

michael_llh 发表于 2017-10-15 19:00
很棒!!!

谢谢!!:lol

迪迦aoyeman 发表于 2017-10-16 11:01

赞!!!!!!

myra07 发表于 2017-10-17 17:52

现在的中学生啊,前途无量啊:lol

suoma 发表于 2017-10-17 19:10

         来个测试视频

诚哥崽 发表于 2017-10-17 22:29

suoma 发表于 2017-10-17 19:10
来个测试视频

ok,现在程序正在调试,打算周四录制视频,周五剪辑然后放上来

单片机菜鸟 发表于 2017-10-19 13:40

中学生开始无敌了

syl312 发表于 2017-10-19 22:13

1.感谢对社区比赛的支持,请补充下项目演示视频,具体要求请参考:
http://www.arduino.cn/thread-47517-1-1.html
2.开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
3.比赛结果会在11.15号前公布,请耐心等待。


yhmoney 发表于 2018-4-6 21:09

最终是几等奖?
页: [1] 2 3 4
查看完整版本: 震惊!燃气灶无人值守竟会自动点火!