又双叒更新同步开关状态 ,小爱同学+app+本地按键控制状.....-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: z01228

[分享] 又双叒更新同步开关状态 ,小爱同学+app+本地按键控制状.....

[复制链接]
 楼主| 发表于 2020-3-20 20:25 | 显示全部楼层
YLGZS 发表于 2020-3-19 20:32
这是我根据楼主的代码稍加更改的。加了自动配网

不错哈
 楼主| 发表于 2020-3-20 20:30 | 显示全部楼层
weiding 发表于 2020-3-20 19:40
我是想修改io2口本地开关,手放在触摸板上就是高电平,手放开就是低电平
...

用一个光耦转换一下。或者修改一下程序里的本地判断程序
发表于 2020-3-21 12:05 | 显示全部楼层
z01228 发表于 2020-3-20 20:30
用一个光耦转换一下。或者修改一下程序里的本地判断程序

程序里改哪里
 楼主| 发表于 2020-3-21 12:47 | 显示全部楼层

io2 修改成输入模式 去掉上拉。判断程序里改成高电平 触发
发表于 2020-3-21 14:13 | 显示全部楼层
z01228 发表于 2020-3-21 12:47
io2 修改成输入模式 去掉上拉。判断程序里改成高电平 触发

判断程序怎么改成高电平 触发,初学者不太懂,不好意思。麻烦了,谢谢
QQ图片20200321141034.png
发表于 2020-3-21 15:18 | 显示全部楼层
z01228 发表于 2020-3-7 12:27
你用这个试一试。我加了程序防抖。这个程序可以app+小爱+本地按键控制。状态也可以同步。

老大,我完全按这个弄的,请问小爱可以关灯,不可以开灯是怎么回事
发表于 2020-3-21 18:06 | 显示全部楼层
四路本地控制+小爱同学+配网+反馈【根据楼主代码更改+B站学习】

原理:插座多路控制。

注意:下面大多注释不正确,我太累了不想修改。不影响使用。

代码有些累赘,有大神可以的话帮忙修改一下,谢谢。


[mw_shl_code=arduino,true]/************官方按键示例程序详细注释,方便第一次看程序的。如果有错误的及时通知下修改***************
     十六进制颜色码
     (#FF0000 红色)(#FFFF00 黄色)(#FFFFFF 白色)(#0000FF 蓝色)(#00FFFF 浅蓝色)(#FFFFFF白色)
     程序特色1.app控制2.小爱控制3.状态同步4.添加本地按键
     使用的单片机是esp8266-12E,io0接继电器,开机默认(low)动作,io2接本地轻触按键(与GND接触就动作(按下轻开才动作))
     
*/
     

#define BLINKER_WIFI                    //官方wifi协议库
#define BLINKER_ESP_SMARTCONFIG         // 进行配网
#define BLINKER_MIOT_MULTI_OUTLET    //设置为小爱多个插座的模式
#define BLINKER_PRINT Serial            //串口协议库
#include <Blinker.h>                    //官方库

char auth[] = "e2b8e75b7b29";           //设备key号
//char ssid[] = "mi";                     //wifi名称
//char pswd[] = "123**780";              //wifi密码


     //灯
int kg1=14;//1 D5
int kg2=12;//2 D6
int kg3=13;//3 D7
int kg4=15;//4 D8

     //开关
int kg5=5;//1本地轻触开关,io2与gnd接时动作 D1
int kg6=4;//2  D2
int kg7=0;//3  D3
int kg8=2;//4  D4

//*******新建组件对象   设置app按键的键名
BlinkerButton Button1("btn-1");         
BlinkerButton Button2("btn-2");
BlinkerButton Button3("btn-3");
BlinkerButton Button4("btn-4");


