请问如何能跳出delay的延时过程,或用其他代码实现随时跳出-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1843|回复: 15

[已解决] 请问如何能跳出delay的延时过程,或用其他代码实现随时跳出

[复制链接]
发表于 2021-11-10 09:47 | 显示全部楼层 |阅读模式
本帖最后由 mmgg1721620 于 2021-11-10 13:07 编辑

说话比较啰嗦,抱歉。。。。。做了一个领航灯,其中有一段2秒延时用的delay(2000)实现,请问如何能随时跳出delay的延时过程,或用其他代码实现随时跳出。
初学编程,初学arduino,有一点点电路知识和动手能力。
突然对汽车领航灯感兴趣,看了马云家的,40多块钱就是红灯慢闪、刹车爆闪,觉得不值,觉得这个灯估计是灯壳卖35块电路卖5块?
所以想用新学的一点点知识自己做一个试试。
使用arduino uno采集刹车和倒车信号,驱动WS2812,常态时红色每2秒闪一下,踩下刹车红色快闪2下停0.4秒再黄色快闪3下再停0.4秒,倒车时亮白色。
最后是用ESP8266的ESP-01S当作一个纯的MCU用,来驱动的,加上MP1584降5V供灯,再经ME6206A33降3.3V供01S,一起装在一个小盒子里,感觉效果还不错,这两天又降温又下雪还没装车。
主要是ESP01S便宜啊,7块5,之前弄另一个东西买的328P芯片焊在tqfp32转接板上做成最小系统,比esp01s贵还麻烦。

但是毕竟是初学,所有代码都用的简单而且比较乱,基本只有if,for,delay几个。
因此产生一个不大不小的问题,常态的2秒间隔是用delay(2000)实现的,因此如果在delay过程中踩下刹车,并不会即时即刻变成刹车状态设定的红色黄色快闪,所以想请教一下有没有什么办法可以跳出delay,或者用别的代码来实现这个功能?
谢谢。


以下是全部代码。

  1. //ESP8266 ESP-01S
  2. //输入:刹车IO01(TX),倒车IO03(RX)      输入串30k再10k下拉,输入有效时电平约3.5V
  3. //GPIO01上电时必需高电平才能启动,踩着刹车上电,领航灯使用单独开关连接到ACC
  4. //输出:IO00,驱动2812,常态红间隔2s慢闪,刹车红2下黄3下,倒车白
  5. #include <Adafruit_NeoPixel.h>
  6. #define PIN 0
  7. #define NUM 20
  8. #define sha 1//刹车信号
  9. #define dao 3//倒车信号
  10. #define led2 2//与红色同步,显示工作状态(是否正常运行)
  11. Adafruit_NeoPixel pixels(NUM, PIN, NEO_GRB + NEO_KHZ800);

  12. void setup() {
  13. pixels.begin();
  14. pinMode(sha,INPUT);
  15. pinMode(dao,INPUT);
  16. pinMode(led2,OUTPUT);
  17. }

  18. void loop() {
  19. //刹车闪红2下,黄3下
  20. if(digitalRead(sha)==1){
  21. for(int j=0;j<2;j++){
  22. for(int i=0;i<NUM;i++){
  23.   pixels.setPixelColor(i, pixels.Color(255, 0, 0));
  24.   pixels.show();
  25. }
  26. digitalWrite(led2,LOW);
  27. delay(110);
  28. pixels.clear();
  29. pixels.show();
  30. digitalWrite(led2,HIGH);
  31. delay(110);
  32. }
  33. delay(400);
  34. for(int j=0;j<3;j++){
  35. for(int i=0;i<NUM;i++){
  36.   pixels.setPixelColor(i, pixels.Color(255, 255, 0));
  37.   pixels.show();
  38. }
  39. digitalWrite(led2,LOW);
  40. delay(110);
  41. pixels.clear();
  42. pixels.show();
  43. digitalWrite(led2,HIGH);
  44. delay(110);
  45. }
  46. delay(400);
  47. }

  48. else if(digitalRead(dao)==1){
  49. //倒车白光
  50. for(int i=0;i<NUM;i++){
  51.   pixels.setPixelColor(i, pixels.Color(255, 255, 255));
  52.   pixels.show();
  53. }
  54. digitalWrite(led2,LOW);
  55. delay(500);
  56. }

  57. else{
  58. //常态红慢闪
  59. for(int i=0;i<NUM;i++){
  60.   pixels.setPixelColor(i, pixels.Color(255, 0, 0));
  61.   pixels.show();
  62. }
  63. digitalWrite(led2,LOW);
  64. delay(150);
  65. pixels.clear();
  66. pixels.show();
  67. digitalWrite(led2,HIGH);
  68. delay(2000);
  69. }

  70. //delay(1000);//无用
  71. }
复制代码

原理图

原理图

成品图

成品图


发表于 2021-11-10 10:36 | 显示全部楼层
可以用这样的方式:
int i=0;
while (i<2000) {
delay(1);
i++;
if (你想退出条件满足) {i=2000;}
}
 楼主| 发表于 2021-11-10 12:37 | 显示全部楼层
本帖最后由 mmgg1721620 于 2021-11-10 12:44 编辑
Zoologist 发表于 2021-11-10 10:36
可以用这样的方式:
int i=0;
while (i

非常感谢!
已用另一片01s搭电路试了,代码很好用,输入脚1、3电压变化时输出状态能够立即改变,比单纯使用delay(2000)好的太多了。
我这用不上1ms那么灵敏,改成20ms,让它少跑几圈以免累坏
  1. else{
  2. //常态红慢闪
  3. for(int i=0;i<NUM;i++){
  4.   pixels.setPixelColor(i, pixels.Color(255, 0, 0));
  5.   pixels.show();
  6. }
  7. digitalWrite(led2,LOW);
  8. delay(150);
  9. pixels.clear();
  10. pixels.show();
  11. digitalWrite(led2,HIGH);

  12. // delay(2000);//delay时间太长,踩刹车时闪灯反应不及时,用以下代码替代, 来自 arduino论坛Zoologist
  13. int h=0;
  14. while (h<100) {
  15. delay(20);
  16. h++;
  17. if((digitalRead(sha)==1)||(digitalRead(dao)==1)) {h=100;}
  18. }

  19. }
复制代码
微信图片_20211110124337.jpg

发表于 2021-11-12 19:41 | 显示全部楼层
敢想敢做,我一直都停留在想的阶段。
发表于 2021-12-23 14:41 | 显示全部楼层
可惜你用的是01S,PIN太少了,用外部中断是最快的。你这8266的外接最高3.3V,外接的2个信号电压不能高啊!
发表于 2021-12-23 15:47 来自手机 | 显示全部楼层
esp8266是有WiFi的呀,可以WiFi无线遥控。不要检测刹车呢?用姿态模块来检验车子的状态。
发表于 2021-12-23 16:31 来自手机 | 显示全部楼层
不建议用esp01了,请关注乐鑫最新的芯片。用esp12f价格也符合你的需求,退出delay()的最好方法就是中断。
发表于 2021-12-23 16:32 来自手机 | 显示全部楼层
https://www.arduino.cn/forum.php?mod=viewthread&tid=106490&extra=page%3D1&mobile=2
发表于 2021-12-23 16:32 来自手机 | 显示全部楼层
https://www.arduino.cn/forum.php?mod=viewthread&tid=106490&extra=page%3D1&mobile=2
发表于 2021-12-23 16:32 来自手机 | 显示全部楼层
https://www.arduino.cn/forum.php?mod=viewthread&tid=106490&extra=page%3D1&mobile=2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 18:39 , Processed in 0.155834 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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