شاید تا با حال به دکمه ریست مودم ها دقت کرده باشید ، با فشردن این دکمه مودم به تنظیمات کارخانه بر می گردد . در واقع مقدار های ذخیره شده برای پارامتر های مختلف به حالت اولیه بر می گردند . این قابلیت به طور کلی در هر وسیله دیجیتالی که می توان تنظیمات آن را ذخیره نمود ، وجود دارد .
ماژول های 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(); }