//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
////////////////////////////////////////////////////////////////////////////1
void button1_callback(const String & state)              //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
  BLINKER_LOG("app操作了 按键1 : ", state);                //串口打印

  if (digitalRead(kg1)==HIGH) {              //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg1, LOW);
    Button1.color("#00FFFF");                     //设置app按键是深蓝色
    Button1.text("灭");
    Button1.print("off");                         //反馈回按键状态是关
  }
  else if (digitalRead(kg1)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
     digitalWrite(kg1,HIGH);
    Button1.color("#FFFF00");                  //设置app按键是浅蓝色
    Button1.text("亮");
    Button1.print("on");                      //反馈回按键状态是开
  }
}
///////////////////////////////////////////////////////////////////////////////2
void button2_callback(const String & state)              //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
  BLINKER_LOG("app操作了 按键2 : ", state);                //串口打印
  
if (digitalRead(kg2)==HIGH) {              //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg2, LOW);
    Button2.color("#00FFFF");                     //设置app按键是深蓝色
    Button2.text("灭");
    Button2.print("off");                         //反馈回按键状态是关
  }

else if (digitalRead(kg2)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
     digitalWrite(kg2,HIGH);
    Button2.color("#0000FF");                  //设置app按键是浅蓝色
    Button2.text("亮");
    Button2.print("on");                      //反馈回按键状态是开
  }
}


//////////////////////////////////////////////////////////////////////////3
void button3_callback(const String & state)              //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
  BLINKER_LOG("app操作了 按键3 : ", state);                //串口打印
  
if (digitalRead(kg3)==HIGH) {              //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg3, LOW);
    Button3.color("#00FFFF");                     //设置app按键是深蓝色
    Button3.text("灭");
    Button3.print("off");                         //反馈回按键状态是关
  }

else if (digitalRead(kg3)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
     digitalWrite(kg3,HIGH);
    Button3.color("#FF0000");                  //设置app按键是浅蓝色
    Button3.text("亮");
    Button3.print("on");                      //反馈回按键状态是开
  }
}


/////////////////////////////////////////////////////////////////////////4
void button4_callback(const String & state)              //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
  BLINKER_LOG("app操作了 按键4 : ", state);                //串口打印

if (digitalRead(kg4)==HIGH) {              //如果state是on状态
    BLINKER_LOG("灭灯!");                           //串口打印
    digitalWrite(kg4, LOW);
    Button4.color("#00FFFF");                     //设置app按键是深蓝色
    Button4.text("灭");
    Button4.print("off");                         //反馈回按键状态是关
  }
  else if (digitalRead(kg4)==LOW) {       //如果state是off状态
    BLINKER_LOG("亮灯!");                         //串口打印
     digitalWrite(kg4,HIGH);
    Button4.color("#006400");                  //设置app按键是浅蓝色
    Button4.text("亮");
    Button4.print("on");                      //反馈回按键状态是开
  }


}



void Set_Butt(int num) //on反馈
{
    if (num == 1) {
        Button1.color("#FFFF00");                  //设置app按键是浅蓝色
    Button1.text("亮");
        Button1.print("on");      
    } else if (num == 2) {
        Button2.color("#0000FF");                  //设置app按键是浅蓝色
    Button2.text("亮");
        Button2.print("on");
    } else if (num == 3) {
        Button3.color("#FF0000");                  //设置app按键是浅蓝色
    Button3.text("亮");
        Button3.print("on");
    } else if (num == 4) {
        Button4.color("#006400");                  //设置app按键是浅蓝色
    Button4.text("亮");
        Button4.print("on");
    }   
}
void Reset_Butt(int num) //off反馈
{
    if (num == 1) {
          Button1.color("#00FFFF");                     //设置app按键是深蓝色
    Button1.text("灭");
        Button1.print("off");      
    } else if (num == 2) {
          Button2.color("#00FFFF");                     //设置app按键是深蓝色
    Button2.text("灭");
        Button2.print("off");
    } else if (num == 3) {
          Button3.color("#00FFFF");                     //设置app按键是深蓝色
    Button3.text("灭");
        Button3.print("off");
    } else if (num == 4) {
          Button4.color("#00FFFF");                     //设置app按键是深蓝色
    Button4.text("灭");
        Button4.print("off");
    }   
}


