سلام ESP8266! برنامه‌ی یک چشمک‌زن ساده با ESP8266

برنامه‌ی Hello World در دنیای میکروکنترلرها می‌شه نوشتن یک چشمک‌زن ساده، هدف از این برنامه دوتا چیزه:

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

۲- مطمعن شیم میکروکنترلری که داریم سالمه و به اصطلاح زنده‌س!

در این پست با هم یاد می‌گیرم که چطور اولین برنامه‌مون رو برای ESP8266 بنویسم و این برنامه چیزی نیست جز روشن و خاموش کردن یک LED.

[این نوشته یکی از آموزش‌های پروژه‌ی نارنگی است، برای دیدن اطلاعات بیشتر در مورد پروژه و سایر آموزش‌ها به +این‌جا مراجعه کنید.]

چی احتیاج داریم؟:

ESP8266، [من از برد wemos  mini استفاده می‌کنم.]

کامپیوتر/لپ‌تاپ

کابل USB برای اتصال برد به کامپیوتر

چه چیزهایی قراره یاد بگیریم؟

یاد می‌گیریم که چطور یکی از پایه‌های ESP8266 رو به شکل خروجی تعریف کنیم و LED متصل به اون رو خاموش و روشن کنم.

برای این کار ابتدا برنامه رو با استفاده از تابع تاخیر delay می‌نویسم و بعد در مورد معایب استفاده از تاخیر در برنامه‌هامون صحبت می‌کنیم و یاد می‌گیریم برنامه‌ی چشمک زن رو بدون استفاده از تابع delay بنویسم.

من اینجا مراحل پروگرام کردن رو با جزئیات کامل توضیح می‌دم اما در برنامه‌های بعد فقط کد برنامه رو خواهیم داشت و وارد این نوع جزئیات نمی‌شیم.

[اگر هنوز محیط توسعه‌ی لازم برای برنامه نویسی ESP8266 رو آماده نکردید پیشنهاد می‌کنم +این پست رو بخونید.]

بیاید چشمک‌زن بسازیم!

در میکروکنترلرها هر پایه I/O همه‌منظوره می‌تونه  ورودی و یا خروجی باشه٫

تعریفمون از ورودی چیزی مثل یک کلید و خروجی روشن و خاموش کردن یک LED است.

ورودی و خروجی هم برای خودشون ۲ حالت دارن، LOW به معنای ولتاژ پایین و HIGH به معنای ولتاژ بالا.

ما برای خاموش و روشن کردن یک LED نیاز داریم که ابتدا وضعیت اون پایه را به عنوان خروجی تعریف کنیم و بعد با HIGH و LOW کردن مقدار اون پایه می‌تونیم LED رو خاموش و روشن کنیم.

بیاید کد حرف‌هایی که زدیم رو ببینیم، ابتدا اسم پایه‌ای که LED به اون متصل است رو مشخص می‌کنیم.

#define LED_PIN D4

دقت کنید در یک wemos miniها یک LED روی خود برد قرار دارد که به پایه‌ی 2 [D4] متصل است.

ترتیب پایه‌های wemos mini به شکل زیر است:

D0 = 16;
D1 = 5;
D2 = 4;
D3 = 0;
D4 = 2;
D5 = 14;
D6 = 12;
D7 = 13;
D8 = 15;
RX = 3;
TX = 1;

سپس در بنده‌ی تابع setup با کد زیر پایه‌را از نوع خروجی تعریف می‌کنیم.

pinMode(LED_PIN, OUTPUT);

حالا در تابع loop می‌توانیم با کدهای زیر وضعیت HIGH و LOW بودن پایه رو مشخص کنیم.

digitalWrite(LED_PIN, LOW);   // Turn the LED OFF

digitalWrite(LED_PIN, HIGH);  // Turn the LED ON

دقت کنید که LED متصل به wemos mini به شکلی است که LOW کردن پایه باعث روشن شدن آن می‌شود و بلعکس.

تاخیر رو می‌شه با تابع delay ایجاد کرد، برای مثال برای ایجاد تاخیر ۲۵۰ میلی‌ثانیه‌ای از کد زیر استفاده می‌کنیم.

delay(250);                      // Wait for 250 mseconds

کد کامل یک چشمک‌زن رو با هم بببنیم:

#define LED_PIN D4


void setup() {
  pinMode(LED_PIN, OUTPUT);     // Initialize the LED_PIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_PIN, LOW);   // Turn the LED on 
  delay(1000);                  // Wait for a second
  digitalWrite(LED_PIN, HIGH);  // Turn the LED off
  delay(250);                   // Wait for 250 mseconds 
}

