Hướng dẫn tạo 1 đồng hồ theo thời gian thực và Lịch làm việc cho các Pin

Print

Lời chia sẻ đầu tiên thì tôi không phải học ngành Điện - Điện tử và chuyên ngành của tôi là Công nghệ phần mềm và lập trình Game ( rock devil).

Tôi đam mê tìm hiểu về điện - điện tử và việc tìm đến Arduino đối với tôi thật tuyệt. Arduino có những hàm được viết sẵn làm cho công việc lập trình và làm quen thật nhanh nhưng về hiệu quả thì tôi không chắc lắm. Nếu ai đó đọc bài này mà đã học qua lập trình thì việc phải Sleep trên main thread là 1 điều không nên và ảnh hưởng rất nhiều đến hiệu suất của chương trình và hàm delay(int) trong Arduino cũng tương tự như thế. Vì tôi muốn tác vụ của tôi phải chạy thời gian thực, code ngắn gọn, hướng đối tượng nên tôi viết 1 lớp Timer cho riêng mình để hoạt động trong hàm loop() của tôi không phải nghỉ 1 khoảng rồi mới làm tiếp. Đồng thời tôi cũng viết thêm 1 lớp WorkScheduler để thuận tiện cho công việc lập lịch làm việc cho các pin mà tôi muốn làm việc.

class Timer {   private:     unsigned long _lastTick;     unsigned long _currentTick;          Timer() { }      ~Timer() { }   public:   static Timer* getInstance() {     static Timer* instance = new Timer();     return instance;    }      /*    * Gọi trong hàm setup 1 lần duy nhất    */   void initialize() {     _lastTick = millis();    }      /*    * Gọi đầu tiên nhất trong hàm loop()    */   void update() {     _currentTick = millis();   }      /*    * Trả về thời gian giữa 2 lần loop()    * giá trị delta là millisecond    */   unsigned long delta() {     return _currentTick - _lastTick;   }      /*    * Yêu cầu gọi cuối cùng trong hàm loop()    */   void resetTick() {     _lastTick = _currentTick;   } };
class WorkScheduler {   private:     unsigned long _ellapsedTime;     unsigned long _workTime;     int _workPin;     void (*func)(int);   public:     WorkScheduler(int workPin, unsigned long time,void (*func)(int)) {       _workPin = workPin;       _workTime = time;       _ellapsedTime = 0;       this->func = func;     }          ~WorkScheduler() {       _workPin = 0;       _workTime = 0;        _ellapsedTime = 0;       func = NULL;     }          void update() {       _ellapsedTime += Timer::getInstance()->delta();       if (_ellapsedTime >= _workTime) {         _ellapsedTime -= _workTime;        if (func != NULL) {          func(_workPin);        }        }     } };

 

Sau đây là chương trình mẫu của tôi là cho 1 pin làm việc bằng cách chớp tắt 1 LED và bạn hoàn toàn có thể thêm bao nhiêu cũng được. Tôi đã thử cho 3 LED hoạt động trong thời gian khác nhau và nó hoàn toàn chính xác.

 

const int pinRed = 8;  WorkScheduler *redPinWorkScheduler;  void OnRedPin_Work(int pin) {   static boolean wasLightedUp = false;   digitalWrite(pin, !wasLightedUp ? HIGH: LOW);   wasLightedUp = !wasLightedUp; }  void setup() {   pinMode(pinRed, OUTPUT);      Timer::getInstance()->initialize();      redPinWorkScheduler = new WorkScheduler(pinRed, 1000UL, OnRedPin_Work);   }  void loop() {   Timer::getInstance()->update();      redPinWorkScheduler->update();     Timer::getInstance()->resetTick(); }
Nguồn: http://arduino.vn/