有没有懂blinker的老哥,萌新求助-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2373|回复: 5

[已解答] 有没有懂blinker的老哥,萌新求助

[复制链接]
发表于 2019-5-28 19:12 | 显示全部楼层 |阅读模式
最近用blinker做了一个手机端的遥控,内容是这样的开关型按钮,打开就会播放一段固定旋律(自己用PWM编写的)。按程序设计,按下按钮会print on的状态,使得手机端呈现开的状态,然后再播放音乐。使用过程中发现,按下按钮后,按钮没反应,但会播放旋律,等到旋律播放完了,按钮才呈现开的状态,怎么解决?[mw_shl_code=arduino,true]void button4_callback(const String & state) {
  BLINKER_LOG("get button state: ", state);  
if (state=="on")
   {
        Button4.print("on");
       for(int x=0;x<length;x++)
       {
           if(state=="off")
            {
              noTone(tonepin);
              Button4.print("off");
              return;
             }
       tone(tonepin,scale[x]);
       delay(1000*durt[x]);   //这里用来根据节拍调节延时,500这个指数可以自己调整
       noTone(tonepin);
       }
    delay(2000);
   
    }
    else if(state=="off")
    {
      noTone(tonepin);
      Button4.print("off");
     }
}[/mw_shl_code]
发表于 2019-5-28 21:13 | 显示全部楼层
1.回调中最好不要有耗时操作,通常是在回调中改变flag,loop再做处理
2.所有delay用Blinker.delay()
 楼主| 发表于 2019-5-28 22:19 来自手机 | 显示全部楼层
奈何col 发表于 2019-5-28 21:13
1.回调中最好不要有耗时操作,通常是在回调中改变flag,loop再做处理
2.所有delay用Blinker.delay() ...

谢谢,大佬我按你的方便,确实解决了问题。但出现了新的问题,on的时候是播放乐曲,在播放乐曲中,我在手机端转换成off,乐曲只是停顿一下,接着继续原来位置的for循环?似乎这里是中断了,而不是停止了?

点评

程序逻辑问题,在每次for中都检测下按键状态  详情 回复 发表于 2019-5-28 23:22
发表于 2019-5-28 23:22 | 显示全部楼层
fwl190612 发表于 2019-5-28 22:19
谢谢,大佬我按你的方便,确实解决了问题。但出现了新的问题,on的时候是播放乐曲,在播放乐曲中,我在手 ...

程序逻辑问题,在每次for中都检测下按键状态
 楼主| 发表于 2019-5-29 12:47 | 显示全部楼层
奈何col 发表于 2019-5-28 23:22
程序逻辑问题,在每次for中都检测下按键状态

我在for中加入了按键检测,问题还是没解决,依旧是停顿一下,接着继续乐曲。
[mw_shl_code=arduino,true]void button4_callback(const String & state) {
  BLINKER_LOG("get button state: ", state);  
if (state=="on")
   {
        Button4.print("on");
        Blinker.delay (1000);
         for(int x=0;x<length;x++)
         {
         void button4_callback(const String & state);
          if(state=="off")
           {
            digitalWrite(tonepin,LOW);
            Button4.print("off");
            break;
            }
       tone(tonepin,scale[x]);
       Blinker.delay(1000*durt[x]);   //这里用来根据节拍调节延时,500这个指数可以自己调整
       noTone(tonepin);
       }
    }
    else if(state=="off")
    {
      digitalWrite(tonepin,LOW);
      Button4.print("off");
      return;
     }
}[/mw_shl_code]

点评

还是那句话 1.回调中最好不要有耗时操作,通常是在回调中改变flag,loop再做处理  详情 回复 发表于 2019-5-29 15:47
发表于 2019-5-29 15:47 | 显示全部楼层
fwl190612 发表于 2019-5-29 12:47
我在for中加入了按键检测,问题还是没解决,依旧是停顿一下,接着继续乐曲。
[mw_shl_code=arduino,true] ...

还是那句话


1.回调中最好不要有耗时操作,通常是在回调中改变flag,loop再做处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 03:43 , Processed in 0.100548 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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