改造家里的开关成为智能开关,保留原有开关控制,零火版,基础入门(一)

改造家里的开关成为智能开关,保留原有开关控制,零火版,基础入门(一)

亮点

  1. 成本不超20块,这可能是目前能找到的最便宜方案了吧。
  2. 体积较小,可以塞入86开关面板内。
  3. 手机app+智能音箱+物理开关控制,状态能同步。
  4. 接入点灯科技平台,支持wifi配网,包括blinker 设备密钥。
  5. 入手门槛大大降低,有电工基础,会接入线就行。

过程1,下载固件和wifi配置网

过程2,接线

过程3,改造过程

过程4,最后效果

点动式物理开关演示

器材

需要的器件如下,
在这里插入图片描述
在这里插入图片描述

接线

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

手机app端,Blinker设置

1,下载客户端

https://diandeng.tech/doc/app-download, 下载其app, 按注册blinker账号,获取密钥authkey,iOS 在app store 搜索blinker 安装

在这里插入图片描述

2,注册账号

在这里插入图片描述

3,创建设备

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
到这一步,我们拿到设备的密钥,请记录下来,后面要用!!!!

为设备增加一个按钮, 按键设置如下图
在这里插入图片描述

在这里插入图片描述

固件下载

1,下载网盘工具包

链接:https://pan.baidu.com/s/1LU4XkcYnH83GNsA61ywFqw 提取码:681i 复制这段内容后打开百度网盘手机App,操作更方便哦
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2,烧写固件

把esp8266插在烧写器上,然后插入电脑的usb口,如下
在这里插入图片描述
运行NdoeMcu-pyFlasher-4.0-xx.exe开始下载固件到esp8266
在这里插入图片描述

配置wifi上网

1, 重启esp-01
在这里插入图片描述
在这里插入图片描述
用手机连接到esp8266的wifi热点,热点名不是根据型号会不一样,多半以esp-xxx开头

在这里插入图片描述
在这里插入图片描述
在电脑的浏览器打开http://192.168.4.1
在这里插入图片描述
选择要配置的wifi,点击
在这里插入图片描述
2,输入密码和点灯科技创建的设备ID
在这里插入图片描述
3,点确定开始配网
在这里插入图片描述
成功后

在这里插入图片描述
手机端
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接入小爱同学配置

1、在手机上安装米家,小米音箱app.
2、在米家APP上添加点灯科技的扩展。

在这里插入图片描述
3,从小爱音箱APP上查看有没有找到设备
在这里插入图片描述

1、如果发现在设备,就说明配置成功了,我这里设备名叫“新的设备”,现在可以对小爱说 “打开新的设备”
2、你还可以添加小爱学习
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

接入小度配置

代码已经支持,作者还没来得及测试,参考小爱同学配置一下

接入天猫精灵配置

代码已经支持,作者还没来得及测试,参考小爱同学配置一下

接入siri配置

1,安装“快捷指令”app,点击打开

在这里插入图片描述
在这里插入图片描述
点运行按钮测试一下开关,passwd是123456

出现下图结果,说明接口调用成功了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在对着siri说,“打开台灯”“关闭台灯”

代码

/*
NodeMcu或esp-01/01s控制1路继电器,集成blinker平台,
用手机app控制1路继电器开关,添加一路物理开关控制,继电器用常开(NO)模式
 
v1.0
Created 2021
by 阳阳学编程
www.sooncore.com
抖音号:yyxbc2010
微信号:yyxbc2010

固件有网页配网功能,固件烧写工具:
链接:https://pan.baidu.com/s/1WsE_2gERyjaUZFbwgJnsOw 提取码:56r8 

说明:

1,继电器高电平触发时,YYXBC_HIGH = 1,YYXBC_LOW  = 0
继电器低电平触发时,YYXBC_HIGH = 0,YYXBC_LOW  = 1
const int YYXBC_HIGH = 0 ;
const int YYXBC_LOW  = 1 ;

2,用esp-01时,物理开关接在vcc 和gpio2上,继电器接在gpio0上
用nodeMcu时,物理开关接在vcc 和D4上,继电器接在D3上,下面的宏
定义只能同时有一个生效

//NodeMCU 继电器接D3,物理开关接D4
#define LED_BUILTIN_LIGHT 0
#define LED_BUILTIN_K2 2

//Esp-01/01s,继电器接GPIO0,物理开关接GPIO2
//#define LED_BUILTIN_LIGHT D3
//#define LED_BUILTIN_K2 D4

3,YYXBC_BUTTON_TYPE = 1时表示物理开关为点动模式,0时表示自锁模式
const int YYXBC_BUTTON_TYPE = 1;

获得具体连接电路图和更多资源,请参阅阳阳学编程网站 www.sooncore.com。
   
This example code is in the public domain.
*/

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET              // 设置小爱灯类库
#define BLINKER_DUEROS_OUTLET            // 设置小度灯类库
#define BLINKER_ALIGENIE_OUTLET          // 设置天猫灯类库

