راه اندازی esp۸۲۶۶ scheduler | انجام چند کار به صورت همزمان | MultiTasking

فرض کنید یک پروژه آردوینو دارید که می‌خواهید چندین عمل را همزمان انجام دهید:

  1. خواندن داده‌ها از ورودی کاربر
  2. چشمک زدن LED‌
  3. خواندن مقدار آنالوگ پتانسیومتر

بنابراین می‌خواهید چند کار را با آردوینو انجام دهید.که همان Multitasking می شود.اینجاست که کد شما کمی پیچیده می شود. زیرا در آردوینو ما اساسا Multitasking واقعی را نداریم . اما… من یک خبر خوب برای شما دارم هنوز هم می توانید با آردوینو چند کار را به صورت همزمان انجام دهید.

قبل از اینکه نحوه انجام Multitasking با آردوینو را به شما توضیح دهم، بیایید ببینیم که چرا نمی‌توانید برنامه‌نویسی موازی  را در Arduino انجام دهید:

یک کامپیوتر دارای چند هسته و مقدار زیادی رم است. شما می توانید یک سیستم عامل (مانند ویندوز) را نصب کنید و صدها Task ایجاد کنید. به عنوان مثال، هنگامی که فایرفاکس یا کروم را راه اندازی می کنید، Task جدیدی ایجاد می شود، بنابراین می توانید با کامپیوتر چند کار را همزمان باهم انجام دهید.

با آردوینو، همه چیز متفاوت است.

“هسته” برد آردوینو یک میکروکنترلر است (ATmega328 برای Arduino Uno). یک میکروکنترلر تنها یک هسته دارد و تنها قادر به اجرای یک دستور در یک زمان است.

بنابراین، اگر تصمیم دارید در داخل یک تابع مکث کنید، تمام برنامه شما منتظر انجام آن تابع است. هر بار که چیزی می نویسید، باید به تأثیر آن بر کل کد فکر کنید.

اگر تکه کد های کوچک انجام دهید و آنها را خیلی سریع و یکی پس از دیگری انجام دهید، احساس Multitasking را خواهید داشت.حال ما می خواهیم از یک کتابخانه Esp8266 که این کار را با پیروی از همین اصل برنامه نویسی کرده اند استفاده کنیم که کار را برای ما بسیار راحت می کند.

پیشنهاد می شود که این کد را در محیط Visual Studio Code اجرا کنید تا فایل ها مرتب برای شما نشان داده شود.

دانلود کد ها

در این پروژه ما می خواهیم مقادیر پتانسیومتری را که به پایه A0 برد Esp8266 متصل شده را بررسی کنیم و روی سریال آردینو نمایش می دهیم و همزمان میزان مصرف Heap که در سرعت و عملکرد این برد بسیار مهم است را روی پورت سریال نمایش می دهیم.

کتابخانه esp8266 scheduler که از بخش Library manager می توانید دانلود کنید به ما برای هر Task یک تابع Setup و Loop می دهد که باید آشنایی کمی هم با زبان ++C داشته باشید تا برخی از بخش های کد را متوجه بشوید.توضیحات کد در درون خود کد به صورت کامنت نوشته شده است.در این پروژه ما از چند فایل هدر و یک فایل اصلی استفاده می کنیم.

فایل اصلی با پسوند .ino

#include <Arduino.h>
#include <Scheduler.h>
#include <Task.h>
#include <LeanTask.h>
#include “PrintTask.h”
#include “analog.h”
//objects of Scheduler
PrintTask* tPrint;
Analog* tAnalog ;
void setup() {
  Serial.begin(115200);
  //Make New Task And Start That Task
  tPrint = new PrintTask(true);
  Scheduler.start(tPrint);
  //Make New Task And Start That Task
  tAnalog = new Analog(true);
  Scheduler.start(tAnalog);
  //Start All The Task
  Scheduler.begin();
}
void loop() {
  //Print The Heap(Free Memory) On Serial Every One Second Using Millis()
  static unsigned long ts = 0;
  if (millis() – ts > 10000) {
    Serial.print(“Free Heap: “);
    Serial.print(ESP.getFreeHeap());
    Serial.println(” bytes”);
    ts = millis();
  }
}

در این فایل اصلی ما فقط بخش های Scheduler را راه اندازی می کنیم و داخل فایل های هدری که در یک پوشه مشترک قرار دارند کد های اصلی و طولانی تر را به صورت تابع ها و کلاس های مختلف می نویسیم تا یک کد کاملا خوانا و قابل فهم داشته باشیم.

فایل Analog با پسوند .h

#include <Arduino.h>
//Create Class Named “Analog” Attached To Scheduler
class Analog : public Task {
public:
  //Constuctor Of The Class
  Analog(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
protected:
  //The Fun Part : We Have Setup(){}  And  Loop(){}
  void setup(){}
  void loop() {
  int x = read_log(A0 , true) ;
  delay(1000) ;
  }
public:
  //Create Function Inside Class “Analog”
  int read_log(int _pin , bool log){
    int temp = analogRead(_pin);
    if(log == true){
      Serial.print(“Analog Value : “);
      Serial.println(temp) ;
    }
    return (temp) ;
  }
};

در هرکدام از کلاس هایی که از Scheduler تابعیت می کنند یک حلقه Setup & Loop داریم که بسیار به ما کمک می کنند.این حلقه ها دقیقا مانند Loop & Setup اصلی کار می کنند.

فایل PrintTask با پسوند .h

#include <Arduino.h>
//Create Class Named “PrintTask” Attached To Scheduler
class PrintTask : public Task {
public:
  //Constuctor Of The Class
  PrintTask(bool _enabled = false, unsigned long _interval = 0) : Task(_enabled, _interval) {}
  bool Looptest = true ;
protected:
  //The Fun Part : We Have Setup(){}  And  Loop(){}
  void setup(){
    Serial.println(“Serial is Ready!”);
    Looptest = true ;//for Testing
  }
  void loop() {
    //Prints Some Test Text On Serial
    if(Looptest){
    Serial.println(“Hello”);
    delay(1000);
    Serial.println(“bye”);
    delay(1000);
    }
  }
  public:
};

هم چنین می توانیم که برای بهتر شدن کد از فایل های Cpp هم استفاده کنیم که به خوانایی و ساختن کتابخانه برای آردینو کمک می کند و یک

برچسب ها

نوشته های مشابه

دیدگاهتان را بنویسید

آدرس ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

sixty five − = sixty two

بستن