nodemcu小爱同学怎样实现语音控制不同动作-Arduino中文社区 - Powered by Discuz! Archiver

pauc 发表于 2020-7-10 18:00

nodemcu小爱同学怎样实现语音控制不同动作

用nodemcu控制四路继电器,想实现三路双击效果,一路单击效果
代码如下

#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET

#include <Blinker.h>
BlinkerButton Button1("btn-1");
BlinkerButton Button2("btn-2");
BlinkerButton Button3("btn-3");
BlinkerButton Button4("btn-4");


char i;
char j;

char auth[] = "9b3f1ec4ae0c";
char ssid[] = "2.4G";
char pswd[] = "123456789";

bool oState = { false };

void miotPowerState(const String & state, uint8_t num)
{
    BLINKER_LOG("need set outlet: ", num, ", power state: ", state);   
    if(num==1){
      i=D1;
    }else if(num==2){
      i=D2;
    }else if(num==3){
      i=D5;
    }else if(num==4){
      j=D6;
    }

    if (state == BLINKER_CMD_ON) {      
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);
      Blinker.delay(150);
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);

      digitalWrite(j, HIGH);
      Blinker.delay(150);
      digitalWrite(j, LOW);

      BlinkerMIOT.powerState("on", num);
      BlinkerMIOT.print();

      oState = true;

    }
    else if (state == BLINKER_CMD_OFF) {
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);
      Blinker.delay(150);
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);

      digitalWrite(j, HIGH);
      Blinker.delay(150);
      digitalWrite(j, LOW);

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

      oState = false;

      if (num == 0)
      {
            for (uint8_t o_num = 0; o_num < 5; o_num++)
            {
                oState = false;
            }
      }
    }
}


手机APP操作是正常的
但是用小爱同学,通电第一次叫,每个通道都正常,可以实现123双击,4单击
第二次叫小爱同学,就会乱跳
比如说我先叫了一通道,一通道快速吸和两次,再叫四通道,一通道就会先跳两次,四通道在跳一次
通电先叫四通道,四通道正常只跳一次,在叫其他通道,四通道也会跟着跳
请问大神应该怎么去写代码

开在边缘 发表于 2020-7-10 21:53

如果num=1,那么i=什么?j=什么?
i赋值了,所以i=D1
j没有赋值,所以j还是之前的值,j=0
结果就是D1吸合两次

接着如果num=4,那么i=什么?j=什么?
i没有赋值,所以i还是之前的值,i=D1
j赋值了,所以j=D6
结果就是D1吸合两次,D6吸合一次






如果num=4,那么i=什么?j=什么?
i没有赋值,所以i还是之前的值,i=0
j赋值了,所以j=D6
结果就是D6吸合一次

接着如果num=1,那么i=什么?j=什么?
i赋值了,所以i=D1
j没有赋值,所以j还是之前的值,j=D6
结果就是D1吸合两次,D6吸合一次






现在知道该怎么修改了吧?

pauc 发表于 2020-7-12 18:52

开在边缘 发表于 2020-7-10 21:53
如果num=1,那么i=什么?j=什么?
i赋值了,所以i=D1
j没有赋值,所以j还是之前的值,j=0


#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET

#include <Blinker.h>
BlinkerButton Button1("btn-1");
BlinkerButton Button2("btn-2");
BlinkerButton Button3("btn-3");
BlinkerButton Button4("btn-4");


char i;
char j;

char auth[] = "9b3f1ec4ae0c";
char ssid[] = "2.4G";
char pswd[] = "123456789";

bool oState = { false };

void miotPowerState(const String & state, uint8_t num)
{
    BLINKER_LOG("need set outlet: ", num, ", power state: ", state);   
    if(num==1){
      i=D1;
    }else if(num==2){
      i=D2;
    }else if(num==3){
      i=D5;
    }else if(num==4){
      j=D6;
    }

    if (state == BLINKER_CMD_ON) {      
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);
      Blinker.delay(150);
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);

      digitalWrite(j, HIGH);
      Blinker.delay(150);
      digitalWrite(j, LOW);

      BlinkerMIOT.powerState("on", num);
      BlinkerMIOT.print();

      oState = true;
       i=0;       j=0;

    }
    else if (state == BLINKER_CMD_OFF) {
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);
      Blinker.delay(150);
      digitalWrite(i, HIGH);
      Blinker.delay(150);
      digitalWrite(i, LOW);

      digitalWrite(j, HIGH);
      Blinker.delay(150);
      digitalWrite(j, LOW);

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

      oState = false;

       i=0;       j=0;

      if (num == 0)
      {
            for (uint8_t o_num = 0; o_num < 5; o_num++)
            {
                oState = false;
            }
      }
    }
}




这样吗?

开在边缘 发表于 2020-7-12 19:00

pauc 发表于 2020-7-12 18:52
#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET



可以是可以,但是有一个问题。程序会对PIN 0进行电平拉高和拉低的操作,如果你不用PIN 0,问题不大,否则就会误操作。

pauc 发表于 2020-7-12 19:17

开在边缘 发表于 2020-7-12 19:00
可以是可以,但是有一个问题。程序会对PIN 0进行电平拉高和拉低的操作,如果你不用PIN 0,问题不大,否则 ...

好的,板子改车库门了,再买个回来测试
页: [1]
查看完整版本: nodemcu小爱同学怎样实现语音控制不同动作