点灯科技Blinker.vibrate()手机震动函数无法按编程顺序执行问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3368|回复: 2

[已解答] 点灯科技Blinker.vibrate()手机震动函数无法按编程顺序执行问题

[复制链接]
发表于 2020-7-2 18:37 | 显示全部楼层 |阅读模式
本帖最后由 jianfengbeyond 于 2020-7-2 18:39 编辑

点灯科技Blinker.vibrate()手机震动函数无法按编程顺序执行问题,Blinker.vibrate()函数不会按编写的程序顺序执行,无论使用何种延时方法,依然会在程序的最后才执行,应该是blinker 固件库的问题,想实现功能是手机按下开门普通按键后,ESP8266接收到命令后 马上反馈到手机blinker APP让手机震动一下并执行后续代码,目前测试结果是如何如何延时,都会执行完所有代码最后才反馈震动,定时任务调度器Ticker也试过,一样没效,代码如下:
//------ 按下开门按键即会执行该函数:   ------------------------------------------------------
void button2_callback(const String & state)
{
  BLINKER_LOG("get button state: ", state);


  Blinker.vibrate();        //让反馈让手机震动
//延时尝试,没效
  int unsigned long now_time = millis();
  int unsigned long old_time = millis();
  while( now_time < old_time + 500 )
  {
    now_time = millis();
  }
delay(100);  //延时尝试,没效



  pinMode(D5, OUTPUT);      //设置大门右门主马达D5 GPIO 14 引脚为数字输出 (D5、D6配合正反转)
  pinMode(D6, OUTPUT);
  pinMode(D1, OUTPUT);      //设置大门左门主马达D1 GPIO 5 引脚为数字输出 (D1、D2配合正反转)
  pinMode(D2, OUTPUT);
  pinMode(D9, OUTPUT);      //设置右门开锁马达D9 GPIO 3 引脚为数字输出 (D9、D10配合正反转)
  pinMode(D10, OUTPUT);
  pinMode(D7, OUTPUT);      //设置左门地锁马达D7 GPIO 13 引脚为数字输出 (D7、D8配合正反转)
  pinMode(D8, OUTPUT);

  digitalWrite(D5, LOW);    //设置大门开关D5 GPIO 14 引脚低电平输出
  digitalWrite(D6, LOW);
  digitalWrite(D1, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D9, LOW);
  digitalWrite(D10, LOW);
  digitalWrite(D7, LOW);
  digitalWrite(D8, LOW);
  delay(10);

  //右左门开锁:
  analogWrite(D9, 512);      //设置右门门锁电机正转开锁 D9 PWM占空比50%功率输出避免3V电机用在12V电压过流损坏电机H桥芯片(PWM占空比最高数值1024为100%输出功率,512/1024=50%功率输出)
  analogWrite(D7, 512);      //设置左门门锁电机正转开锁 D7 PWM占空比50%功率
  delay(500);                //等待500毫秒,即0.5秒,开锁时间
  analogWrite(D9, 104);      //设置右门门锁电机正转开锁 10%输出功率维持,避免堵转过度消耗供电能量
  analogWrite(D7, 104);      //设置左门门锁电机正转开锁 10%输出功率维持,避免堵转过度消耗供电能量

  //右左门开始缓慢到加速开门(避免电机一开始就是全功率容易过流损坏IC):
  for (int val = 0; val <= 920; val++)
  {
    analogWrite(D5, val);
    analogWrite(D1, val);
    delay(3);                //此处设置PWM从0提高到920 90%输出功率 需要的时间为920*3=2760毫秒,即2.76秒
  }

  digitalWrite(D9, LOW);     //右门锁打开后可以关闭,避免一直堵转浪费电和发热

  delay(3000);               //等待3秒时间开门中……这里可以调试

  //右左大门开始减速到5%,避免硬碰墙
  for (int val = 919; val >= 52; val--)
  {
    analogWrite(D5, val);
    analogWrite(D1, val);
    delay(5);                //此处设置PWM降低到0需要的时间为(919-52)*5=4335毫秒,即4.335秒
  }

  delay(1000);               //等待1秒,这里可以调试

  //开门完成后,设置引脚低电平输出关闭所有电机:
  digitalWrite(D5, LOW);
  digitalWrite(D6, LOW);
  digitalWrite(D1, LOW);
  digitalWrite(D2, LOW);
  digitalWrite(D9, LOW);
  digitalWrite(D10, LOW);
  digitalWrite(D7, LOW);
  digitalWrite(D8, LOW);

  //输出计算开门次数
  counterOpen++;                                //计数开门次数用
  //Blinker.print("Open doorl", counterOpen);   //输出打印开门次数
  Number2.print(counterOpen);                   //显示开门次数
}


发表于 2020-7-2 19:36 | 显示全部楼层
1.回调函数中不能使用delay,应替换为blinker.delay
2.数据有延迟合并发送策略,连续发送的几条数据会合并为一条发送
3.设备数据传输到手机,会花费有一定时间,视网络状况而定,而单片机进行IO操作只是微秒级别的事
 楼主| 发表于 2020-7-3 09:51 | 显示全部楼层
奈何col 发表于 2020-7-2 19:36
1.回调函数中不能使用delay,应替换为blinker.delay
2.数据有延迟合并发送策略,连续发送的几条数据会合并 ...

用blinker.delay 解决了这个问题 谢谢
但是我后面用了
for (int val = 0; val <= 920; val++)
  {
    analogWrite(D5, val);
    analogWrite(D1, val);
    delay(3);                //此处设置PWM从0提高到920 90%输出功率 需要的时间为920*3=2760毫秒,即2.76秒
  }


delay(3);改成blinker.delay  发现时间会增加3倍以上!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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