我如何在 arduino 中实现类似 void loop 和 void setup 的功能?
How i make function like void loop and void setup in arduino?
我想要像 void loop 这样的 make 函数或像 arduino main 函数这样的 void setup 函数,该函数可以输入另一个执行代码。
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
}
}
如何declare/define函数doEvery?
我认为该功能必须包含
if(millis()-NOW>=EVERY){
NOW=millis();
//THE LINE CODE
}
以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 or THIS这里的重点是函数作为参数。
我用这个为 WS2812 ledstrip 制作了一个动画库:
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 秒执行一次代码,您可以创建一个 class,它继承自 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();
}
我想要像 void loop 这样的 make 函数或像 arduino main 函数这样的 void setup 函数,该函数可以输入另一个执行代码。
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
}
}
如何declare/define函数doEvery? 我认为该功能必须包含
if(millis()-NOW>=EVERY){
NOW=millis();
//THE LINE CODE
}
以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 or THIS这里的重点是函数作为参数。
我用这个为 WS2812 ledstrip 制作了一个动画库:
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::UpdateFramevoid loop() {
list->UpdateFrame();
list->Render();
if (!list->Find(&r1))
{
r1 = Rain (rand() % NUMLEDS, rand() % NUMLEDS, {BRIGHTNESS, 0, 15 }) ;
list->AddFirst(&r1);
}
}
编辑
因此,如果您想每 2 秒执行一次代码,您可以创建一个 class,它继承自 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();
}