2019-7-15 01:22:40 [显示全部楼层]
23323浏览
查看: 23323|回复: 24

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

[复制链接]
做项目经常会遇到需要几件事情同时要做,每件事情还需要做好几秒的情况,但是作为单片机的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秒”而实现相同的结果。




Forgotten  版主
 楼主|

发表于 2021-6-7 18:18:45

Jerrykyu 发表于 2021-6-3 19:41
请问按目前的程序思路,能否实现D2口按钮按下,D4口LED闪烁3秒后熄灭,D3口按钮按下,D5口LED闪烁5秒后熄灭 ...

你看懂这个教程就知道了
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2021-7-12 14:44:15

撒哈拉大野牛 发表于 2021-7-1 14:22
为啥不用状态机?用定时器中断,计数器啥啥的

可以有很多实现方式,这种方法主要是理解简单,适用面广,不依赖高级功能
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2019-11-13 19:43:20

遥远2 发表于 2019-11-12 10:06
如果长时间运行,系统时间会不会变得超级大?从而引起系统错误?能不能将系统时间归零? ...

满了会自动归零
回复

使用道具 举报

hnyzcj  版主

发表于 2019-7-15 06:08:12

其实更希望同时运行
回复

使用道具 举报

Forgotten  版主
 楼主|

发表于 2019-7-15 16:37:54

hnyzcj 发表于 2019-7-15 06:08
其实更希望同时运行

实际的效果就是同时运行的感觉。
多线程的底层与这个逻辑是类似的。

回复

使用道具 举报

hnyzcj  版主

发表于 2019-7-15 22:44:23

Forgotten 发表于 2019-7-15 16:37
实际的效果就是同时运行的感觉。
多线程的底层与这个逻辑是类似的。

oooooo
回复

使用道具 举报

遥远2  见习技师

发表于 2019-11-12 10:06:58

如果长时间运行,系统时间会不会变得超级大?从而引起系统错误?能不能将系统时间归零?
回复

使用道具 举报

fz666  见习技师

发表于 2019-12-13 17:30:18

解决了我无数困难,赞赞赞赞赞赞赞赞
回复

使用道具 举报

优学创客  学徒

发表于 2020-11-6 00:12:05

增加计时器归零功能会更好!
回复

使用道具 举报

Jerrykyu  学徒

发表于 2021-6-3 19:41:21

请问按目前的程序思路,能否实现D2口按钮按下,D4口LED闪烁3秒后熄灭,D3口按钮按下,D5口LED闪烁5秒后熄灭的效果?
回复

使用道具 举报

没有  学徒

发表于 2021-6-23 15:54:12

hnyzcj 发表于 2019-7-15 06:08
其实更希望同时运行

有同时运行的吗
回复

使用道具 举报

撒哈拉大野牛  学徒

发表于 2021-7-1 14:22:54

为啥不用状态机?用定时器中断,计数器啥啥的
回复

使用道具 举报

淡淡的清香  学徒

发表于 2021-8-24 20:05:52

楼主讲的确实不错,这样可以实现很多功能。
回复

使用道具 举报

雷先生  见习技师

发表于 2021-11-10 20:51:34

这是个好贴,我上个星期也这样做了一个防掉线功能,原来我想到的已经是大家已经做过了
回复

使用道具 举报

zNN909m0  学徒

发表于 2021-12-24 16:44:54

楼主好,我看了你写的同步运行帖子,很棒,但是我要播放一首完整的歌曲,同时需要随时按下按钮停止歌曲,该如何编程呢
回复

使用道具 举报

王奕翔  见习技师

发表于 2022-4-2 09:48:51

遥远2 发表于 2019-11-12 10:06
如果长时间运行,系统时间会不会变得超级大?从而引起系统错误?能不能将系统时间归零? ...

重启哈!
回复

使用道具 举报

赤星三春牛!  初级技神

发表于 2022-4-2 22:22:49

6666666666
回复

使用道具 举报

赤星三春牛!  初级技神

发表于 2022-4-2 22:28:50

哈哈哈哈
回复

使用道具 举报

赤星三春牛!  初级技神

发表于 2022-4-2 22:31:56

呵呵呵呵
回复

使用道具 举报

赤星三春牛!  初级技神

发表于 2022-4-2 22:33:10

厉害厉害
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail