数码之家

 找回密码
 立即注册
搜索
查看: 3215|回复: 25

[Arduino] 安全最重要!给燃气灶加装定时熄火功能

[复制链接]
发表于 2023-1-7 11:38:03 | 显示全部楼层 |阅读模式
本帖最后由 camell 于 2023-1-8 21:14 编辑

看着新燃气灶都带定时功能心里痒啊, 换又不符合勤俭持家和DIY精神, 怎么办, 然后就有了这么一个娃, 总成本估计5个大洋, 不罗素, 上图



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 2家元 +87 收起 理由
家睦 + 80
听雨亭 + 7

查看全部打赏

 楼主| 发表于 2023-1-7 11:38:30 | 显示全部楼层
#include <Arduino.h>
#include "TouchKey.h"

#define MAXrepeat 99
#define ledInterval 4
#define blinkTime 8000
#define disabledTime 10000
#define shuttingTime 10000
uint8_t prevSensorValue = 0;

enum actChannel
{
  ch0 = 0,
  ch1 = 1,
  none = 2
};
enum actChannel actCh = 2;
unsigned long actChStartTime = 0;

const uint8_t LED7Pin[] = {37, 14, 35, 33, 11, 10, 32}; // A B C D E F G

const uint8_t numCode[] = {
    0B00111111, // 0
    0B00000110, // 1
    0B01011011, // 2
    0B01001111, // 3
    0B01100110, // 4
    0B01101101, // 5
    0B01111101, // 6
    0B00000111, // 7
    0B01111111, // 8
    0B01101111, // 9
    0B01000000, // - 10
    0B00000000, // NULL 11
};

enum states
{
  DISABLED = 0,
  WORKING = 1,
  SHUTTING = 2
};

struct channels
{
  enum states state;
  unsigned long startTime;
  uint8_t times;
  uint8_t ctlPin;
} channel[2] = {{DISABLED, 0, 0, 12},
                {DISABLED, 0, 0, 13}};

struct led
{
  uint8_t ledPin;
  uint8_t digit;
} led[4] = {{34, 11},
            {30, 11},
            {31, 11},
            {15, 11}};

void ledUpdate()
{
  if (channel[0].state == DISABLED)
  {
    led[0].digit = 11;
    led[1].digit = 11;
  }
  else
  {
    led[0].digit = channel[0].times / 10;
    if (led[0].digit == 0)
      led[0].digit = 11;
    led[1].digit = channel[0].times % 10;
  }
  if (channel[1].state == DISABLED)
  {
    led[2].digit = 11;
    led[3].digit = 11;
  }
  else
  {
    led[2].digit = channel[1].times / 10;
    if (led[2].digit == 0)
      led[2].digit = 11;
    led[3].digit = channel[1].times % 10;
  }
}

void timesM()
{
  if (actCh == none)
  {
    actCh = ch0;
    channel[actCh].state = WORKING;
    channel[actCh].times = 10;
  }
  else
  {
    channel[actCh].times--;
    if (channel[actCh].times == 0)
    {
      channel[actCh].state = SHUTTING;
      digitalWrite(channel[actCh].ctlPin, LOW);
    }
  }
  channel[actCh].startTime = millis();
  actChStartTime = millis();
  ledUpdate();
}

void timesP()
{
  if (actCh == none)
  {
    actCh = ch1;
    channel[actCh].state = WORKING;
    channel[actCh].times = 10;
  }
  else
  {
    channel[actCh].times++;
    if (channel[actCh].times > MAXrepeat)
      channel[actCh].times = MAXrepeat;
  }
  channel[actCh].startTime = millis();
  actChStartTime = millis();
  ledUpdate();
}

struct OneButton_s
{
  bool val;
  unsigned long startTime;
  bool keyDown;
} key[] = {{false, 0, false}, {false, 0, false}};

