查看: 460|回复: 21

[已解决] 求助用开关实现关闭和重启loop循环起始位置开始

[复制链接]
  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2020-7-11 18:56 | 显示全部楼层 |阅读模式
    本帖最后由 wlwlka 于 2020-7-15 19:53 编辑

    我写了一长条的WS2812的动画长代码,用自锁开关启动,但发现开关只能启动,不能实时关闭

    因为画面需要,动画最后一段需要常亮循环,按照我个人理解,我之前做的开关代码只能是一个循环结束后才能关闭。这个有点冲突

    网上搜了一遍中断程序也没看明白适不适用我这段代码,求解

    本人用自锁开关接数字IO口

    需要效果是

    打开关开,从头开始执行;关闭开关,不管动画执行到哪都全部熄灭


  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-7-11 18:57 | 显示全部楼层
    #include <Adafruit_NeoPixel.h>

    #ifdef __AVR__
    #include <avr/power.h>
    #endif
    #define BUTTON_PIN   A4
    #define PIXEL_PIN    9
    #define PIXEL_COUNT 60
    int pixelFormat = NEO_GRB + NEO_KHZ800;
    Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);




    void setup() {
      
    pinMode(A4, INPUT);
    pinMode(9, OUTPUT);



    #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
      clock_prescale_set(clock_div_1);
    #endif
      
      strip.begin();
      strip.show();     
      strip.setBrightness(100);
    delay(500);
    }

    void loop() {

    strip.clear();  


    liu();


    }


    void liu() {
    int j;
    for(j=10;j>0;j--){
      for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(j);
      }
    }
      
       for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      }
       for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      }
       for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      }
       for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      }

    for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      } for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      } for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      } for(int i=0; i<70; i++) {
        strip.setPixelColor(i, strip.Color(255, 90, 10));
        strip.setPixelColor(i-10, strip.Color(0, 0, 0));
        strip.show();
        delay(0);
      }
      
      delay(800);
       


    int a;
    for(a=0;a>10;a--){
    for(int b=0; b<5; b++) {
        strip.fill(strip.Color(255, 90, 10));
        strip.setBrightness(b);
        strip.show();
        delay(a);
      }
    for(int b=5; b>0; b--) {
        strip.fill(strip.Color(255, 90, 10));
        strip.setBrightness(b);
        strip.show();
        delay(a);
      } }



      


        for(int c=0; c<50; c++){
    strip.fill(strip.Color(255, 90, 10));
    strip.setBrightness(c);
    strip.show();
    delay(1);}





    int d=0;
    while(d<9999999999999){
        for(int e=50; e<100; e++){
    strip.fill(strip.Color(255, 90, 10));
    strip.setBrightness(e);
    strip.show();
    delay(30);}

    for(int e=100; e>=50; e--){
    strip.fill(strip.Color(255, 90,  10));
    strip.setBrightness(e);
    strip.show();
    delay(30);
    d++;
    }
    }}
  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-7-13 01:16 | 显示全部楼层
    为什么一直审核中
  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-7-13 18:00 | 显示全部楼层
    求助,终于审核通过了

    该用户从未签到

    发表于 2020-7-13 20:11 | 显示全部楼层
    本帖最后由 开在边缘 于 2020-7-13 20:12 编辑

    给你一个简单的思路,重新写一个delay函数,用于延时和判断开关状态

    bool myDelay(uint32_t n)
    {
            unsigned long nLastTime = millis();
            while (millis() - nLastTime < (unsigned long)n) if (开关关闭) return true;
            return false;
    }

    然后把liu()函数中使用delay的地方,改成myDelay,比如:
    delay(10);
    改成
    if (myDelay(10)) return;
  • TA的每日心情
    擦汗
    2020-8-8 01:43
  • 签到天数: 35 天

    [LV.5]常住居民I

    发表于 2020-7-13 23:51 | 显示全部楼层
    簡單一點說,要能即時反應你的輸入狀況,
    你就不能用 delay() 指令,因為在 delay()
    指定的時間到之前,系統就是 hold 在那條
    指令直到時間到再繼續往下一條指令
  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-7-14 01:21 | 显示全部楼层
    开在边缘 发表于 2020-7-13 20:11
    给你一个简单的思路,重新写一个delay函数,用于延时和判断开关状态

    bool myDelay(uint32_t n)

    好的,我试试
  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-7-14 01:21 | 显示全部楼层
    shouzama 发表于 2020-7-13 23:51
    簡單一點說,要能即時反應你的輸入狀況,
    你就不能用 delay() 指令,因為在 delay()
    指定的時間到之前,系統就 ...

    谢谢,原来是这样我理解了
  • TA的每日心情
    郁闷
    2020-7-13 01:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-7-14 06:43 | 显示全部楼层
    开在边缘 发表于 2020-7-13 20:11
    给你一个简单的思路,重新写一个delay函数,用于延时和判断开关状态

    bool myDelay(uint32_t n)

    大佬再问个问题,那我用了这个delay函数后,开关的函数要怎么弄

    if(digitalRead(A0)==1){

    while(digitalRead(A0)==1);
    if (digitalRead(9)==0)
    digitalWrite(9,HIGH);

    else
    digitalWrite(9,LOW);
    strip.fill(strip.Color(0, 0,  0));
    strip.show();  

    我用的是这个,但发现并没效果

    该用户从未签到

    发表于 2020-7-14 12:27 | 显示全部楼层
    wlwlka 发表于 2020-7-14 06:43
    大佬再问个问题,那我用了这个delay函数后,开关的函数要怎么弄

    if(digitalRead(A0)==1){

    那要看你用的是什么开关,是电子开关,还是手工开关?手动的话,是拨动开关,还是按钮开关?不同的开关,程序处理起来是不一样的。

    电子开关最简单,直接digitalRead,然后判断高低电平就可以了。

    拨动开关稍微好点,要求不高的话,可以不处理抖动,直接和电子开关一样处理。

    按钮开关是最麻烦的,因为要处理抖动,但是在你的程序中不能使用delay,否则会影响程序的运行。如果你的程序中没有什么大延时的函数,那么可以直接写在myDelay函数中,否则就要写在中断中。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    未见过的TFT屏,是什么驱动芯片?
    未见过的TFT屏,是什么驱
    这两块屏是从POS机里拆的,准备做几个锂电池组电压监测,在网上没找到资料,在这里问
    win10系统显示不出端口信息,编译后显示serial port not selected。
    win10系统显示不出端口信
    求各位哥哥帮忙,小兄弟实在不懂是win10系统的原因,还是需要安装什么驱动程式?具体
    更智能的电脑远程开关机-基于继电器
    更智能的电脑远程开关机-
    我只是刚刚入门的萌新,所以有不足请指出 先展示下 功能:开关机,开关机检测,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表