//*******如果小爱有对设备进行操作就执行下面
char Port;
int Feedback = 0;
int OnorOff = 0;
void miotPowerState(const String & state, uint8_t num)     //小爱控制函数
{
  BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
  if (num == 1) {
    Feedback = 1;
    Port = kg1;        //指定每一路开关对应在开发板上的通道接口
  } else if (num == 2) {
    Feedback = 2;
    Port = kg2;
  } else if (num == 3) {
    Feedback = 3;
    Port = kg3;
  } else if (num == 4) {
    Feedback = 4;
    Port = kg4;
  }

  if (state == BLINKER_CMD_ON) {
    OnorOff = 1;
    if(num == 0)
    {
        Feedback = 5;
        digitalWrite(kg1, HIGH);
        digitalWrite(kg2, HIGH);
        digitalWrite(kg3, HIGH);
        digitalWrite(kg4, HIGH);
    }
    else
    {
        digitalWrite(Port, HIGH);
    }

    BlinkerMIOT.powerState("on", num);
    BlinkerMIOT.print();
  }
  else if (state == BLINKER_CMD_OFF) {
    OnorOff = 2;
    if(num == 0)
    {
        Feedback = 5;
        digitalWrite(kg1, LOW);
        digitalWrite(kg2, LOW);
        digitalWrite(kg3, LOW);
        digitalWrite(kg4, LOW);
    }
    else
    {
        digitalWrite(Port, LOW);
    }

    BlinkerMIOT.powerState("off", num);
    BlinkerMIOT.print();
  }
}

  //*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
  BLINKER_LOG("状态同步!");

   //////////////////////////////////////////////1
   if (digitalRead(kg1)==HIGH)
    {
      Button1.print("on");
      Button1.color("#FFFF00");              //设置app按键是浅蓝色
      Button1.text("亮");
    }
    else
    {
    Button1.print("off");
    Button1.color("#00FFFF");              //设置app按键是深蓝色
    Button1.text("灭");
    }
////////////////////////////////////////////////2
if (digitalRead(kg2)==HIGH)
    {
      Button2.print("on");
      Button2.color("#0000FF");              //设置app按键是浅蓝色
      Button2.text("亮");
    }
    else
    {
    Button2.print("off");
    Button2.color("#00FFFF");              //设置app按键是深蓝色
    Button2.text("灭");
    }
//////////////////////////////////////////////////3

if (digitalRead(kg3)==HIGH)
    {
      Button3.print("on");
      Button3.color("#FF0000");              //设置app按键是浅蓝色
      Button3.text("亮");
    }
    else
    {
    Button3.print("off");
    Button3.color("#00FFFF");              //设置app按键是深蓝色
    Button3.text("灭");
    }


//////////////////////////////////////////4

    if (digitalRead(kg4)==HIGH)
    {
      Button4.print("on");
      Button4.color("#006400");              //设置app按键是浅蓝色
      Button4.text("亮");
    }
    else
    {
    Button4.print("off");
    Button4.color("#00FFFF");              //设置app按键是深蓝色
    Button4.text("灭");
    }

   
   
}

   
      ///如果本地开关有动作执行下面手动模式
void sdms(){

  //////////////////////////////////////////////////////////////
if (digitalRead(kg1)==LOW&&digitalRead(kg5)==LOW) {
    Blinker.delay(150);  //延时150ms不能太少标准按键成功率
    if (digitalRead(kg5)==HIGH){               
        BLINKER_LOG("本地开关1");      
        BLINKER_LOG("亮灯!");                         //串口打印
        digitalWrite(kg1,HIGH);
        Button1.color("#FFFF00");                  //设置app按键是浅蓝色
        Button1.text("亮");
        Button1.print("on");
        }
}
if (digitalRead(kg1)==HIGH&&digitalRead(kg5)==LOW) {              
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg5)==HIGH){
        BLINKER_LOG("本地开关1");
        BLINKER_LOG("灭灯!");                           //串口打印
        digitalWrite(kg1, LOW);
        Button1.color("#00FFFF");                     //设置app按键是深蓝色
        Button1.text("灭");
        Button1.print("off");
        }
}
////////////////////////////////////////////////////////////////////////////

