شاید تا با حال به دکمه ریست مودم ها دقت کرده باشید ، با فشردن این دکمه مودم به تنظیمات کارخانه بر می گردد . در واقع مقدار های ذخیره شده برای پارامتر های مختلف به حالت اولیه بر می گردند . این قابلیت به طور کلی در هر وسیله دیجیتالی که می توان تنظیمات آن را ذخیره نمود ، وجود دارد .

ماژول های ESP8266 قابلیت ریست شدن به صورت نرم افزاری و هم به صورت سخت افزاری را دارند . اما این ریست به معنی تغییر در برنامه ذخیره شده نیست . در واقع با ریست شدن ESP8266 ، شمارنده برنامه آن صفر شده و برنامه از اول شروع به اجرا خواهد کرد . یکی از قابلیت های جذاب ESP8266 ها ، امکان تشخیص دوبار فشردن کلید ریست است . به این معنی که با فشردن کلید ریست (صفر کردن پین RESET ) ماژول ریست خواهد شد و با دو بار فشردن ریست ، ماژول علاوه بر ریست شدن ، یک روتین را اجرا خواهد کد . از این قابلیت می توانید برای بازنشانی پروژه خود استفاده کنید ( مقدار پارامتر های ذخیره شده را تغییر دهید ) .

به طور مثال فرض کنید در یک پروژه شما از یک ماژول ESP8266 استفاده کرده اید و می خواهید پس از اولین باری که ماژول روشن شد از طریق یک کی پد و یک نمایشگر نام و پسورد خودتان را وارد کنید تا ماژول به وافای شما متصل شود و مقدار های وارد شده در EEPROM ماژول ذخیره شوند تا با خاموش و روشن کردن دوباره ، دیگر نیازی به تنظیم مجدد و وارد کردن نام و پسورد وایفای نباشد . حال فرض کنید کلید ریست را یک بار فشار خواهید داد ، با این کار ماژول ریست شده و برنامه آن بدون تغییری در EEPROM اجرا خواهد شد . حال اگر بخواهید گزینه برگشت به تنظیمات اولیه را برای پروژه خود لحاظ کنید می توانید از قابلت دوبل ریست استفاده کنید . در این حالت در روتین مربوط به دوبل ریست می توانید مقادیر را به حالت اولیه بر گردانید .

برای راه اندازی قابلیت دوبل ریست ابندا کتابخانه آن را از لینک زیر دانلود و به برنامه خود اضافه کنید :

https://github.com/datacute/DoubleResetDetector/archive/master.zip

پس از اضافه کردن کتابخانه ، کد های زیر را بردی روی برد خود آپلود کنید :

#include <DoubleResetDetector.h>

// Number of seconds after reset during which a 
// subseqent reset will be considered a double reset.
#define DRD_TIMEOUT 10

// RTC Memory Address for the DoubleResetDetector to use
#define DRD_ADDRESS 0

DoubleResetDetector drd(DRD_TIMEOUT, DRD_ADDRESS);

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  
  Serial.begin(9600);
  Serial.println();
  Serial.println("DoubleResetDetector Example Program");
  Serial.println("-----------------------------------");

  if (drd.detectDoubleReset()) {
    Serial.println("Double Reset Detected");
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    Serial.println("No Double Reset Detected");
    digitalWrite(LED_BUILTIN, HIGH);
  }
}

void loop()
{
  // Call the double reset detector loop method every so often,
  // so that it can recognise when the timeout expires.
  // You can also call drd.stop() when you wish to no longer
  // consider the next reset as a double reset.
  drd.loop();
}

 

توضیح کد های پروژه :

ابتدا کتابخانه DoubleResetDetector به برنامه اضافه شده است :

#include <DoubleResetDetector.h>

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

// Number of seconds after reset during which a 
// subseqent reset will be considered a double reset.
#define DRD_TIMEOUT 10

// RTC Memory Address for the DoubleResetDetector to use
#define DRD_ADDRESS 0

سپس یک شی از کلاس DoubleResetDetector تعریف می شود که از آن برای اجرای متد های مربوط به DoubleResetDetector استفاده می شود :

DoubleResetDetector drd(DRD_TIMEOUT, DRD_ADDRESS);

در تابع Setup ، پس از پیکر بندی Serial و نیز پین LED ماژول (به طور معمول پین 2 ماژول های ESP8266 به یک LED متصل است ) ، از متد detectDoubleReset برای تشخص دوبل ریست استفاده شده است که با هر دوبل ریست LED روشن و خاموش خواهد شد :

 

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  
  Serial.begin(9600);
  Serial.println();
  Serial.println("DoubleResetDetector Example Program");
  Serial.println("-----------------------------------");

  if (drd.detectDoubleReset()) {
    Serial.println("Double Reset Detected");
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    Serial.println("No Double Reset Detected");
    digitalWrite(LED_BUILTIN, HIGH);
  }
}

سپس در حلفه اصلی برنامه باید از متد loop استفاده کنید . برای غیر فعال کردن این قابلیت هم می توانید از متد stop استفاده کنید :

void loop()
{
  // Call the double reset detector loop method every so often,
  // so that it can recognise when the timeout expires.
  // You can also call drd.stop() when you wish to no longer
  // consider the next reset as a double reset.
  drd.loop();
}

 

Tags:
About Author: USER_4