با کلیک کردن روی  در IDE آردیونو و یا رفتن به منو Sketch -> Verify/Compile  می‌تونیم کد برنامه رو کامپایل کنیم.

اگر برنامه خطایی داشته باشه باید اون‌ها رو رفع کنیم و زمانی که پایین IDE آردیونو عبارت Done Compiling رو دیدم به این معنا است که برنامه به درسی کامپایل شده.

آخرین کاری که لازمه انجام بدیم پروگرم کردن برنامه روی ESP8266 است.

برای این کار ابتدا کابل USB رو به کامپوتر/لپ‌تاپنون و ESP8266 متصل کنید.

وقتی وارد منو Tools -> Port بشیم می‌تونیم لیست پورت‌های فعال رو ببینم، برای من ESP8266 به پورت ttyUSB0 وصل شده است.

پورت رو انتخاب می‌کنیم و بعد باید نوع میکروکنترلری که داریم و سرعت پروگرم کردن رو مشخص کنیم.

از منو Tools -> Board نوع میکروکنترلر رو  WeMos D1 R2 & mini و سرعت پروگرم کردن رو  11520 مشخص می‌کنیم.

وقتی که روی  کلیک کنیم یا از منوی Stkech -> Upload را انتخاب کنیم پروسه‌ی پروگرم شدن برنامه شروع خواهد شد.

اگر همه‌چیز به خوبی انجام بشه خروجی شما باید مطابق با تصویر زیر باشد.

به بردتون نگاه کنید LED روی اون شروع به چشمک زدن کرده 🙂

همچنین با تغییر مقدار delay می تونید سرعت این چشمک زدن رو تغییر بدید.

چرا نباید از DELAY  استفاده کنیم؟

در میکروکنترلرها تابع تاخیر delay به این شکل پیاده سازی شده که با مشغول کردن پردازنده به انجام یک کار عبث تاخیر ایجاد می‌کنیم!

فرض کنید با ESP8266 یک Server ایجاد کردید و این سرور باید بلادرنگ به درخواست‌های کاربر جواب بده، در سناریویی که با استفاده از تابع delay پردازنده رو فرستادیم دنبال نخود سیاد قطعا نمی‌تونیم پاسخ‌دهی بلادرگ داشته باشیم 🙁

اگر از Delay استفاده نکنیم پس چیکار کنیم؟

در میکروکنتلرهای STM32 و ARMهای دیگه معمولا یک تایمر RTC داریم که از وقفه‌های این تایمر برای ایجاد تاخیر استفاده می‌کنیم، اما در اینجا کارمون ساده تره.

ما می‌تونیم زمان سپری شده از هنگام روشن شدن ESP8266 رو با دستور millis();داشته باشیم و بر اساس اون یک چرخه/تاخیر ایجاد کنیم، کاری که اینجا می‌دیم اینه:

زمان قبلی رو  previousMillis و زمان فعلی رو  currentMillis درنظر بگیرید و مقدار تاخیر رو interval.

اگر تفاضل currentMillis از previousMillis بیشتز از interval بشه یعنی یک چرخه داریم،‌ این هنگام عملیات مورد نظرمون رو انجام می‌دیم و  زمان قبلی رو برابر با زمان فعلی در نظر می‌گیرم.

بیاید کدهای برنامه رو ببیند تا دقیق متوجه منظورم بشید:

unsigned long previousMillis = 0;
const long interval = 1000;

void setup() {
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;   
    //Do Something!
  }
}

پس کد کامل برنامه‌ی چشمک‌زن بدون استفاده از تابع delay به شکل زیر خواهد بود:

#define LED_PIN D4

int ledState = LOW;     

unsigned long blinkPreviousMillis = 0; 

// this function taggle LED state
// @inputs: currentMillis, interval
// @outputs: NOTING
void blink_without_delay(unsigned long currentMillis, unsigned long interval){
  if(currentMillis - blinkPreviousMillis >= interval){
    blinkPreviousMillis = currentMillis;   
    if (ledState == LOW)
      ledState = HIGH;  // Note that this switches the LED *off*
    else
      ledState = LOW;   // Note that this switches the LED *on*
      
    digitalWrite(LED_PIN, ledState);
  }
}

void setup() {
  pinMode(LED_PIN, OUTPUT); // Set LED to output port
}

void loop()
{
  unsigned long currentMillis = millis(); //read currint runtime milisecend
  blink_without_delay(currentMillis, 500); //Blink LED to check we are alive! 🙂
}


نویسنده: محمد حسین سالاری.

موارد مشابه

۱ دیدگاه

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

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