配合Blinker的家庭灯改造-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3252|回复: 5

[分享] 配合Blinker的家庭灯改造

[复制链接]
发表于 2020-3-14 04:55 | 显示全部楼层 |阅读模式
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!危险!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!本帖需要一定动手能力和工具,且有操作220V电压的步骤,新手没把握情况下学习就好!!!!!!!!!!!!!!!!!!!!!!!!
在使用Blinker改造普通家庭灯成为可以被各种智能音箱和手机控制的IOT灯时,原来墙上的开关不想拆除想要保留,我们我们往往会遇到以下几种情况1:走一根SIG到灯座的主控又难以走过去
2:将主控代替原来的开关又难以取电,(好一点的,灯开关旁边有插孔,差一点的,灯开关只有火线和回线,单火取电一是价格偏贵,二是遇到LED灯低电流灯,会熄灭不了,遇到一些差一点的,连火线都没)
这时候该怎么办呢,这时候,有一种神奇的东西出现了,那就是这个
TIM截图20200314032629.png
随意贴 ,在淘宝上,有各种各样的随意贴,那我们买现成的,本帖完

AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
开个玩笑,淘宝上的随意贴大多数是配套使用的,买回来再改造不显示,且作为一名DIY爱好者,当然要自己做啦
这种随意贴其实原理很简单,就是一个433Mhz模块,这种模块在现实生活中很常见,像门铃,汽车遥控器,电动门遥控器等等都是用的这种模块
而且这种模块在淘宝上也是非常廉价的,本帖使用的模块分别为 灵T1 和 一个不知名的接收解码模块(为什么不使用和灵T1配到的R1 ,我在这里愤怒的点名*下 蜂鸟,没资料,官网打不开,完全一脸懵逼,工作模式 配对 删码完全一脸懵逼,手头也没有其它带编码的发射模块,凑合着用)
这两个模块配合有点问题,只有两路可以用,但对于大多数开关,基本上两路齐活了
大半夜写帖也不没客服讨要资料,只能用着先
这两个模块如下图所示
TIM截图20200314033448.png TIM截图20200314033526.png
再加两根0.18的天线和邮费 以及纽扣电池座和几根排针杜邦线就齐活了,不到10块钱搞定了
接下来开始改
对于面板开关的改法非常简单,把里面原来的两根接在一起,使用非 !!自锁!!面板将发射器和开关结合到一起

TIM截图20200314035124.png

当然,这样还要重买“昂贵”的面板,所以不如买一个触摸模块0.9块钱贴在原开关上面(纯电池,无风险),工作电流仅增加9uA
TIM截图20200314041123.png
买来后只需挑掉上面的LED即可,将VCC连接到电池正极,GND连接到GND,SIG连接到T1即可代替开关
使用电池那多久要换电池呢,咱们算一下
待机 9uA,发射19mA,(保留LED) 电池单颗CR2032 210mAh 假设按下按钮需要500ms,纯待机可用2.6年 假设每天按5次可以用一年多,然而面板剩余空间可不止一颗纽扣电池
整套模块加起来才不到指甲盖大小,使用更高容量的电池可以用更久

而对于接收器,接收器与8266安装于灯座内,电源同灯电源供应,不需要考虑电池使用
而接收器与8266连接也非常简单,就是一个“透传模块”,焊上天线,VCC接3.3V GND接GND D0 D1为开关量输出,当发射器按下相应按钮时,输出高,再加个消抖,就可以在8266上使用了(这里建议把VT也接在8266上,用于添加新的随意贴,默认拉高,当然,为了节约IO也可以不接,单独引出接开关到GND)

下列演示下Blinker代码,基于小爱排插+SmartConfig示例修改而来
!!!!!!!!!! 看清楚 是小爱 别再问 Blinker app里面的按钮怎么控制不!!!!!!!!!!!!!!!!!!!!!!
[mw_shl_code=arduino,true]#define BLINKER_WIFI
#define BLINKER_ESP_SMARTCONFIG   //启用SmartConfig
#define BLINKER_MIOT_MULTI_OUTLET //设置为小爱排插类型
#include <Blinker.h>
char auth[] = "Your Device Secret Key";
unsigned long Timers[3] = {0};
bool oState[5] = {false};