#define BLINKER_WITHOUT_SSL              //使用这个宏,表示不用SSL加密,可以得到更多内存

//
如果要使用apconfig配网模式,打开注释掉,加让这行代码生效
//#define BLINKER_APCONFIG

如果要使用smartconfig配网模式,打开注释掉,加让这行代码生效
//#define BLINKER_ESP_SMARTCONFIG

#include <Blinker.h>
#include <ESP8266WebServer.h>

char auth[] = "a7a437131912";
char ssid[] = "panzujiMi10";
char pswd[] = "moto1984";

String version  = "1.0.3";

//NodeMCU 继电器接D3,物理开关接D4
#define LED_BUILTIN_LIGHT 0
#define LED_BUILTIN_K2 2

//Esp-01/01s,继电器接GPIO0,物理开关接GPIO2
//#define LED_BUILTIN_LIGHT D3
//#define LED_BUILTIN_K2 D4

/***
 * 继电器高电平触发时,YYXBC_HIGH = 1,YYXBC_LOW  = 0
 * 继电器低电平触发时,YYXBC_HIGH = 0,YYXBC_LOW  = 1
 */
const int YYXBC_HIGH = 0 ;
const int YYXBC_LOW  = 1 ;

/***
 * 物理开关点动模式1,自锁模式0
 */
const int YYXBC_BUTTON_TYPE = 0;

//http接口请求密码
String httppswd = "123456";

bool oDuerState = YYXBC_LOW;
bool oMioState = YYXBC_LOW;
bool oAligenieState = YYXBC_LOW;

// 新建组件对象
BlinkerButton Button1("btn-abc");

//webserver for siri
static ESP8266WebServer esp8266_server(80);

