|
本帖最后由 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,或者用别的代码来实现这个功能?
谢谢。
以下是全部代码。
- //ESP8266 ESP-01S
- //输入:刹车IO01(TX),倒车IO03(RX) 输入串30k再10k下拉,输入有效时电平约3.5V
- //GPIO01上电时必需高电平才能启动,踩着刹车上电,领航灯使用单独开关连接到ACC
- //输出:IO00,驱动2812,常态红间隔2s慢闪,刹车红2下黄3下,倒车白
- #include <Adafruit_NeoPixel.h>
- #define PIN 0
- #define NUM 20
- #define sha 1//刹车信号
- #define dao 3//倒车信号
- #define led2 2//与红色同步,显示工作状态(是否正常运行)
- Adafruit_NeoPixel pixels(NUM, PIN, NEO_GRB + NEO_KHZ800);
- void setup() {
- pixels.begin();
- pinMode(sha,INPUT);
- pinMode(dao,INPUT);
- pinMode(led2,OUTPUT);
- }
- void loop() {
- //刹车闪红2下,黄3下
- if(digitalRead(sha)==1){
- for(int j=0;j<2;j++){
- for(int i=0;i<NUM;i++){
- pixels.setPixelColor(i, pixels.Color(255, 0, 0));
- pixels.show();
- }
- digitalWrite(led2,LOW);
- delay(110);
- pixels.clear();
- pixels.show();
- digitalWrite(led2,HIGH);
- delay(110);
- }
- delay(400);
- for(int j=0;j<3;j++){
- for(int i=0;i<NUM;i++){
- pixels.setPixelColor(i, pixels.Color(255, 255, 0));
- pixels.show();
- }
- digitalWrite(led2,LOW);
- delay(110);
- pixels.clear();
- pixels.show();
- digitalWrite(led2,HIGH);
- delay(110);
- }
- delay(400);
- }
- else if(digitalRead(dao)==1){
- //倒车白光
- for(int i=0;i<NUM;i++){
- pixels.setPixelColor(i, pixels.Color(255, 255, 255));
- pixels.show();
- }
- digitalWrite(led2,LOW);
- delay(500);
- }
- else{
- //常态红慢闪
- for(int i=0;i<NUM;i++){
- pixels.setPixelColor(i, pixels.Color(255, 0, 0));
- pixels.show();
- }
- digitalWrite(led2,LOW);
- delay(150);
- pixels.clear();
- pixels.show();
- digitalWrite(led2,HIGH);
- delay(2000);
- }
- //delay(1000);//无用
- }
复制代码
原理图
成品图
|
|