void miotPowerState(const String &state, uint8_t num) //小爱控制回调
{
  BLINKER_LOG("need set outlet: ", num, ", power state: ", state);

  if (state == BLINKER_CMD_ON)
  {
    if (num == 0)
    {
      digitalWrite(0, LOW);
      BlinkerMIOT.powerState("on", num);
      BlinkerMIOT.print();
      Timers[2] = millis();
    }
    else if (num == 1)
    {
      digitalWrite(4, HIGH);
    }
    else if (num == 2)
    {
      digitalWrite(5, HIGH);
    }
    else if (num == 3)
    {
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
    }
    BlinkerMIOT.powerState("on", num);
    BlinkerMIOT.print();

    oState[num] = true;
  }
  else if (state == BLINKER_CMD_OFF)
  {
    if (num == 1)
    {
      digitalWrite(4, LOW);
    }
    else if (num == 2)
    {
      digitalWrite(5, LOW);
    }
    else if (num == 3)
    {
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
    }
    BlinkerMIOT.powerState("off", num);
    BlinkerMIOT.print();

    oState[num] = false;
  }
}

void miotQuery(int32_t queryCode, uint8_t num) //小爱查询回调
{
  BLINKER_LOG("AliGenie Query outlet: ", num, ", codes: ", queryCode);

  switch (queryCode)
  {
  case BLINKER_CMD_QUERY_ALL_NUMBER:
    BLINKER_LOG("MIOT Query All");
    BlinkerMIOT.powerState(oState[3] ? "on" : "off", 3);
    BlinkerMIOT.print();
    break;
  case BLINKER_CMD_QUERY_POWERSTATE_NUMBER:
    BLINKER_LOG("MIOT Query Power State");
    BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
    BlinkerMIOT.print();
    break;
  default:
    BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);
    BlinkerMIOT.print();
    break;
  }
}

void setup()
{
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);
  pinMode(4, OUTPUT); //使用4 5连接灯,因为4 5上电IO没变化
  pinMode(5, OUTPUT);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  pinMode(0, OUTPUT); //使用GPIO 0 作为学习按键,两者均有上拉电阻,且没强下拉 不影响
  digitalWrite(0, HIGH);
  pinMode(14, INPUT); //使用 14 12 作为输入口,433模块默认下拉
  pinMode(12, INPUT);
  Blinker.begin(auth);
  Serial.begin(115200);
  BlinkerMIOT.attachPowerState(miotPowerState);
  BlinkerMIOT.attachQuery(miotQuery);
}

void loop()
{
  Blinker.run();
  if (millis() - Timers[0] >= 500 && digitalRead(14)) //按钮一触发
  {
    Serial.println("Button one Touch");
    digitalWrite(4, !digitalRead(4)); //翻转IO
    oState[1] == digitalRead(4);
    Timers[0] = millis();
  }
  if (millis() - Timers[1] >= 500 && digitalRead(12)) //按钮二触发
  {
    Serial.println("Button two Touch");
    digitalWrite(5, !digitalRead(5)); //翻转IO
    oState[2] == digitalRead(5);
    Timers[1] = millis();
  }
  if (!digitalRead(0) && millis() - Timers[2] >= 1000) //延时1S拉高GPIO0,不能堵塞回调
  {
    digitalWrite(0, HIGH);
    oState[0] = false;
  }
}[/mw_shl_code]
另外,可以训练小爱添加自己想要的关键词

好了,快去试试,记得有什么问题留言和我说一声



 楼主| 发表于 2020-4-9 15:29 | 显示全部楼层
admin1314 发表于 2020-4-7 19:06
你这个不接入网络?

不是有Esptouch了么
发表于 2020-3-14 10:59 | 显示全部楼层
app不用岂不是占着一个设备页面?强迫症表示把app内按键加上能物尽其用
发表于 2020-4-7 19:06 | 显示全部楼层
你这个不接入网络?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:36 , Processed in 0.113767 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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