//心跳回调
void heartbeat()
{
   BLINKER_LOG("heartbeat,state: ", digitalRead(LED_BUILTIN));

    //较正app的按钮状态
    if(YYXBC_HIGH == digitalRead(LED_BUILTIN_LIGHT) ){
        Button1.print("on");
    }else{
       Button1.print("off");
    }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//*******如果是手机app 有对设备进行操作就执行下面

void button1_callback(const String & state)
{
    BLINKER_LOG("button1_callback get button state: ", state);

    if (state == BLINKER_CMD_ON) {
        BLINKER_LOG("Toggle on!");
        Button1.print("on");
        digitalWrite(LED_BUILTIN_LIGHT, YYXBC_HIGH);
        oDuerState = YYXBC_HIGH;
        oMioState =YYXBC_HIGH;
        oAligenieState = YYXBC_HIGH;
    }
    else if (state == BLINKER_CMD_OFF) {
        BLINKER_LOG("Toggle off!");
        Button1.print("off");
        digitalWrite(LED_BUILTIN_LIGHT, YYXBC_LOW);
        oDuerState = YYXBC_LOW;
        oMioState = YYXBC_LOW;
        oAligenieState = YYXBC_LOW;
    }
    BlinkerDuerOS.powerState(oDuerState == YYXBC_HIGH ? "on" : "off");
    BlinkerDuerOS.report();
    BlinkerMIOT.powerState(oMioState == YYXBC_HIGH ? "on" : "off");
    BlinkerMIOT.print();
    BlinkerAliGenie.powerState(oAligenieState == YYXBC_HIGH ? "on" : "off");
    BlinkerAliGenie.print(); 
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//*******如果小度 有对设备进行操作就执行下面
void duerPowerState(const String & state)
{
    BLINKER_LOG("duerPowerState need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
       button1_callback(BLINKER_CMD_ON);
    }
    else if (state == BLINKER_CMD_OFF) {
      button1_callback(BLINKER_CMD_OFF);
    }
}

void duerQuery(int32_t queryCode)
{
    BLINKER_LOG("DuerOS Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :        
            BLINKER_LOG("DuerOS Query power state");
            BlinkerDuerOS.powerState(oDuerState == YYXBC_HIGH? "on" : "off");
            BlinkerDuerOS.print();
            break;
        case BLINKER_CMD_QUERY_TIME_NUMBER :
            BLINKER_LOG("DuerOS Query time");
            BlinkerDuerOS.time(millis());
            BlinkerDuerOS.print();
            break;
        default :
            BlinkerDuerOS.powerState(oDuerState == YYXBC_HIGH? "on" : "off");
            BlinkerDuerOS.print();
            break;
    }
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
    BLINKER_LOG("miotPowerState need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
       button1_callback(BLINKER_CMD_ON);
    }
    else if (state == BLINKER_CMD_OFF) {
      button1_callback(BLINKER_CMD_OFF);
    }
}

void miotQuery(int32_t queryCode)
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_ALL_NUMBER :
          BLINKER_LOG("MIOT Query All");
          BlinkerMIOT.powerState(oMioState == YYXBC_HIGH? "on" : "off");
          BlinkerMIOT.print();
          break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
          BLINKER_LOG("MIOT Query Power State");
          BlinkerMIOT.powerState(oMioState ==YYXBC_HIGH ? "on" : "off");
          BlinkerMIOT.print();
          break;
      default :
          BlinkerMIOT.powerState(oMioState ==YYXBC_HIGH ? "on" : "off");
          BlinkerMIOT.print();
          break;
    }
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//*******如果天猫精灵有对设备进行操作就执行下面
void aligeniePowerState(const String & state)
{
    BLINKER_LOG("aligeniePowerState need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
       button1_callback(BLINKER_CMD_ON);
    }
    else if (state == BLINKER_CMD_OFF) {
      button1_callback(BLINKER_CMD_OFF);
    }
}

void aligenieQuery(int32_t queryCode)
{
    BLINKER_LOG("AliGenie Query codes: ", queryCode);

    switch (queryCode)
    {
      case BLINKER_CMD_QUERY_ALL_NUMBER :
          BLINKER_LOG("AliGenie Query All");
          BlinkerAliGenie.powerState(oAligenieState == YYXBC_HIGH? "on" : "off");
          BlinkerAliGenie.print();
          break;
      case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
          BLINKER_LOG("AliGenie Query Power State");
          BlinkerAliGenie.powerState(oAligenieState == YYXBC_HIGH? "on" : "off");
          BlinkerAliGenie.print();
          break;
      default :
          BlinkerAliGenie.powerState(oAligenieState == YYXBC_HIGH ? "on" : "off");
          BlinkerAliGenie.print();
          break;
    }
}

void dataRead(const String & data){
  BLINKER_LOG("Blinker readString: ", data);

  Blinker.vibrate();
  
  uint32_t BlinkerTime = millis();
  
  Blinker.print("millis", BlinkerTime);

}

void setup() {
    // 初始化串口
    Serial.begin(115200);

    #if defined(BLINKER_PRINT)
        BLINKER_DEBUG.stream(BLINKER_PRINT);
    #endif

//        //debug 命令
//    BLINKER_DEBUG.stream(BLINKER_PRINT);
//    BLINKER_DEBUG.debugAll();

    // 初始化有LED的IO
    pinMode(LED_BUILTIN_LIGHT, OUTPUT);
    digitalWrite(LED_BUILTIN_LIGHT, YYXBC_LOW);
    
    pinMode(LED_BUILTIN_K2, OUTPUT);
//    digitalWrite(LED_BUILTIN_K2, LOW);
    
 #if (defined(BLINKER_APCONFIG)) || (defined(BLINKER_ESP_SMARTCONFIG))
     //启动配网模式用这行代码
    Blinker.begin(auth);
 #else 
    Blinker.begin(auth, ssid, pswd);
 #endif
 
    Blinker.attachData(dataRead);

    BlinkerDuerOS.attachPowerState(duerPowerState); //小度语音操作注册函数
    BlinkerDuerOS.attachQuery(duerQuery);

    BlinkerMIOT.attachPowerState(miotPowerState);//小爱语音操作注册函数
    BlinkerMIOT.attachQuery(miotQuery);

    BlinkerAliGenie.attachPowerState(aligeniePowerState);//天猫语音操作注册函数
    BlinkerAliGenie.attachQuery(aligenieQuery);     
  
    Button1.attach(button1_callback);
    //注册回调函数
    Blinker.attachHeartbeat(heartbeat);
    
    //启动webserver ,提供接口给siri用
    esp8266_server.on("/", handleRoot); 
    esp8266_server.on("/post", handleSetConfig);           
    esp8266_server.onNotFound(handleNotFound);  
    esp8266_server.begin();                  
      
    Serial.println("HTTP esp8266_server started");
}

void loop() {

    static int lastms = 0;
    if (millis()-lastms > 10000) {
      lastms = millis();
      Serial.printf(PSTR("Running (%s),state(%s),version %s for %d Free mem=%d\n"),
          WiFi.localIP().toString().c_str(),
          oAligenieState == YYXBC_HIGH  ? "YYXBC_HIGH" : "CLOES",
          version.c_str(), lastms/1000, ESP.getFreeHeap());
    }
    
    Blinker.run();//运行Blinker
    esp8266_server.handleClient();// 处理http服务器访问
    
    //检查物理开关状态
    if(YYXBC_BUTTON_TYPE == 1){
       btnHandler1();
    }else{
       btnHandler2();
    }
   
}


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//*******如果iOS的siri有对设备进行操作就执行下面
                                                                  
void handleRoot() {   //处理网站根目录“/”的访问请求 
   String data = "<html>";
      data += "<head><title>设置</title></head>";
      data += "<body>";
      data +=" <p>ESP8266 智能开关,技术支持 微信:yyxbc2010</p><hr>";
      data +=" <p>SSID:"+ WiFi.SSID() + "</p><hr>";
      data +=" <p>PSW:"+ WiFi.psk() + "</p><hr>";
      data += "</body>";
      data += "</html>";  
      
    esp8266_server.send(200, "text/html; charset=utf-8", data);  
} 


void handleSetConfig() {   //处理来自siri的访问请求 
  if (esp8266_server.method() != HTTP_POST) {
    esp8266_server.send(405, "text/plain", "Method Not Allowed");
  } else {
//    String message = "POST form was:\n";
    String btnName,btnState,btnPswd;
    for (uint8_t i = 0; i < esp8266_server.args(); i++) {
       String name = esp8266_server.argName(i);
       if(name == "btn") {
           btnName = esp8266_server.arg(i);
       }
       else if (name == "state"){
           btnState = esp8266_server.arg(i);
       } 
       else if (name == "passwd"){
           btnPswd = esp8266_server.arg(i);
       }     
    }
    if(btnPswd != httppswd){
      String message = "{\"errcode\":0,\"msg\":\"password error\"}";  
      esp8266_server.send(200, "text/html; charset=utf-8", message);  
      return;
    }
    if(btnName.length() >0 && btnState.length() >0) {
        //开关btn-abc
        if(btnName == "btn-1"){
          if(btnState == "on"){
             button1_callback( BLINKER_CMD_ON);
          }else if (btnState == "off"){
             button1_callback( BLINKER_CMD_OFF);
          }
        }
    
    }
    String message = "{\"errcode\":0,\"msg\":\" ok\"}";  
    esp8266_server.send(200, "text/html; charset=utf-8", message); 
  }
}

// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){   
//  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += esp8266_server.uri();
  message += "\nMethod: ";
  message += (esp8266_server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += esp8266_server.args();
  message += "\n";
  for (uint8_t i = 0; i < esp8266_server.args(); i++) {
    message += " " + esp8266_server.argName(i) + ": " + esp8266_server.arg(i) + "\n";
  }
  esp8266_server.send(404, "text/plain", message);

}

//点动模式按钮,监听按钮状态,执行相应处理
void btnHandler1()
{
  static bool oButtonState = false;
  int state1 =  digitalRead(LED_BUILTIN_K2); //按钮状态
  int state2 =  digitalRead(LED_BUILTIN_LIGHT); //灯的状态
  if(state1 == HIGH )
  {
    if(oButtonState ){
      if(state2 == YYXBC_HIGH )
      { 
        button1_callback(BLINKER_CMD_OFF);
        Serial.println("按钮对灯已执行关闭");
      }else{
        button1_callback(BLINKER_CMD_ON);
        Serial.println("按钮对灯已执行打开");
      }
      oButtonState = false;
    }
  }else{
    oButtonState = true;
  }
}



//自锁模式按钮,监听按钮状态,执行相应处理
void btnHandler2()
{
 static bool is_btn = false;//按钮的标志位,用来逻辑处理对比,判断按钮有没有改变状态
  bool is = digitalRead(LED_BUILTIN_K2);   //按钮状态
  if ( is != is_btn)
  {
    bool is_led = digitalRead(LED_BUILTIN_LIGHT);
    digitalWrite(LED_BUILTIN_LIGHT, !is_led);
    if (is_led == YYXBC_HIGH)
    {
      button1_callback(BLINKER_CMD_OFF);
      Serial.println("按钮对灯已执行关闭");
    }
    else
    {
      button1_callback(BLINKER_CMD_ON);
      Serial.println("按钮对灯已执行打开");
    }
    is_btn = digitalRead(LED_BUILTIN_K2);  //更新按钮状态
  }
}

资源下载

本文章相关资源链接:https://pan.baidu.com/s/1LU4XkcYnH83GNsA61ywFqw 提取码:681i 复制这段内容后打开百度网盘手机App,操作更方便哦

QQ技术讨论群

在这里插入图片描述

关注阳阳学编程抖音号

在这里插入图片描述

  • 59
    点赞
  • 274
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
### 回答1: ESP-01S继电器是一种智能家居产品,它可以通过网络和智能设备控制家中的灯光开关。如果您想将家里的灯光开关改造智能开关保留原有开关控制,可以按照以下步骤完成。 首先,您需要准备一个ESP-01S继电器模块和一个智能插头。ESP-01S继电器模块可以通过网络控制继电器的开关智能插头则可以将继电器连接到家庭网络中,从而实现远程控制。 其次,您需要将ESP-01S继电器模块与灯光开关连接。您可以将继电器与灯光开关的电源线连接起来,并将开关线连接到继电器的IN端口,以实现远程控制。 最后,您需要通过智能设备下载和安装相应的APP,在APP中添加继电器设备,并将继电器连接到家庭网络中。这样,您就可以通过智能设备远程控制家中的灯光开关,同时保留原有开关控制方式。 总的来说,将ESP-01S继电器模块改造家里的灯光开关是一项简单又实用的智能改造,使您的家居生活更加方便舒适。 ### 回答2: ESP-01S继电器是一款非常实用的智能设备,可以通过它来改造家里的灯开关,将其变成智能开关,并且保留原有开关控制功能,这样可以让家里的照明更加便捷智能,轻松实现远程控制,提高家庭的舒适度和安全性。 改造过程需要准备ESP-01S继电器模块、杜邦线、电源适配器、电路板、LED灯等材料。首先,将ESP-01S继电器和电源适配器接线,然后将LED灯和电路板接线,接着将杜邦线连接到继电器上。 接下来,需要将改造好的智能开关原有开关串联,这样即可实现两种控制方式:智能控制和手动控制。需要注意的是,在改造过程中,应该遵循安全的操作规范,确保线路的稳定和安全。 在完成改造后,用户可以下载相应的APP,连接ESP-01S继电器模块。通过APP,可以远程控制灯的开关,也可以手动控制开关。同时,智能开关还可以通过定时开关、自动化场景等设置,实现更加智能控制。 总之,通过ESP-01S继电器的改造,可以实现家里灯的智能控制,同时保留原有的手动控制功能,使家庭照明更加便捷、高效、智能。 ### 回答3: 如果您想将家里的灯改造智能开关,并保留原有开关控制,那么使用ESP-01S继电器是个不错的选择。ESP-01S是一种基于ESP8266芯片的低成本Wi-Fi模块,可以通过WiFi控制开关。而使用继电器可以将开关信号转换为电能信号,从而控制家里的灯。 首先,您需要准备ESP-01S模块和继电器模块。然后,将两个模块分别接入电源和地线,并将继电器接到灯泡电路上。接下来,您需要完成两个任务。第一个任务是将ESP-01S模块连接到Wi-Fi网络上,这可以通过使用ESP8266程序进行编程来实现。第二个任务是编写代码,将开关控制信号传输到继电器以控制灯。 在编写代码时,您需要判断ESP-01S模块的状态,以决定何时使用原有开关控制灯泡。如果ESP-01S处于连接状态,那么您可以使用手机应用程序或者API来控制继电器。如果ESP-01S没有连接,那么当您按下原有开关时,继电器会被触发,从而控制灯泡的开关状态。 最后,需要注意的是,如果您不熟悉编程或者电路设计,需要寻找专业人士的帮助。同时,也需要注意使用安全可靠的电气设备,以保证家庭安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘祖记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值