2301_80035654 2024-04-02 08:27 采纳率: 0%
浏览 6

esp8266控制舵机开门误触发

最近突发奇想,找到了用esp8266控制宿舍开门,几番周折终于是好了,由于是非专业,代码只能是网上找,运行了一天,就发现会半夜自动开门,也不知道咋回事,怀疑代码有点问题,请各位帮忙看看

#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET
#include <Blinker.h>
#include<Servo.h>

Servo myservo;

char auth[] = "";    //手机端的key
char ssid[] = "";     //WiFi名
char pswd[] = "";     //WiFi密码

BlinkerButton Button1("btn-abc"); //开门按钮的数据键名
BlinkerNumber Number1("num-abc");

int counter = 0;

//开门
void button1_callback(const String & state)
{
  BLINKER_LOG("get button state: ", state);
  myservo.write(180);         //控制舵机旋转到180度
  delay(4500);                //延迟4500毫秒
  myservo.write(0);           //控制舵机旋转到0度
}

void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);
  counter++;
  Number1.print(counter);
}

void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        myservo.write(180);         //控制舵机旋转到180度
    
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF) {
         myservo.write(0);           //控制舵机旋转到0度

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

void setup()
{
  Serial.begin(9600);          //设置波特率为9600
  BLINKER_DEBUG.stream(Serial);
  myservo.attach(5);            //设置舵机信号输出引脚编号为5(D1)
  myservo.write(0);             //控制舵机旋转到0度

  Blinker.begin(auth, ssid, pswd);
  Blinker.attachData(dataRead);
  Button1.attach(button1_callback);
  BlinkerMIOT.attachPowerState(miotPowerState);
}

void loop() {
  Blinker.run();
}


  • 写回答

4条回答 默认 最新

  • 关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    宿舍门自动开门的问题可能是以下几个原因导致的:

    1. 不稳定的WiFi连接:如果WiFi信号不稳定或者断开重连造成控制指令发送错误,可能导致误触发开门。解决方法是确保宿舍的WiFi信号稳定,或者使用物理按键来控制门的开关。

    2. 系统重启或断电重启:如果ESP8266发生系统重启或者断电重启,可能会导致门的状态恢复到默认值,从而误触发开门。解决方法是添加门状态的判断,只在门关闭的情况下才执行开门操作。

    3. 网络攻击或干扰:如果ESP8266的网络环境受到攻击或干扰,可能会导致控制指令被异常触发,进而开门。解决方法是确保网络安全,可以通过更改WiFi密码、配置防火墙等方式加强安全性。

    4. 程序逻辑问题:代码中可能存在逻辑问题,导致开门操作被错误触发。建议检查开门回调函数 button1_callback() 中的代码,确保只在需要开门的情况下执行开门操作。另外,可以在开门操作完成后添加延时来避免误触发,例如在开门后延迟一段时间再执行关闭门的操作。

    5. 舵机问题:如果舵机的初始位置不准确或者舵机本身存在故障,可能导致误触发开门。解决方法是确保舵机初始化时处于正确的初始位置,并检查舵机的工作状态是否正常。

    修改后的代码如下所示,主要是在开门操作完成后添加了延时,以避免误触发开门:

    #define BLINKER_WIFI
    #define BLINKER_MIOT_OUTLET
    #include <Blinker.h>
    #include <Servo.h>
    
    Servo myservo;
    
    char auth[] = "";    //手机端的key
    char ssid[] = "";     //WiFi名
    char pswd[] = "";     //WiFi密码
    
    BlinkerButton Button1("btn-abc"); //开门按钮的数据键名
    BlinkerNumber Number1("num-abc");
    
    int counter = 0;
    
    //开门
    void button1_callback(const String & state)
    {
      BLINKER_LOG("get button state: ", state);
      
      // 只在门关闭的情况下执行开门操作
      if (state == "off") {
        myservo.write(180);         //控制舵机旋转到180度
        delay(4500);                //延迟4500毫秒
        myservo.write(0);           //控制舵机旋转到0度
      }
    }
    
    void dataRead(const String & data)
    {
      BLINKER_LOG("Blinker readString: ", data);
      counter++;
      Number1.print(counter);
    }
    
    void miotPowerState(const String & state)
    {
      BLINKER_LOG("need set power state: ", state);
    
      if (state == BLINKER_CMD_ON) {
        myservo.write(180);         //控制舵机旋转到180度
    
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
      }
      else if (state == BLINKER_CMD_OFF) {
        myservo.write(0);           //控制舵机旋转到0度
    
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
      }
    }
    
    void setup()
    {
      Serial.begin(9600);          //设置波特率为9600
      BLINKER_DEBUG.stream(Serial);
      myservo.attach(5);            //设置舵机信号输出引脚编号为5(D1)
      myservo.write(0);             //控制舵机旋转到0度
    
      Blinker.begin(auth, ssid, pswd);
      Blinker.attachData(dataRead);
      Button1.attach(button1_callback);
      BlinkerMIOT.attachPowerState(miotPowerState);
    }
    
    void loop() {
      Blinker.run();
    }
    

    以上是对代码的一些修改和建议,希望能帮到你解决问题。如果问题仍然存在,请进行进一步的排查,例如检查硬件连接是否正确,调试输出是否正常等。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月2日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见