点灯科技Blinker.vibrate()手机震动函数无法按编程顺序执行问题
本帖最后由 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); //显示开门次数
}
1.回调函数中不能使用delay,应替换为blinker.delay
2.数据有延迟合并发送策略,连续发送的几条数据会合并为一条发送
3.设备数据传输到手机,会花费有一定时间,视网络状况而定,而单片机进行IO操作只是微秒级别的事 奈何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倍以上!!
页:
[1]