[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间
2019-07-144.6万
AI 快速预览详细
本文介绍了如何在UNO上使用Mind+编程实现同时控制多个延时程序。通过系统运行时间实现分时执行,避免了等待语句导致的阻塞问题。例如,当光线小于300时,LED灯亮5秒后熄灭;同时,如果按钮按下,蜂鸣器响,松开则不响。通过系统运行时间,可以实现这些事件互不干扰,触发条件立即执行。最终得出一个同时运行多个程序而不用延时的框架,适用于初学者和项目开发者。
|
做项目经常会遇到需要几件事情同时要做,每件事情还需要做好几秒的情况,但是作为单片机的uno又同时只能运行一件事情,那么我们该如何破局? 例如这个问题: “如何制作一个项目:当光线小于300的后,led灯亮5秒后熄灭,同时如果按钮按下,有源蜂鸣器响,松开蜂鸣器则不响,两个事件互不干扰,触发条件则立即执行条件” (光线传感器接A0,led接D13,按钮接D8,蜂鸣器接D9) 分析问题: 要实现的实际是两个项目: 光控灯:光线<300,led为亮5秒后熄灭。 按钮控蜂鸣器:按钮按下,蜂鸣器响,松开蜂鸣器不响。 首先分别实现两个项目: 光控灯: ![]() 按钮控蜂鸣器: ![]() 以上两个程序分别运行时正常,触发条件时都能立即反应。 接下来将两个程序进行组合如下: 流程图: ![]() 程序: ![]() 运行效果: 按钮按下,蜂鸣器响,松开蜂鸣器不响,正常。 此时如果条件一满足,即如果光线小于300,此时LED亮,在这5秒内,你会发现按钮按下没有反应了! 分析: 当程序执行“等待5秒”的时候,程序“停”在这里了,“如果读取数字引脚8”这个条件不会去检测,也就是按钮即使按下了,但是程序没有检测按钮,所以并不知道按钮按下了,也就不会去响蜂鸣器了。 ![]() 那么如何解决这个问题呢? 既然等待的时候没法检测,那么我们不用等待可以吗? 如果不用等待,那么又如何实现灯亮5秒呢? 类比现实生活:你向小明借了一笔钱,答应10天之后还钱,你是如何实现到时间还钱? 首先:记下借钱的时间,例如 2019年7月15日。 如何知道当前到了还钱日期没有? 用当前日期减去10天如果等于7月15,那么今天就是还钱日期了。 用一个时间轴来表示: ![]() 使用程序逻辑来表示: 先记录当前时间,然后一直检测时间,如果当前时间没到就继续检测,如果到了就结束。 ![]() 在我们的程序里面该如何使用这个思路呢? 分析上面的逻辑,我们发现需要有一个时钟,一直在运行的时钟,那么在我们Mind+中哪里有一直在运行的时钟呢? 答案就是: ![]() 系统运行时间:记录主控板从上电开始到当前的时间,单位毫秒,每次重启主控板就会清零。 直观感受一下系统运行时间,运行如下程序,打开串口: [提示]电脑端点击图片后可以查看大图 ![]() 我们发现这个时间在不停的增长,一秒钟增加1000。(1秒=1000毫秒) 这样我们就有了一个自动计时的时间了,接下来我们改造程序一: 改造后: ![]() 同样实现了光线小于300之后灯亮5秒。 插入一些串口打印观察程序运行情况如下: [提示]电脑端点击图片后可以查看大图 ![]() ![]() ![]() 可以看出,这个程序中没有用到“等待x秒”这个语句,同样实现了x秒之后执行某件事情的效果。 最终将按钮控制的语句加入主程序中: ![]() 最终程序逻辑: ![]() 总结: 利用“系统运行时间”这个后台自动增长的时钟,我们可以实现分时执行各种事情。 最终我们得出一个同时运行多个程序而不用延时的框架如下: ![]() 利用以上这个程序框架实现一个类似的效果,程序如下: ![]() 其他: 请尝试:使用“系统运行时间”+“变量”实现更多灵活的程序思路,改造各种之前的项目,抛弃“等待x秒”而实现相同的结果。 |

![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图1](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/14/234253v4s2s88m9ue6aas2.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图2](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/14/234620zux1ly91jzqo9mqj.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图6](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/001813ad88vdcvtwvbahff.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图3](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/14/234759es0ot11gtngy0kti.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图4](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/000116ulnwbibuuiz147iu.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图5](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/001412n54e7havvssv7754.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图7](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/001917ed6jfkar2dgf36jk.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图8](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/002202xenui0cnco296kjr.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图9](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/002604mdymae8aosdzeja4.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图10](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/003134aeerjez683633rf8.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图12](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/004152ghshp9hzzanrbrnk.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图11](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/004008sukte4ggcvsvg7ss.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图13](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/004818ykveswem7ejwmrsr.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图14](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/005206hqnnni1fjqbx78n7.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图15](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/005518dluzwjgll3gq56wh.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图17](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/011728tepgzegq74lc7nz7.png?imageView2/2/format/webp/q/80)
![[Mind+]在UNO上如何实现同时控制多个延时程序?系统运行时间图16](https://imagemc.dfrobot.com.cn/data/attachment/forum/201907/15/011647q3wx3hg93mgzxzz9.png?imageView2/2/format/webp/q/80)



另外希望上传模式中Arduino能支持多线程模块~
可以有很多实现方式,这种方法主要是理解简单,适用面广,不依赖高级功能