if (digitalRead(kg2)==LOW&&digitalRead(kg6)==LOW) {
    Blinker.delay(150);  //延时150ms不能太少标准按键成功率
    if (digitalRead(kg6)==HIGH){               
        BLINKER_LOG("本地开关2");      
        BLINKER_LOG("亮灯!");                         //串口打印
        digitalWrite(kg2,HIGH);
        Button2.color("#0000FF");                  //设置app按键是浅蓝色
        Button2.text("亮");
        Button2.print("on");
        }
}
if (digitalRead(kg2)==HIGH&&digitalRead(kg6)==LOW) {              
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg6)==HIGH){
        BLINKER_LOG("本地开关2");
        BLINKER_LOG("灭灯!");                           //串口打印
        digitalWrite(kg2, LOW);
        Button2.color("#00FFFF");                     //设置app按键是深蓝色
        Button2.text("灭");
        Button2.print("off");
        }
}
///////////////////////////////////////////////////////////

if (digitalRead(kg3)==LOW&&digitalRead(kg7)==LOW) {
    Blinker.delay(150);  //延时150ms不能太少标准按键成功率
    if (digitalRead(kg7)==HIGH){               
        BLINKER_LOG("本地开关3");      
        BLINKER_LOG("亮灯!");                         //串口打印
        digitalWrite(kg3,HIGH);
        Button3.color("#FF0000");                  //设置app按键是浅蓝色
        Button3.text("亮");
        Button3.print("on");
        }
}
if (digitalRead(kg3)==HIGH&&digitalRead(kg7)==LOW) {              
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg7)==HIGH){
        BLINKER_LOG("本地开关3");
        BLINKER_LOG("灭灯!");                           //串口打印
        digitalWrite(kg3, LOW);
        Button3.color("#00FFFF");                     //设置app按键是深蓝色
        Button3.text("灭");
        Button3.print("off");
        }
}
/////////////////////////////////////////////////////
if (digitalRead(kg4)==LOW&&digitalRead(kg8)==LOW) {
    Blinker.delay(150);  //延时150ms不能太少标准按键成功率
    if (digitalRead(kg8)==HIGH){               
        BLINKER_LOG("本地开关4");      
        BLINKER_LOG("亮灯!");                         //串口打印
        digitalWrite(kg4,HIGH);
        Button4.color("#006400");                  //设置app按键是浅蓝色
        Button4.text("亮");
        Button4.print("on");
        }
}
if (digitalRead(kg4)==HIGH&&digitalRead(kg8)==LOW) {              
    Blinker.delay(150); //延时150ms不能太少标准按键成功率
    if (digitalRead(kg8)==HIGH){
        BLINKER_LOG("本地开关4");
        BLINKER_LOG("灭灯!");                           //串口打印
        digitalWrite(kg4, LOW);
        Button4.color("#00FFFF");                     //设置app按键是深蓝色
        Button4.text("灭");
        Button4.print("off");
        }
}




}



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

  // 初始化有LED的IO
  
  pinMode(kg1, OUTPUT);
  digitalWrite(kg1, LOW);              //默认上电是开  LOW 时的是断开继电器。
  pinMode(kg5,INPUT_PULLUP);         //输入上拉
  ///////////////////////////////////////////
  pinMode(kg2, OUTPUT);
  digitalWrite(kg2, LOW);              //默认上电是开  LOW 时的是断开继电器。
  pinMode(kg6,INPUT_PULLUP);         //输入上拉
  ////////////////////////////////
    pinMode(kg3, OUTPUT);
  digitalWrite(kg3, LOW);              //默认上电是开  LOW 时的是断开继电器。
  pinMode(kg7,INPUT_PULLUP);         //输入上拉
  ////////////////////////////////////
    pinMode(kg4, OUTPUT);
  digitalWrite(kg4, LOW);              //默认上电是开  LOW 时的是断开继电器。
  pinMode(kg8,INPUT_PULLUP);         //输入上拉





  
  
  // 初始化blinker
  Blinker.begin(auth);//, ssid, pswd
  
  Button1.attach(button1_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
  Button2.attach(button2_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
  Button3.attach(button3_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
    Button4.attach(button4_callback);   //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
   
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
  Blinker.attachHeartbeat(heartbeat);            //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
}


int i=0;
long F_time = 0;
int count=0;


void loop() {
  sdms();//本地开关手动模式函数
  Blinker.run();

if(OnorOff == 0)
    {
      
    }
    else if(OnorOff == 1)//如果是ON状态
    {
        delay(1000);
        if(Feedback < 5)//小于5 是单独控制 1-4
        {
            Set_Butt(Feedback);//反馈1-4
            OnorOff = 0;
        }else if(Feedback == 5)//等于5 是打开所有然后1.2s每个的速度反馈所有
        {
            if(millis() - F_time >=0)
            {
                 F_time = millis();
                 i++;
                 Set_Butt(i);
                 i%=4;
                 if(i == 0) //当所有状态反馈完毕则退出
                 {
                     Feedback = 0;
                     OnorOff = 0;
                 }
            }   
        }
    }
    else if(OnorOff == 2)
    {
        delay(1000);
        if(Feedback < 5)//小于5 是单独控制 1-4
        {
            Reset_Butt(Feedback);//反馈1-4
            OnorOff = 0;
        }else if(Feedback == 5)//等于5 是 关闭 所有然后1.2s每个的速度反馈所有
        {
            if(millis() - F_time >=0)
            {
                 F_time = millis();
                 i++;
                 Reset_Butt(i);
                 i%=4;
                 if(i == 0) //当所有状态反馈完毕则退出
                 {
                     Feedback = 0;
                     OnorOff = 0;
                 }
            }   
        }
    }


}[/mw_shl_code]



手机界面代码:

{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨¨assets/img/bg/f2.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-lightbulb-on¨¨mode¨Ê¨t0¨´1´¨t1¨¨文本2¨¨bg¨É¨cols¨Í¨rows¨Í¨key¨¨btn-1¨´x´É´y´Ñ¨speech¨|÷¨lstyle¨Ë}{ßAßBßCßDßEÊßF´2´ßGßHßIÉßJÍßKÍßL¨btn-2¨´x´Í´y´ÑßN|÷ßOË}{ßAßBßCßDßEÊßF´3´ßGßHßIÉßJÍßKÍßL¨btn-3¨´x´É´y´¤CßN|÷ßOË}{ßAßBßCßDßEÊßF´4´ßGßHßIÉßJÍßKÍßL¨btn-4¨´x´Í´y´¤CßN|÷ßOË}{ßA¨deb¨ßEÊßIÉßJÑßKÍßL¨debug¨´x´É´y´ÉßN|÷ßOÊ}÷¨actions¨|÷¨triggers¨|÷}
 楼主| 发表于 2020-3-22 08:55 | 显示全部楼层
涟水河 发表于 2020-3-21 15:18
老大,我完全按这个弄的,请问小爱可以关灯,不可以开灯是怎么回事

你看看本地的开关是什么状态,应该的它的问题 我是低电平 触发的
 楼主| 发表于 2020-3-22 09:08 | 显示全部楼层
weiding 发表于 2020-3-21 14:13
判断程序怎么改成高电平 触发,初学者不太懂,不好意思。麻烦了,谢谢
...

如果程序修改成高电平触发存在 不稳定性:我的建议还是最好加一个光耦进行电平转换
发表于 2020-3-22 09:44 | 显示全部楼层
z01228 发表于 2020-3-22 09:08
如果程序修改成高电平触发存在 不稳定性:我的建议还是最好加一个光耦进行电平转换 ...

好的,那程序怎么改??
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 01:53 , Processed in 0.098487 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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