代码之家  ›  专栏  ›  技术社区  ›  Muhammad Ikhwan Perwira

我如何在arduino中创建类似void循环和void设置的函数?

  •  0
  • Muhammad Ikhwan Perwira  · 技术社区  · 4 年前

    我想让函数像void循环或void设置像arduino主函数一样,该函数可以输入另一个执行代码。

    unsigned long NOW;
    
    void setup() {
    }
    
    void loop() {
      
      void doEvery(2){ //do Every 2 second
        //Put Code that Execute every 2 second
      }
    
      void doEvery(4){ //do Every 4 second
        //Put Code that Execute every 4 second
      }
    
    }
    

    如何声明/定义函数doEvery? 我认为该函数必须包含

    if(millis()-NOW>=EVERY){
    NOW=millis();
    //THE LINE CODE
    }
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   jabujavi    4 年前

    THIS 作为最初的想法:

    unsigned long previousMillis2 = 0, previousMillis100 = 0;
    
    void setup() {
    }
    
    void loop() {
      unsigned long currentMillis = millis();
    
      //doEvery 2
      if (currentMillis - previousMillis2 >= 2) {
        previousMillis2 = currentMillis; //stores last execution's timestamp
        //CODE EVERY 2  millis
      }
    
      //doEvery 100
      if (currentMillis - previousMillis100 >= 100) {
        previousMillis100 = currentMillis; //stores last execution's timestamp
        //CODE EVERY 100  millis
      }
    }
    

    这样,您将使用millis()来询问自Arduino初始化以来传递了多少毫秒。然后,您存储上次执行代码的时间,并比较自那以后经过了多少时间。 它不是一个用于定义新间隔的动态函数,但如果你只需要一对,你可以很容易地对其进行编码。

    编辑:

    如果你需要更动态的东西,你应该使用匿名函数。 SEE THIS THIS 这里的重点是 函数作为参数 .

        2
  •  1
  •   Serve Laurijssen    4 年前

    我为WS2812 LED灯带制作了一个动画库:

    https://github.com/laurijssen/ledstripanimator/blob/master/ledanim.c

    jabujavi描述的计时内容发生在UpdateFrame函数中,列表中的每个动画在配置毫秒后都会前进到下一帧。

    class AnimList
    {
      Animation *first = NULL;
      Adafruit_NeoPixel strip;
    
    public:
      AnimList(int nleds) : strip(nleds, 9, NEO_GRB + NEO_KHZ800)
      {
        strip.begin();
      }
    
      void UpdateFrame()
      {
        strip.clear();
        
        Animation **anim = &first;
    
        while (*anim)
        {
          if (millis() - (*anim)->last >= (*anim)->ms)
          {
            if (!(*anim)->UpdateFrame(strip))
            {
              *anim = (*anim)->next;
            }
            else
            {
              (*anim)->last = millis();
              anim = &(*anim)->next;
            }
          }
        }
      }
    };
    

    现在,您只需在循环()中尽可能快地调用AnimList::UpdateFrame

    void loop() {   
      list->UpdateFrame();
      list->Render();
    
      if (!list->Find(&r1))
      {
        r1 = Rain (rand() % NUMLEDS, rand() % NUMLEDS, {BRIGHTNESS, 0, 15 }) ;
        list->AddFirst(&r1);
      } 
    }
    

    编辑

    因此,如果你想每2秒执行一次代码,你可以创建一个继承自Animation并覆盖Updateframe的类。然后将ms变量放在要在帧之间传递的时间。 当然,如果你只想要一个基于任务的库,请删除所有Adafruit和动画引用。

    class TaskA : public Task
    {
    public:
      TaskA() { ms = 2000; }
    
      bool UpdateFrame()
      {    
        Serial.println("2 seconds passed");
        
        return true;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
      }
      
    };
    
    TaskA t;
    
    void setup()
    {
      list->AddTask(&t);
    }
    
    void loop()
    {
      list->UpdateTasks();
    }