查看: 235|回复: 5

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

[复制链接]

该用户从未签到

发表于 2019-5-28 19:12 | 显示全部楼层 |阅读模式
最近用blinker做了一个手机端的遥控,内容是这样的开关型按钮,打开就会播放一段固定旋律(自己用PWM编写的)。按程序设计,按下按钮会print on的状态,使得手机端呈现开的状态,然后再播放音乐。使用过程中发现,按下按钮后,按钮没反应,但会播放旋律,等到旋律播放完了,按钮才呈现开的状态,怎么解决?

kittenblock中小学创客名师推荐的图形化编程软件

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");
     }
}
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 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
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 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中加入了按键检测,问题还是没解决,依旧是停顿一下,接着继续乐曲。

    kittenblock中小学创客名师推荐的图形化编程软件

    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;
         }
    }

    点评

    还是那句话 1.回调中最好不要有耗时操作,通常是在回调中改变flag,loop再做处理  详情 回复 发表于 2019-5-29 15:47
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2019-5-29 15:47 | 显示全部楼层
    fwl190612 发表于 2019-5-29 12:47
    我在for中加入了按键检测,问题还是没解决,依旧是停顿一下,接着继续乐曲。
    [mw_shl_code=arduino,true] ...

    还是那句话


    1.回调中最好不要有耗时操作,通常是在回调中改变flag,loop再做处理
    如果以上内容对你有帮助,你可以通过打赏支持作者
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    MAC arduino ESP8266mDNS.h不能加载。。。
    MAC arduino ESP8266mDNS.
    SpiderRobot 蜘蛛
    SpiderRobot 蜘蛛
    关于SpiderRobot 项目实行方案 之前有人推荐我做这个项目,于是乎就有了这个 h
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    项目分享——arduino梦幻交互雪花2019
    项目分享——arduino梦幻
    雪花由30颗LED打造,分为17个独立的部分,由Arduino Nano控制。每组LED都可以用PWM调
    体验OneNET4.0,一起来拼开发板
    体验OneNET4.0,一起来拼
    一、 活动时间2019年04月09日-2019年6月30日 二、活动链接1.登录Arduino中文社区账
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表