Vlastnosti:
Paměťová stopa: pro 5 úloh ~80 B SRAM.
Bez dynamiky → vhodné pro malé ATtiny.
Jednoduché API: addTask, enableTask, disableTask, run.
Kód: Vybrat vše
#include <MiniScheduler.h>
MiniScheduler scheduler;
void blinkLed() {
digitalWrite(0, !digitalRead(0));
}
void sayHello() {
digitalWrite(1, HIGH); // rozsvítí LED jen jednou
}
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
scheduler.addTask(blinkLed, 500, true); // opakovaná úloha
scheduler.addTask(sayHello, 2000, false); // jednorázová úloha
}
void loop() {
scheduler.run();
}
Kód: Vybrat vše
Sketch uses 936 bytes (11%) of program storage space. Maximum is 8192 bytes.
Global variables use 70 bytes (13%) of dynamic memory, leaving 442 bytes for local variables. Maximum is 512 bytes.
MiniScheduler.h
Kód: Vybrat vše
#ifndef MINISCHEDULER_H
#define MINISCHEDULER_H
#include <Arduino.h>
#define MAX_TASKS 5 // maximální počet úloh
typedef void (*TaskCallback)(); // ukazatel na funkci
struct MiniTask {
TaskCallback callback;
unsigned long interval;
unsigned long lastRun;
bool enabled;
bool repeat; // zda se má spouštět opakovaně
};
class MiniScheduler {
public:
MiniScheduler();
bool addTask(TaskCallback cb, unsigned long interval, bool repeat = true);
void enableTask(uint8_t id);
void disableTask(uint8_t id);
void run(); // volat v loop()
private:
MiniTask tasks[MAX_TASKS];
uint8_t taskCount;
};
#endif
Kód: Vybrat vše
#include "MiniScheduler.h"
MiniScheduler::MiniScheduler() {
taskCount = 0;
for (uint8_t i = 0; i < MAX_TASKS; i++) {
tasks[i].callback = nullptr;
tasks[i].interval = 0;
tasks[i].lastRun = 0;
tasks[i].enabled = false;
tasks[i].repeat = true;
}
}
bool MiniScheduler::addTask(TaskCallback cb, unsigned long interval, bool repeat) {
if (taskCount >= MAX_TASKS) return false;
tasks[taskCount].callback = cb;
tasks[taskCount].interval = interval;
tasks[taskCount].lastRun = millis();
tasks[taskCount].enabled = true;
tasks[taskCount].repeat = repeat;
taskCount++;
return true;
}
void MiniScheduler::enableTask(uint8_t id) {
if (id < taskCount) tasks[id].enabled = true;
}
void MiniScheduler::disableTask(uint8_t id) {
if (id < taskCount) tasks[id].enabled = false;
}
void MiniScheduler::run() {
unsigned long now = millis();
for (uint8_t i = 0; i < taskCount; i++) {
if (tasks[i].enabled && tasks[i].callback) {
if (now - tasks[i].lastRun >= tasks[i].interval) {
tasks[i].lastRun = now;
tasks[i].callback();
if (!tasks[i].repeat) {
tasks[i].enabled = false; // vypne se po prvním spuštění
}
}
}
}
}
Kód: Vybrat vše
MiniScheduler KEYWORD1
addTask KEYWORD2
enableTask KEYWORD2
disableTask KEYWORD2
run KEYWORD2