void key_tick()
{
  for (int i = 0; i < 2; i++)
  {
    unsigned long now;
    now = millis();
    if (key[i].keyDown && (now - key[i].startTime) > 400)
    {
      if (key[i].val == true)
      {
        key[i].startTime = now;
        if (i == 0)
          timesM();
        else
          timesP();
      }
      else
        key[i].keyDown = false;
    }
    else if (!key[i].keyDown && (now - key[i].startTime) > 400)
    {
      if (key[i].val == true)
      {
        key[i].keyDown = true;
        key[i].startTime = now;
      }
    }
  }
}

uint8_t channelNo = 0;

void ledInit()
{
  for (int i = 0; i < 7; i++)
    pinMode(LED7Pin[i], OUTPUT);
  for (int i = 0; i < 4; i++)
    pinMode(led[i].ledPin, OUTPUT);
}

void ledSegmentsPush(uint8_t digit)
{
  for (int j = 0; j < 7; j++)
    digitalWrite(LED7Pin[j], bitRead(numCode[digit], j));
}

void ledShow()
{
  static uint8_t i;
  i = millis() / ledInterval % 4;
  digitalWrite(led[i].ledPin, HIGH);
  i++;
  if (i > 3)
    i = 0;
  if ((millis() - actChStartTime) > blinkTime)
    actCh = none;
  if (i / 2 == actCh && bitRead(millis(), 9))
    return;
  else
  {
    ledSegmentsPush(led[i].digit);
    digitalWrite(led[i].ledPin, LOW);
  }
}

void setup()
{
  PIN_FUNC &= 0b01111111;
  pinMode(channel[0].ctlPin, OUTPUT);
  digitalWrite(channel[0].ctlPin, HIGH);
  pinMode(channel[1].ctlPin, OUTPUT);
  digitalWrite(channel[1].ctlPin, HIGH);
  ledInit();
  channel[0].startTime = millis();
  channel[1].startTime = millis();
  TouchKey_begin((1 << 4) | (1 << 5));
  TouchKey_SetMaxHalfDelta(128);     // increase if sensor value are more noisy
  TouchKey_SetNoiseHalfDelta(8);     // If baseline need to adjust at higher rate, increase this value
  TouchKey_SetNoiseCountLimit(10);   // If baseline need to adjust faster, increase this value
  TouchKey_SetFilterDelayLimit(5);   // make overall adjustment slopwer
  TouchKey_SetTouchThreshold(220);   // Bigger touch pad can use a bigger value
  TouchKey_SetReleaseThreshold(150); // Smaller than touch threshold
}

void loop()
{
  TouchKey_Process();
  uint8_t touchResult = TouchKey_Get();
  if (touchResult == 32)
    key[0].val = true;
  else if (touchResult == 16)
    key[1].val = true;
  else
  {
    key[0].val = false;
    key[1].val = false;
  }
  key_tick();
  channelNo = (channelNo + 1) % 2;
  unsigned long delta = millis() - channel[channelNo].startTime;
  switch (channel[channelNo].state)
  {
  case DISABLED:
    if (delta > disabledTime &&
        channel[(channelNo + 1) % 2].state == DISABLED &&
        millis() - channel[(channelNo + 1) % 2].startTime > disabledTime)
    {
      SAFE_MOD = 0x55; // 进入安全模式
      SAFE_MOD = 0xAA;
      GLOBAL_CFG |= 0x02;
      PCON |= 0x02;
    }
    break;
  case WORKING:
    if (delta > 60000)
    {
      if (channel[channelNo].times == 0)
      {
        channel[channelNo].state = SHUTTING;
        channel[channelNo].startTime = millis();
        digitalWrite(channel[channelNo].ctlPin, LOW);
        actChStartTime = millis();
        actCh = channelNo;
      }
      else
      {
        channel[channelNo].times -= delta / 60000;
        channel[channelNo].startTime += 60000;
      }
      ledUpdate();
    }
    break;
  case SHUTTING:
    if (delta > shuttingTime)
    {
      channel[channelNo].state = DISABLED;
      channel[channelNo].startTime = millis();
      led[channelNo * 2].digit = 11;
      led[channelNo * 2 + 1].digit = 11;
      digitalWrite(channel[channelNo].ctlPin, HIGH);
    }
  }
  ledShow();
}

