[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间

2019-07-144.6万
AI 快速预览详细 收起
本文介绍了如何在UNO上使用Mind+编程实现同时控制多个延时程序。通过系统运行时间实现分时执行,避免了等待语句导致的阻塞问题。例如,当光线小于300时,LED灯亮5秒后熄灭;同时,如果按钮按下,蜂鸣器响,松开则不响。通过系统运行时间,可以实现这些事件互不干扰,触发条件立即执行。最终得出一个同时运行多个程序而不用延时的框架,适用于初学者和项目开发者。
做项目经常会遇到需要几件事情同时要做,每件事情还需要做好几秒的情况,但是作为单片机的uno又同时只能运行一件事情,那么我们该如何破局?

例如这个问题:

“如何制作一个项目:当光线小于300的后,led灯亮5秒后熄灭,同时如果按钮按下,源蜂鸣器响,松开蜂鸣器则不响,两个事件互不干扰,触发条件则立即执行条件”

(光线传感器接A0,led接D13,按钮接D8,蜂鸣器接D9)

分析问题:
要实现的实际是两个项目:
光控灯:光线<300,led为亮5秒后熄灭。
按钮控蜂鸣器:按钮按下,蜂鸣器响,松开蜂鸣器不响。


首先分别实现两个项目:
光控灯:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图1

按钮控蜂鸣器:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图2


以上两个程序分别运行时正常,触发条件时都能立即反应。


接下来将两个程序进行组合如下:
流程图:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图6
程序:

[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图3


运行效果:
按钮按下,蜂鸣器响,松开蜂鸣器不响,正常。
此时如果条件一满足,即如果光线小于300,此时LED亮,在这5秒内,你会发现按钮按下没有反应了!


分析:
当程序执行“等待5秒”的时候,程序“停”在这里了,“如果读取数字引脚8”这个条件不会去检测,也就是按钮即使按下了,但是程序没有检测按钮,所以并不知道按钮按下了,也就不会去响蜂鸣器了。
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图4

那么如何解决这个问题呢?

既然等待的时候没法检测,那么我们不用等待可以吗?

如果不用等待,那么又如何实现灯亮5秒呢

类比现实生活:你向小明借了一笔钱,答应10天之后还钱,你是如何实现到时间还钱?
首先:记下借钱的时间,例如 2019年7月15日。
如何知道当前到了还钱日期没有?
用当前日期减去10天如果等于7月15,那么今天就是还钱日期了。


用一个时间轴来表示:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图5

使用程序逻辑来表示:
先记录当前时间,然后一直检测时间,如果当前时间没到就继续检测,如果到了就结束。

[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图7


在我们的程序里面该如何使用这个思路呢?
分析上面的逻辑,我们发现需要有一个时钟,一直在运行的时钟,那么在我们Mind+中哪里有一直在运行的时钟呢?
答案就是:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图8

系统运行时间:记录主控板从上电开始到当前的时间,单位毫秒,每次重启主控板就会清零。

直观感受一下系统运行时间,运行如下程序,打开串口:
[提示]电脑端点击图片后可以查看大图

[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图9
我们发现这个时间在不停的增长,一秒钟增加1000。(1秒=1000毫秒)



这样我们就有了一个自动计时的时间了,接下来我们改造程序一:

改造后:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图10
同样实现了光线小于300之后灯亮5秒。

插入一些串口打印观察程序运行情况如下:
[提示]电脑端点击图片后可以查看大图
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图12
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图11

[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图13
可以看出,这个程序中没有用到“等待x秒”这个语句,同样实现了x秒之后执行某件事情的效果。


最终将按钮控制的语句加入主程序中:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图14
最终程序逻辑:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图15

总结:
利用“系统运行时间”这个后台自动增长的时钟,我们可以实现分时执行各种事情。


最终我们得出一个同时运行多个程序而不用延时的框架如下:

[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图17
利用以上这个程序框架实现一个类似的效果,程序如下:
[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图16


其他:

请尝试:使用“系统运行时间”+“变量”实现更多灵活的程序思路,改造各种之前的项目,抛弃“等待x秒”而实现相同的结果。




创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(17)
小含糊online
小含糊online
这个思路很棒,解决了正在头疼我的问题,学习了!
另外希望上传模式中Arduino能支持多线程模块~
天蓝云白
天蓝云白
感谢支招
zhangliang
zhangliang
非常哇塞的
三春牛-创客
三春牛-创客
赞赞赞赞赞
三春牛-创客
三春牛-创客
厉害厉害
三春牛-创客
三春牛-创客
呵呵呵呵
三春牛-创客
三春牛-创客
哈哈哈哈
三春牛-创客
三春牛-创客
6666666666
zNN909m0
zNN909m0
楼主好,我看了你写的同步运行帖子,很棒,但是我要播放一首完整的歌曲,同时需要随时按下按钮停止歌曲,该如何编程呢
雷先生
雷先生
这是个好贴,我上个星期也这样做了一个防掉线功能,原来我想到的已经是大家已经做过了
淡淡的清香
淡淡的清香
楼主讲的确实不错,这样可以实现很多功能。
撒哈拉大野牛
撒哈拉大野牛
为啥不用状态机?用定时器中断,计数器啥啥的
Forgotten
Forgotten
作者
回复撒哈拉大野牛

可以有很多实现方式,这种方法主要是理解简单,适用面广,不依赖高级功能
Jerrykyu
Jerrykyu
请问按目前的程序思路,能否实现D2口按钮按下,D4口LED闪烁3秒后熄灭,D3口按钮按下,D5口LED闪烁5秒后熄灭的效果?
Forgotten
Forgotten
作者
回复Jerrykyu
你看懂这个教程就知道了
优学创客
优学创客
增加计时器归零功能会更好!
fz666
fz666
解决了我无数困难,赞赞赞赞赞赞赞赞
遥远2
遥远2
如果长时间运行,系统时间会不会变得超级大?从而引起系统错误?能不能将系统时间归零?
王奕翔
王奕翔回复遥远2
重启哈!
Forgotten
Forgotten
作者
回复遥远2
满了会自动归零
hnyzcj
hnyzcj
其实更希望同时运行
没有
没有回复hnyzcj
有同时运行的吗
hnyzcj
hnyzcj回复Forgotten
oooooo
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
- 没有更多了 -