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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2113|回复: 4

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

[复制链接]
发表于 2020-7-10 18:00 | 显示全部楼层 |阅读模式
用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[5] = { 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[num] = 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[num] = false;

        if (num == 0)
        {
            for (uint8_t o_num = 0; o_num < 5; o_num++)
            {
                oState[o_num] = 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吸合一次






现在知道该怎么修改了吧?
 楼主| 发表于 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[5] = { 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[num] = 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[num] = false;

       i=0;       j=0;

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




这样吗?
发表于 2020-7-12 19:00 | 显示全部楼层
pauc 发表于 2020-7-12 18:52
#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET

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

好的,板子改车库门了,再买个回来测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-1 05:46 , Processed in 0.071404 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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