打赏

参与人数 1家元 +20 收起 理由
zsm小明 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-7 11:43:47 | 显示全部楼层
借图

mos管SD串接热电偶带包皮的那端, 和电磁阀的顶部接线端

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2023-1-7 11:49:31 | 显示全部楼层
事关安全,我是不敢动煤气灶的
回复 支持 反对

使用道具 举报

发表于 2023-1-7 11:55:42 | 显示全部楼层
软硬结合,想怎么玩就怎么玩
回复 支持 反对

使用道具 举报

发表于 2023-1-7 12:12:21 | 显示全部楼层
你还打了面板啊。。。。。。
回复 支持 反对

使用道具 举报

发表于 2023-1-7 12:17:59 | 显示全部楼层
安全第一最好,弄个套子更安全
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-7 12:32:05 | 显示全部楼层
yiguangqiang 发表于 2023-1-7 12:12
你还打了面板啊。。。。。。

触摸按钮, 一➕一➖, 外带TTP223复位触发, CH552的功耗不停机估计一个月2000mah的18650就没电了
回复 支持 反对

使用道具 举报

发表于 2023-1-7 13:51:29 | 显示全部楼层
这个设计太牛掰了!
回复 支持 反对

使用道具 举报

发表于 2023-1-7 14:03:29 | 显示全部楼层
你够狠,但是估计燃气公司会把你这个,认成非法设备,哈哈哈。
回复 支持 反对

使用道具 举报

发表于 2023-1-7 15:08:00 | 显示全部楼层
很牛叉的感觉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-7 15:16:50 | 显示全部楼层
全利88 发表于 2023-1-7 14:03
你够狠,但是估计燃气公司会把你这个,认成非法设备,哈哈哈。

可没做什么坏事, 只是在热电偶电磁阀上串接个时间控制而已, 没改电没动气, 连电池都是外加的
回复 支持 反对

使用道具 举报

发表于 2023-1-7 15:17:38 | 显示全部楼层
软硬结合,涉及不错。
回复 支持 反对

使用道具 举报

发表于 2023-1-7 15:45:31 | 显示全部楼层
LC的EDA玩得很溜了哟
回复 支持 反对

使用道具 举报

发表于 2023-1-7 15:52:30 | 显示全部楼层
camell 发表于 2023-1-7 15:16
可没做什么坏事, 只是在热电偶电磁阀上串接个时间控制而已, 没改电没动气, 连电池都是外加的 ...

这个牵涉安全问题,理论上可能没有问题,但实践中间各种情况都可能出现,一定要千万注意呀。
回复 支持 反对

使用道具 举报

发表于 2023-1-7 15:55:56 | 显示全部楼层
总成本5个大洋应该不够吧。
回复 支持 反对

使用道具 举报

发表于 2023-1-7 16:02:56 | 显示全部楼层
多写俩字会累死你啊乱七八糟的不看标题都不知干了些啥~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-7 22:52:25 | 显示全部楼层
本帖最后由 camell 于 2023-1-7 23:14 编辑
fxhfxh 发表于 2023-1-7 15:55
总成本5个大洋应该不够吧。

552T用积分买的, 数码管是以前对方发错了没要求返还赞助的, 其它都是旧货, 看那个mos就知道是软包电池上卸下了的,板子jlc撸的, 实际支付真那个数, 不过自己真要全部新的,估计运费都不够
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-7 22:57:34 | 显示全部楼层
fxhfxh 发表于 2023-1-7 15:52
这个牵涉安全问题,理论上可能没有问题,但实践中间各种情况都可能出现,一定要千万注意呀。 ...

市面上带时间控制的估计都一样实现方法吧, 没见拆机贴里有人拆过这东西
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-18 08:34 , Processed in 0.156000 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表