8266四路插座+本地开关+wifimanager配网+小爱同学-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2593|回复: 5

[分享] 8266四路插座+本地开关+wifimanager配网+小爱同学

[复制链接]
发表于 2022-2-25 00:11 | 显示全部楼层 |阅读模式
    根据群内分享改编的,四路输出四个物理按键开关,支持小爱同学控制,小爱控制可以统一开关,就是小爱的语言操作怪怪的,设备名开关为总开关,设备名+插孔一、二、三、四可以单独操作,app和按键没有增加总开关功能,需要独立开关,继电器为低
电平触发,开关也是低电平触发,app页面没有特殊处理就是简单的开关,想进一步美化自己改吧。

  1. {¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨deb¨¨mode¨É¨bg¨É¨cols¨Ñ¨rows¨Ì¨key¨¨debug¨´x´É´y´É}{ßA¨btn¨¨ico¨¨fad fa-lightbulb-on¨ßCʨt0¨¨继电器1¨¨t1¨¨文本2¨ßDÉßEÍßFÍßG¨btn-on1¨´x´É´y´Í¨speech¨|÷¨lstyle¨Ë¨clr¨¨#FBA613¨}{ßAßIßJßKßCÊßL¨继电器2¨ßNßOßDÉßEÍßFÍßG¨btn-on2¨´x´Í´y´ÍßQ|÷ßRËßS¨#076EEF¨}{ßAßIßJßKßCÊßL¨继电器3¨ßNßOßDÉßEÍßFÍßG¨btn-on3¨´x´É´y´ÑßQ|÷ßRËßS¨#00A90C¨}{ßAßIßJßKßCÊßL¨继电器4¨ßNßOßDÉßEÍßFÍßG¨btn-on4¨´x´Í´y´ÑßQ|÷ßRËßS¨#EA0909¨}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßf¨source_zh¨¨开关状态¨¨state¨|ßhßj÷¨state_zh¨|¨打开¨¨关闭¨÷}÷}
复制代码
页面配置,下面直接上代码
  1. //参考点灯社区GuoFuqiang与284003505两位网友的代码
  2. //

  3. //#define BLINKER_MIOT_LIGHT              //小爱库灯光
  4. #define BLINKER_MIOT_MULTI_OUTLET       //小爱插座
  5. #define BLINKER_WIFI                    //WiFi
  6. #define BLINKER_PRINT Serial            //串口协议
  7. #include <WiFiManager.h>                //wifimanager库自动配网库
  8. #include <Blinker.h>                    //点灯库

  9. char auth[] = "*************";//点灯科技app里的key
  10. //char ssid[] = "不需要";//wifi名字
  11. //char pswd[] = "不需要";//wifi密码

  12. // 新建组件对象
  13. BlinkerButton ButtonOn1("btn-on1");//按键的名称 开灯
  14. BlinkerButton ButtonOn2("btn-on2");//按键的名称 开灯
  15. BlinkerButton ButtonOn3("btn-on3");//按键的名称 开灯
  16. BlinkerButton ButtonOn4("btn-on4");//按键的名称 开灯

  17. int counter = 0;

  18. int GPIO1=16;//定义GPIO1口用于控制继电器
  19. int GPIO2=14;//定义GPIO2口用于控制继电器
  20. int GPIO3=12;//定义GPIO3口用于控制继电器
  21. int GPIO4=13;//定义GPIO4口用于控制继电器

  22. int KEY1=5;//遥控按键1定义高电平有效
  23. int KEY2=4;//遥控按键2定义高电平有效
  24. int KEY3=0;//遥控按键3定义高电平有效
  25. int KEY4=2;//遥控按键4定义高电平有效

  26. //定义插座状态,用于小爱同学状态反馈
  27. bool oState[5] = { false };
  28. #define OUTLET_ALL   0  //所有插孔
  29. #define OUTLET_NO_1  1  //插座插孔一
  30. #define OUTLET_NO_2  2  //插座插孔二
  31. #define OUTLET_NO_3  3  //插座插孔三
  32. #define OUTLET_NO_4  4  //插座插孔四


  33. int gpiobj1,gpiobj2,gpiobj3,gpiobj4;
  34. //使用web配置网络
  35. WiFiManager wifiManager;
  36. char devname[] = "ESP8266-4p";   //定义WIFI名称和主机名
  37. void WebConfig() {
  38.   Serial.println("Entered config mode...");
  39.   // 自动连接WiFi,参数是连接ESP8266时的WiFi名称
  40.   wifiManager.setConfigPortalTimeout(60);  //设置连接超时时间60s
  41.   wifiManager.autoConnect(devname);
  42.   WiFi.hostname(devname);  //设置主机名
  43.   // WiFi连接成功后将通过串口监视器输出连接成功信息
  44.   Serial.println("");
  45.     Serial.print("ESP8266 Connected to ");
  46.     Serial.println(WiFi.SSID());              // WiFi名称
  47.     Serial.print("IP address:\t");
  48.     Serial.println(WiFi.localIP());           // IP
  49. }

  50. // 按下按键1即会执行该函数
  51. void button1_callback(const String & state) {
  52.   if (state == "on") {
  53.     BLINKER_LOG("get button state: 开灯");
  54.     Blinker.print("switch", "on");
  55.     digitalWrite(GPIO1, HIGH);
  56.     delay(200);
  57.     ButtonOn1.color("red");                  //设置app按键是红色
  58.     ButtonOn1.print("on");
  59.    
  60.     gpiobj1=HIGH;
  61.   }

  62.   if (state == "off") {
  63.     BLINKER_LOG("get button state: 关灯");
  64.     digitalWrite(GPIO1, LOW);
  65.     delay(200);
  66.      // 反馈开关状态
  67.      ButtonOn1.color("gray");                     //设置app按键是灰色
  68.      ButtonOn1.print("off");
  69.      gpiobj1=LOW;
  70.   }
  71.   Blinker.vibrate();
  72. }
  73. // 按下按键2即会执行该函数
  74. void button2_callback(const String & state) {
  75.   if (state == "on") {
  76.     BLINKER_LOG("get button state: 开灯");
  77.     Blinker.print("switch", "on");
  78.     digitalWrite(GPIO2, HIGH);
  79.     delay(200);
  80.     ButtonOn2.color("red");                  //设置app按键是红色
  81.     ButtonOn2.print("on");
  82.     gpiobj2=HIGH;
  83.   }

  84.   if (state == "off") {
  85.     BLINKER_LOG("get button state: 关灯");
  86.     digitalWrite(GPIO2, LOW);
  87.     delay(200);
  88.      // 反馈开关状态
  89.      ButtonOn2.color("gray");                     //设置app按键是灰色
  90.      ButtonOn2.print("off");
  91.      gpiobj2=LOW;
  92.   }
  93.   Blinker.vibrate();
  94. }
  95. // 按下按键3即会执行该函数
  96. void button3_callback(const String & state) {
  97.   if (state == "on") {
  98.     BLINKER_LOG("get button state: 开灯");
  99.     Blinker.print("switch", "on");
  100.     digitalWrite(GPIO3, HIGH);
  101.     delay(200);
  102.     ButtonOn3.color("red");                  //设置app按键是红色
  103.     ButtonOn3.print("on");
  104.     gpiobj3=HIGH;
  105.   }

  106.   if (state == "off") {
  107.     BLINKER_LOG("get button state: 关灯");
  108.     digitalWrite(GPIO3, LOW);
  109.     delay(200);
  110.      // 反馈开关状态
  111.      ButtonOn3.color("gray");                     //设置app按键是灰色
  112.      ButtonOn3.print("off");
  113.      gpiobj3=LOW;
  114.   }
  115.   Blinker.vibrate();
  116. }
  117. // 按下按键4即会执行该函数
  118. void button4_callback(const String & state) {
  119.   if (state == "on") {
  120.     BLINKER_LOG("get button state: 开灯");
  121.     Blinker.print("switch", "on");
  122.     digitalWrite(GPIO4, HIGH);
  123.     delay(200);
  124.     ButtonOn4.color("red");                  //设置app按键是红色
  125.     ButtonOn4.print("on");
  126.     gpiobj4=HIGH;
  127.   }

  128.   if (state == "off") {
  129.     BLINKER_LOG("get button state: 关灯");
  130.     digitalWrite(GPIO4, LOW);
  131.     delay(200);
  132.      // 反馈开关状态
  133.      ButtonOn4.color("gray");                     //设置app按键是灰色
  134.      ButtonOn4.print("off");
  135.      gpiobj4=LOW;
  136.   }
  137.   Blinker.vibrate();
  138. }
  139. // 如果未绑定的组件被触发,则会执行其中内容
  140. void dataRead(const String & data)
  141. {
  142.   BLINKER_LOG("Blinker readString: ", data);
  143.   counter++;
  144. }

  145. ///如果本地开关有动作执行下面手动模式
  146. void sdms()
  147. {
  148.   int bj;
  149. //继电器1手动操作
  150. if (digitalRead(KEY1)==LOW||digitalRead(KEY2)==LOW||digitalRead(KEY3)==LOW||digitalRead(KEY4)==LOW)
  151.   {
  152.     if(digitalRead(KEY1)==LOW)bj=1;
  153.     else if(digitalRead(KEY2)==LOW)bj=2;
  154.     else if(digitalRead(KEY3)==LOW)bj=3;
  155.     else if(digitalRead(KEY4)==LOW)bj=4;
  156.     else{}
  157.      Blinker.delay(400);  //延时400ms,最少需150ms
  158.      
  159.      if (digitalRead(KEY1)==HIGH&&bj==1&&gpiobj1==LOW)
  160.      {            
  161.       BLINKER_LOG("本地开关动作!");      
  162.       BLINKER_LOG("继电器1开!");                         //串口打印
  163.       digitalWrite(GPIO1,HIGH);
  164.       ButtonOn1.color("blue");                  //设置app按键是蓝色
  165.       ButtonOn1.print("on");
  166.       gpiobj1=HIGH;
  167.       }
  168.       else if (digitalRead(KEY2)==HIGH&&bj==2&&gpiobj2==LOW)
  169.      {            
  170.       BLINKER_LOG("本地开关动作!");      
  171.       BLINKER_LOG("继电器2开!");                         //串口打印
  172.       digitalWrite(GPIO2,HIGH);
  173.       ButtonOn2.color("blue");                  //设置app按键是蓝色
  174.       ButtonOn2.print("on");
  175.       gpiobj2=HIGH;
  176.       }
  177.       else if (digitalRead(KEY3)==HIGH&&bj==3&&gpiobj3==LOW)
  178.      {            
  179.       BLINKER_LOG("本地开关动作!");      
  180.       BLINKER_LOG("继电器3开!");                         //串口打印
  181.       digitalWrite(GPIO3,HIGH);
  182.       ButtonOn3.color("blue");                  //设置app按键是蓝色
  183.       ButtonOn3.print("on");
  184.       gpiobj3=HIGH;
  185.       }
  186.       else if (digitalRead(KEY4)==HIGH&&bj==4&&gpiobj4==LOW)
  187.      {            
  188.       BLINKER_LOG("本地开关动作!");      
  189.       BLINKER_LOG("继电器4开!");                         //串口打印
  190.       digitalWrite(GPIO4,HIGH);
  191.       ButtonOn4.color("blue");                  //设置app按键是蓝色
  192.       ButtonOn4.print("on");
  193.       gpiobj4=HIGH;
  194.       }
  195.       else if (digitalRead(KEY1)==HIGH&&bj==1&&gpiobj1==HIGH)
  196.       {
  197.        BLINKER_LOG("本地开关动作!");
  198.        BLINKER_LOG("继电器1关!");                           //串口打印
  199.        digitalWrite(GPIO1,LOW);
  200.        ButtonOn1.color("gray");                     //设置app按键是灰色
  201.        ButtonOn1.print("off");
  202.        gpiobj1=LOW;
  203.        }
  204.        else if (digitalRead(KEY2)==HIGH&&bj==2&&gpiobj2==HIGH)
  205.       {
  206.        BLINKER_LOG("本地开关动作!");
  207.        BLINKER_LOG("继电器2关!");                           //串口打印
  208.        digitalWrite(GPIO2,LOW);
  209.        ButtonOn2.color("gray");                     //设置app按键是灰色
  210.        ButtonOn2.print("off");
  211.        gpiobj2=LOW;
  212.        }
  213.        else if (digitalRead(KEY3)==HIGH&&bj==3&&gpiobj3==HIGH)
  214.       {
  215.        BLINKER_LOG("本地开关动作!");
  216.        BLINKER_LOG("继电器3关!");                           //串口打印
  217.        digitalWrite(GPIO3,LOW);
  218.        ButtonOn3.color("gray");                     //设置app按键是灰色
  219.        ButtonOn3.print("off");
  220.        gpiobj3=LOW;
  221.        }
  222.        else if (digitalRead(KEY4)==HIGH&&bj==4&&gpiobj4==HIGH)
  223.       {
  224.        BLINKER_LOG("本地开关动作!");
  225.        BLINKER_LOG("继电器4关!");                   //串口打印
  226.        digitalWrite(GPIO4,LOW);                    //继电器操作
  227.        ButtonOn4.color("gray");                    //设置app按键是灰色
  228.        //ButtonOn4.text("继电器关闭");               //设置app按键文子
  229.        ButtonOn4.print("off");                     //返回开关状态
  230.        gpiobj4=LOW;
  231.        }
  232.        else {}
  233.    }
  234. }

  235. //小爱同学控制插座多个插孔
  236. void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
  237. {
  238.     switch (num)
  239.         {
  240.             case 0:  //所有插孔
  241.                 digitalWrite(GPIO1, io_level);//控制继电器1
  242.                 digitalWrite(GPIO2, io_level);//控制继电器2
  243.                 digitalWrite(GPIO3, io_level);//控制继电器3
  244.                 digitalWrite(GPIO4, io_level);//控制继电器4
  245.                 break;
  246.             case 1:  //插座插孔一
  247.                 digitalWrite(GPIO1, io_level);//控制继电器1
  248.                 break;
  249.             case 2:  //插座插孔二
  250.                 digitalWrite(GPIO2, io_level);//控制继电器2
  251.                 break;
  252.             case 3:  //插座插孔三
  253.                 digitalWrite(GPIO3, io_level);//控制继电器3
  254.                 break;
  255.             case 4:  //插座插孔四
  256.                 digitalWrite(GPIO4, io_level);//控制继电器4
  257.                 break;
  258.             default:
  259.                 break;
  260.         }
  261. }

  262. //小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
  263. void miotPowerState(const String & state, uint8_t num)
  264. {
  265.     BLINKER_LOG("need set outlet: ", num, ", power state: ", state);  //打印数据

  266.     if (state == BLINKER_CMD_ON)
  267.     {
  268.         ctrl_multi_outlet(num, HIGH);//打开继电器,num表示是多少路(继电器低电平出发)
  269.         BlinkerMIOT.powerState("on", num); //回馈操作状态
  270.         BlinkerMIOT.print();
  271.         //RelayState(num);    //反馈继电器状态

  272.         oState[num] = true; //状态变量赋值
  273.     }
  274.    else if (state == BLINKER_CMD_OFF)
  275.     {
  276.         ctrl_multi_outlet(num, LOW);//关闭继电器,num表示是多少路

  277.         BlinkerMIOT.powerState("off", num);
  278.         BlinkerMIOT.print();
  279.         //RelayState(num);

  280.         oState[num] = false;
  281.     }
  282. }

  283. //小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
  284. void miotQuery(int32_t queryCode,uint8_t num)
  285. {
  286.     BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);

  287.     switch (num)
  288.     {
  289.          case 0 :
  290.             BLINKER_LOG("状态:");
  291.             BlinkerMIOT.powerState(oState[1] ? "on" : "off");
  292.             BlinkerMIOT.powerState(oState[2] ? "on" : "off");
  293.             BlinkerMIOT.powerState(oState[3] ? "on" : "off");
  294.             BlinkerMIOT.powerState(oState[4] ? "on" : "off");
  295.             BlinkerMIOT.print();
  296.             break;
  297.          case 1 :
  298.             BLINKER_LOG("插孔1状态:");
  299.             BlinkerMIOT.powerState(oState[1] ? "on" : "off");
  300.             BlinkerMIOT.print();
  301.             break;
  302.          case 2 :
  303.             BLINKER_LOG("插孔2状态:");
  304.             BlinkerMIOT.powerState(oState[2] ? "on" : "off");
  305.             BlinkerMIOT.print();
  306.             break;
  307.          case 3 :
  308.             BLINKER_LOG("插孔3状态:");
  309.             BlinkerMIOT.powerState(oState[3] ? "on" : "off");
  310.             BlinkerMIOT.print();
  311.             break;
  312.          case 4 :
  313.             BLINKER_LOG("插孔4状态:");
  314.             BlinkerMIOT.powerState(oState[4] ? "on" : "off");
  315.             BlinkerMIOT.print();
  316.             break;
  317.          default :
  318.             BlinkerMIOT.powerState(oState[1] ? "on" : "off");
  319.             BlinkerMIOT.powerState(oState[2] ? "on" : "off");
  320.             BlinkerMIOT.powerState(oState[3] ? "on" : "off");
  321.             BlinkerMIOT.powerState(oState[4] ? "on" : "off");
  322.             BlinkerMIOT.print();
  323.             break;
  324.     }
  325. }


  326. void setup() {
  327.   
  328.   Serial.begin(115200);   // 初始化串口
  329.   pinMode(GPIO1,OUTPUT);   //继电器1初始化为输出模式
  330.   pinMode(GPIO2,OUTPUT);   //继电器2初始化为输出状态
  331.   pinMode(GPIO3,OUTPUT);   //继电器3初始化为输出状态
  332.   pinMode(GPIO4,OUTPUT);   //继电器4初始化为输出模式
  333.   pinMode(KEY1,INPUT_PULLUP);    //LED_G初始化为输出状态
  334.   pinMode(KEY2,INPUT_PULLUP);    //LED_G初始化为输出状态
  335.   pinMode(KEY3,INPUT_PULLUP);    //LED_G初始化为输出状态
  336.   pinMode(KEY4,INPUT_PULLUP);    //LED_G初始化为输出状态
  337.   digitalWrite(GPIO1,LOW); //初始化,由于继电器是低电平触发。所以刚开始设为高电平
  338.   digitalWrite(GPIO2,LOW);//初始化,由于LED_R是低电平触发。所以刚开始设为高电平
  339.   digitalWrite(GPIO3,LOW);//初始化,由于LED_G是低电平触发。所以刚开始设为高电平
  340.   digitalWrite(GPIO4,LOW); //初始化,由于继电器是低电平触发。所以刚开始设为高电平
  341.   BLINKER_DEBUG.stream(Serial);
  342.   BLINKER_DEBUG.debugAll();

  343.   // 初始化blinker
  344.   //Blinker.begin(auth, ssid, pswd);
  345.   WebConfig();  //AP配置网络  
  346.   Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str()); //初始化blinker
  347.   Blinker.attachData(dataRead);      //状态回调
  348.   ButtonOn1.attach(button1_callback); //APP回调函数
  349.   ButtonOn2.attach(button2_callback); //APP回调函数
  350.   ButtonOn3.attach(button3_callback); //APP回调函数
  351.   ButtonOn4.attach(button4_callback); //APP回调函数

  352.     //小爱同学注册回调
  353.     BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱电源回调
  354.     BlinkerMIOT.attachQuery(miotQuery);           //小爱设备查询的回调函数
  355.   
  356.    // BlinkerMIOT.attachPowerState(miotPowerState);//这段代码一定要加,不加小爱同学控制不了,务必在回调函数中反馈该控制状态
  357. }

  358. void loop() {
  359.   Blinker.run();
  360.   sdms();//本地开关扫描
  361. }
复制代码
代码一般有那可以改进望大神指点

app

app
发表于 2022-2-25 09:46 | 显示全部楼层
哇,这个好棒
发表于 2022-2-28 06:55 | 显示全部楼层
学习了,谢谢!
发表于 2022-3-5 17:41 | 显示全部楼层
必须顶一下,装着我好像看的懂的样子
发表于 2022-5-18 13:40 | 显示全部楼层
第一次刷进去代码 还有热点设置,第二次刷进去没热点了。也不知道咋回事,真神奇!
发表于 2022-6-11 23:28 | 显示全部楼层
小爱APP里可以自定义每个插座的名称
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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