سلام سلام. فاطمه هستم و امروز با یک پست چالشی اینجا هستم. تا این مرحله تیم مهصا به معرفی آردوینو و انواع پروژههای مربوط به آن پرداخته است. زمان آن فرا رسیدهاست که از آردوینو فراتر رفته و با میکروکنترلرهای دیگر نیز کار کنید. امروز ما به سراغ خانوادهی ESP خواهیم رفت.
مقدمه
زمانی که به استفاده از میکروکنترلر برای یک پروژه فکر میکنیم، معمولاً یک آردوینو را درنظر میگیریم. ارزان، استفادهی آسان و دارای تعداد زیادی پورت ورودی/خروجی دیجیتال و همچنین چند ورودی آنالوگ است. اما آردوینو، با وجود تمام مزایای شگفتانگیزش، در بسیاری از زمینهها فاقد کارایی است. اولین مورد سرعت است. بردهای محبوب Arduino AVR با سرعت ۱۶ مگاهرتز کار میکنند. این موضوع برای پروژههایی که سرعت مطرح است، تبدیل به چالش میشود.
آردوینو قطعاً به اندازهی کافی خروجی و ورودی دیجیتال دارد تا نیازها را برآورده کند و ورودیهای آنالوگ آن نیز مفید هستند اما افزودن امکاناتی مانند WIFI و BLUETOOTH به اجزای خارجی نیاز دارد.
آردوینو هنوز هم محبوب است و من همچنان از آن برای بسیاری از پروژهها و آزمایشات استفاده خواهمکرد اما زمان آن رسیدهاست که سایر میکروکنترلرها را نیز جستوجو کنیم.
ESP8266 چیست و چگونه کار میکند؟
ESP8266 یک تراشه است که در سال ۲۰۱۴ آزمایشگران دنیای غرب را غافلگیر کرد. ESP8266 اصلی در ماژولی به نام ESP-01 معرفی شد که دارای اسناد انگلیسی بسیار کمی است. بنابراین تواناییهای آن در آن زمان تا حد زیادی ناشناخته بودند. به محض ترجمه اسناد به انگلیسی، بسیاری از آزمایشگران از قدرت ESP8266 آگاه شدند و به سرعت محبوبیت زیادی پیدا کرد.
ESP8266 یک ماژول WIFI کم هزینه است که متعلق به خانوادهی ESP میباشد. شما میتوانید از آن برای کنترل پروژههای الکترونیکی خود در هر جای دنیا استفاده کنید. این ماژول دارای یک میکروکنترلر داخلی و یک حافظهی فلش ۱ مگابایتی است که به شما امکان اتصال به WIFI را میدهد. پروتکل TCP/IP به ماژول اجازه میدهد تا با سیگنالهای WIFI ارتباط برقرار کند. حداکثر ولتاژ کار ماژول ۳/۳ ولت است. بنابراین نمیتوانید از ۵ ولت استفاده کنید چرا که ماژول آسیب میبیند.
بیایید مثالی از کنترل یک چراغ LED با استفاده از ESP8266 توسط تلفنهای هوشمند را بررسی کنیم. ESP8266 به عنوان یک مفسر بین LED و تلفن هوشمند عمل میکند. از آنجا که ما برای کنترل LED از برنامهی BLYNK استفاده میکنیم، توضیحات براساس آن ارائه میشود.
به این تصویر نگاه کنید، ESP8266 به نقطه اتصال WIFI نزدیک متصل است که به آن امکان دسترسی به اینترنت را میدهد و دادهها را به همراه کد اعتبار به سرور BLYNK ارسال میکند. سپس یک کد احراز هویت برای برنامه ارسال میشود و پساز آن، برنامه دادهها را دریافت میکند تا یک اتصال ایمن بین برنامه و ESP8266 ایجاد کند.
دادهها (دستورالعملهای کنترل LED) از برنامهی BLYNK همراه با کد احراز هویت به سرور BLYNK ارسال میشود و از آنجا که ESP8266 قبلاً همان کد احراز هویت را دارد که با سرور BLYNK متصل است، سرور کد تطبیق را شناسایی میکند و دادهها به ESP8266 مربوطه ارسال میشود. در نهایت میکروکنترلر ESP8266، LED را روشن میکند.
پینهای ماژول ESP8266
پین ۱ --> RX --> اتصال به پایهی RX برد آردوینو
پین ۲ --> GPIO 0 --> هنگام بارگذاری کد در arduino IDE ، آن را به زمین متصل کنید.
پین ۳ --> GPIO 2
پین ۴ --> GND --> اتصال به زمین
پین ۵ --> TX --> اتصال به پایهی TX برد آردوینو
پین ۶ --> CH-PD (EN) --> اتصال به ۳/۳ ولت
پین ۷ --> RST (RESET) --> (لازم نیست) برای عملکرد عادی آن را به ۳/۳ ولت متصل کنید.
و OV (GND) برای ریست
پین ۸ --> VCC --> 3.3v را از آردوینو یا از منبع خارجی تأمین کنید.
شماتیک و اتصال
در این پروژه از برد آردوینو UNO استفاده شدهاست. قبل از شروع پروژه، میکرومنترلر ATmega328 را از صفحه خارج کنید.
توجه: هنگامی که LED آبی در ESP8266 چشمک زد (پس از بارگذاری کد)، اتصال GPIO0 به GND را بردارید.
اکنون آن را مطابق نمودار مدار زیر وصل کنید.
نصب و پیکربندی BLYNK
به playstore بروید و برنامهی BLYNK را جستوجو کنید. اکنون گزینه New Project را انتخاب کنید.
سپس نامی را برای پروژه انتخاب کرده و دستگاه را به عنوان ESP8266 انتخاب کنید.
اکنون با انتخاب گزینه Create آن را ذخیره کنید.
از تنظیمات، یک دکمه به قسمت خالی اضافه کنید تا بتوانید با فعال کردن آن، LED را کنترل کنید.
روی نماد ”پیچ” در بالا کلیک کنید.
سپس به پایین پیمایش کنید تا عنوان “auth token” را ببینید.
Auth token یک کد احراز هویت است که پیشاز این در مورد آن توضیحاتی ارائه دادیم. ایجاد ارتباط ایمن از برنامهی BLYNK به ESP8266 همچنین شناسایی دستگاه درحین برقراری ارتباط توسط وب سرور انجام میشود.
اکنون برای ذخیرهی کد auth، یک متد را در auth tokens انتخاب کنید. بعداً کد auth باید در کد برنامه وارد شود.
راهاندازی Arduino IDE برای برنامهنویسی ESP8266
قبل از برنامهنویسی ESP8266 در Arduino IDE، باید Board manager را به ESP8266 تغییر دهید. اگر تا به حال پروژهای بر روی ESP8266 انجام ندادهاید، برای نصب Board manager برد ESP8266 در Arduino IDE باید مراحل ذکر شده در لینک زیر را دنبال کنید.
https://randomnerdtutorials.com/how-to-install-esp8266-board-arduino-ide/
زمانی که نصب Board manager را به پایان رساندید، نوع آن را به عنوان “ماژول عمومی ESP8266 “ انتخاب کنید.
برای برقراری ارتباط ESP8266 خود با برنامهی BLYNK، باید یک کتابخانه BLYNK به پوشهی Arduino IDE خود اضافه کنید. برای این منظور، شما باید فایل کتابخانه را از لینک زیر بارگیری کنید.
https://github.com/blynkkk/blynk-library/releases
پس از بارگیری، پرونده را استخراج کرده و پوشهها را کپی کنید. سپس پوشهی Arduino خود را باز کرده و روی پوشهی کتابخانهها کلیک کنید. کلیک راست کرده و روی دکمهی Paste کلیک کنید. شما با موفقیت کتابخانههای BLYNK را نصب کردهاید.
اکنون کد داده شده در زیر را کپی کرده و در برد بارگذاری کنید.
بارگذاری برنامه Arduino
کد را در Arduino IDE خود کپی کرده و بارگذاری کنید. شما باید کد auth، نام WIFI و رمز عبور آن را در بخش اعلامیهی متغیر مربوط به کد وارد کنید.
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "your auth token code from blynk app";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "your wifi name";
char pass[] = "your wifi password";
void setup()
{
// Debug console
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
// You can also specify server:
//Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
}
void loop()
{
Blynk.run();
// You can inject your own code or combine it with other sketches.
// Check other examples on how to communicate with Blynk. Remember
// to avoid delay() function!
}
شروع کار با ESP32
پس از شناخت کامل ESP8266، وقت آن است که به سراغ ESP32 برویم.
معرفی ESP32
ESP32 درواقع یک سری تراشههای میکروکنترلر است که توسط Espressif Systems در شانگهای تولید میشود. این تراشه در تعدادی از ماژولهای ارزان قیمت در بازار موجود است.
ESP32 یک نسخهی بهروز شده از ESP8266 است. این برد به طُرُق مختلف طراحی ESP8266 را بهبود بخشیده است. ESP32 علاوه بر قابلیت WIFI، دارای دو قابلیت بلوتوث و BLE (بلوتوث کم انرژی) نیز میباشد درحالی که ESP8266 فقط قابلیت WIFI دارد. ESP32 سریعتر است و در طراحی دو هستهای موجود است. همچنین قابلیت کار در حالت کم مصرف را دارد.
از دیگر ویژگیهای ESP32 میتوان به موارد زیر اشاره کرد:
· ۱۸ مبدل ۱۲ بیتی آنالوگ به دیجیتال
· ۲ مبدل دیجیتال به آنالوگ ۸ بیتی
· ۱۰ سنسور لمسی خازنی
· ۴ کانال SPI
· دو رابط I2C
· ۲ رابط I2S (برای صدای دیجیتال)
· ۳ UART برای ارتباطات
· ۸ کانال کنترل از راه دور IR
· ۱۶ کانال LED PWM (مدولاسیون عرض پالس)
· ۱ سنسور یکپارچهی اثرهال
· ۱ پیش تقویتکنندهی آنالوگ بسیار کم مصرف
توجه داشته باشید که بسیاری از پینهای ESP32 دارای تعدادی از توابع فوق هستند. بنابراین همهی آنها بهطور همزمان در دسترس نیستند.
ماژولهای ESP32
ماژولهای ESP32 زیادی برای آزمایشگران در دسترس است. در اینجا میتوانید از هر یک از آنها برای پروژه استفاده کنید. بسیاری از این بردها دارای یک اتصال micro-USB یکپارچه هستند که برنامهنویسی را ساده میکند. بعضی از بردها براساس تراشهی ESP32-WROOM ساخته شدهاند. بردهای ESP32 DEV KIT و ESP32 NODEMCU کاملاً مشهور هستند.
یکی از بردهای خانوادهی ESP به نام ESP32-CAM بسیار محبوب بوده و دارای یک دوربین فیلمبرداری کوچک و یک سوکت microSD است که با ESP32 ادغام شدهاست. این برد برای برنامهنویسی به آداپتور FTDI نیاز دارد.
لطفاً توجه داشته باشید که این بردها از ویژگیهای مشابه بسیار زیادی برخوردار هستند اما از نظر پینهای خروجی یکسان نیستند. در آزمایشات، به جای یک عدد پین واقعی، به عملکرد پین (یعنی GPIO 4) اشاره خواهمکرد. این کار به شما این امکان را میدهد که از نوع متفاوتی از بردی که من استفاده میکنم، استفاده کنید.
پینهای ESP32
تراشهی ESP32 با ۴۸ پایه با عملکردهای مختلف ارائه میشود. همهی پینها در تمام بردهای توسعهی ESP32 قابل استفاده نیستند و پینهایی نیز وجود دارد که نمیتوانند استفاده شوند. سوالهای زیادی درمورد نحوهی استفاده از GPIOهای ESP32 وجود دارد. از چه پینهایی باید استفاده کنید؟ از چه پینهایی در پروژههای خود نباید استفاده کنیم؟
همانطور که در قسمت ویژگیها اشاره شد، ESP32 دارای ویژگی ADC (مبدل آنالوگ به دیجیتال) و DAC (مبدل دیجیتال به آنالوگ) است. این دو ویژگی به پینهای استاتیک خاص اختصاص مییابند. با این حال میتوانیم تصمیم بگیریم که کدام پینها PWM، SPI، I2C، UART و... هستند. فقط باید آنها را در کد اختصاص دهید. این کار به دلیل ویژگی مالتی پلکسینگ تراشهی ESP32 امکانپذیر است. شکل زیر پینهای مختلف یک نوع ESP32 را نشان میدهد.
جدول زیر نشان میدهد که کدام پینها بهتر است به عنوان ورودی/خروجی استفاده شوند و برای احتیاط از کدام یک استفاده کنید. استفاده از پینهای برجستهشده با رنگ سبز مناسب است. مواردی که با رنگ زرد برجستهشدهاند استفاده از آنها درست است اما باید توجه کنید که ممکن است رفتارهای غیرمنتظرهای هنگام BOOT شدن یا خروجی داشته باشند. پینهای برجستهشده با رنگ قرمز توصیه نمیشود که به عنوان ورودی/خروجی استفاده شوند.
نکته |
خروجی |
ورودی |
GPIO |
هنگام راهاندازی سیگنال PWM را خروجی میدهد. |
OK |
Pulled up |
۰ |
خروجی اشکالزدایی هنگام راهاندازی |
OK |
پین TX |
۱ |
متصل به LED برد |
OK |
OK |
۲ |
HIGH در هنگام خروجی |
پین RX |
OK |
۳ |
|
OK |
OK |
۴ |
هنگام راهاندازی سیگنال PWM را خروجی میدهد. |
OK |
OK |
۵ |
به فلش یکپارچهی SPI متصل شدهاست. |
X |
X |
۶ |
به فلش یکپارچهی SPI متصل شدهاست. |
X |
X |
۷ |
به فلش یکپارچهی SPI متصل شدهاست. |
X |
X |
۸ |
به فلش یکپارچهی SPI متصل شدهاست. |
X |
X |
۹ |
به فلش یکپارچهی SPI متصل شدهاست. |
X |
X |
۱۰ |
به فلش یکپارچهی SPI متصل شدهاست. |
X |
X |
۱۱ |
در صورت بالا کشیدن BOOT از کار میافتد. |
OK |
OK |
۱۲ |
|
OK |
OK |
۱۳ |
هنگام راهاندازی سیگنال PWM را خروجی میدهد. |
OK |
OK |
۱۴ |
هنگام راهاندازی سیگنال PWM را خروجی میدهد. |
OK |
OK |
۱۵ |
|
OK |
OK |
۱۶ |
|
OK |
OK |
۱۷ |
|
OK |
OK |
۱۸ |
|
OK |
OK |
۱۹ |
|
OK |
OK |
۲۱ |
|
OK |
OK |
۲۲ |
|
OK |
OK |
۲۳ |
|
OK |
OK |
۲۵ |
|
OK |
OK |
۲۶ |
|
OK |
OK |
۲۷ |
|
OK |
OK |
۳۲ |
|
OK |
OK |
۳۳ |
فقط ورودی |
|
OK |
۳۴ |
فقط ورودی |
|
OK |
۳۵ |
فقط ورودی |
|
OK |
۳۶ |
فقط ورودی |
|
OK |
۳۹ |
برای جزئیات بیشتر و تجزیه و تحلیل عمیق ESP32 GPIO و عملکردهای آن، به پاراگراف بعدی مراجعه فرمایید.
پینهای فقط ورودی
GPIOهای ۳۴ تا ۳۹ تنها پینهای ورودی هستند. این پینها مقاومت کششی یا کششی داخلی ندارند. نمیتوان از آنها بهعنوان خروجی استفاده کرد. بنابراین از این پینها تنها بهعنوان ورودی استفاده کنید.
· GPIO 34
· GPIO 35
· GPIO 36
· GPIO 39
فلش SPI تعبیهشده در ESP-WROOM-32
GPIOهای ۶ تا ۱۱ در برخی از برهای ESP32 قرار دارند. این پینها در تراشهی ESP-WROOM-32 به فلش یکپارچهی SPI متصل هستند و برای موارد دیگر توصیه نمیشوند. بنابراین، از این پینها در پروژههای خود استفاده نکنید.
· GPIO 6 (SCK/CLK)
· GPIO 7 (SDO/SD0)
· GPIO 8 (SDI/SD1)
· GPIO 9 (SHD/SD2)
· GPIO 10 (SWP/SD3)
· GPIO 11 (CSC/CMD)
GPIOهای لمسی خازنی
قبلاً هم گفتیم که ESP32 دارای ۱۰ حسگر لمسی خازنی داخلی است. اینها میتوانند تغییرات در هر چیزی را که دارای بار الکتریکی است، مانند پوست انسان احساس کنند. بنابراین آنها میتوانند تغییرات ناشی از لمس GPIOها با انگشت را تشخیص دهند. این پایهها میتوانند به راحتی در لنتهای خازنی ادغام شوند و جایگزین دکمههای مکانیکی شوند. حسگرهای لمسی خازنی به این GPIOها متصل هستند:
· T0 (GPIO4)
· T1 (GPIO0)
· T2 (GPIO2)
· T3 (GPIO15)
· T4 (GPIO13)
· T5 (GPIO12)
· T6 (GPIO14)
· T7 (GPIO27)
· T8 (GPIO33)
· T9 (GPIO32)
مبدل آنالوگ به دیجیتال (ADC)
ESP32 دارای ۱۸ کانال ۱۲ بیتی ورودی ADC است. این GPIOها هستند که میتوانند بهعنوان ADC و کانالهای مربوطه استفاده شوند:
· ADC1_CH0 (GPIO 36)
· ADC1_CH1 (GPIO 37)
· ADC1_CH2 (GPIO 38)
· ADC1_CH3 (GPIO 39)
· ADC1_CH4 (GPIO 32)
· ADC1_CH5 (GPIO 33)
· ADC1_CH6 (GPIO 34)
· ADC1_CH7 (GPIO 35)
· ADC2_CH0 (GPIO 4)
· ADC2_CH1 (GPIO 0)
· ADC2_CH2 (GPIO 2)
· ADC2_CH3 (GPIO 15)
· ADC2_CH4 (GPIO 13)
· ADC2_CH5 (GPIO 12)
· ADC2_CH6 (GPIO 14)
· ADC2_CH7 (GPIO 27)
· ADC2_CH8 (GPIO 25)
· ADC2_CH9 (GPIO 26)
توجه: هنگام استفاده از WIFI نمیتوان از پینهای ADC2 استفاده کرد. بنابراین، اگر از WIFI استفاده میکنید و در تهیهی مقدار از DC2 GPIO، میتوانید به جای آن از ADC1 GPIO استفاده کنید. این کار میتواند مشکل را حل کند.
کانالهای ورودی ADC دارای وضوح ۱۲ بیتی هستند. این بدانمعناست که میتوانید قرائتهای آنالوگ از ۰ تا ۴۰۹۵ را بهدست آورید که در آن ۰ مربوط به ۰ولت و ۴۰۹۵ مربوط به ۳/۳ ولت است.
مبدل دیجیتال به آنالوگ (DAC)
برای تبدیل سیگنالهای دیجیتال به خروجی سیگنال ولتاژ آنالوگ، ۲ کانال ۸ بیتی در ESP32 وجود دارد. کانالهای DAC بهصورت زیر هستند:
· DAC1 (GPIO25)
· DAC2 (GPIO26)
GPIOهای RTC
پشتیبانی از RTC GPIO در ESP32 وجود دارد. GPIOهایی که به زیر سیستم کم مصرف RTC هدایت میشوند، میتوانند هنگام خواب عمیق از ESP32 استفاده شوند. هنگام کار با پردازشگر فوقالعاده کم مصرف (ULP)، میتوان از این GPIOهای RTC برای بیدار کردن ESP32 از حالت خواب عمیق استفاده کرد. GPIOهای زیر را میتوان بهعنوان منبع بیدار خارجی استفاده کرد.
· RTC_GPIO0 (GPIO36)
· RTC_GPIO3 (GPIO39)
· RTC_GPIO4 (GPIO34)
· RTC_GPIO5 (GPIO35)
· RTC_GPIO6 (GPIO25)
· RTC_GPIO7 (GPIO26)
· RTC_GPIO8 (GPIO33)
· RTC_GPIO9 (GPIO32)
· RTC_GPIO10 (GPIO4)
· RTC_GPIO11 (GPIO0)
· RTC_GPIO12 (GPIO2)
· RTC_GPIO13 (GPIO15)
· RTC_GPIO14 (GPIO13)
· RTC_GPIO15 (GPIO12)
· RTC_GPIO16 (GPIO14)
· RTC_GPIO17 (GPIO27)
PWM
کنترل LED PWM در ESP32 توسط ۱۶ کانال مستقل انجام میشود که میتواند برای تولید سیگنالهای PWM با ویژگیهای مختلف پیکربندی شود. همهی پینهایی که میتوانند بهعنوان خروجی عمل کنند، میتوانند بهعنوان پینهای PWM استفاده شوند (GPIOهای ۳۴ تا ۳۹ نمیتوانند PWM تولید کنند). برای تنظیم سیگنال PWM، باید این پارامترها را در کد تعریف کنید:
· Signal’s frequency;
· Duty cycle;
· PWM channel;
· GPIO جایی که میخواهید سیگنال را خارج کنید.
I2C
ESP32 دارای ۲ کانال I2C است و هر پایه را میتوان بهعنوان SDA یا SCL تنظیم کرد. هنگام استفاده از ESP32 با Arduino IDE، پایههای پیشفرض 12C عبارتند از:
· GPIO 21 (SDA)
· GPIO 22 (SCL)
اگر میخواهید از پینهای دیگر استفاده کنید، هنگام استفاده از کتابخانهی wire، تنها باید فراخوانی کنید:
wire.begin(SDA,SCL);
SPI
بهطور پیشفرض، پینهای SPI به شرح زیر میباشند:
CS |
CLK |
MISO |
MOSI |
SPI |
GPIO 5 |
GPIO 18 |
GPIO 19 |
GPIO 23 |
VSPI |
GPIO 15 |
GPIO 14 |
GPIO 12 |
GPIO 13 |
HSPI |
Interrupt ها
تمامی GPIOها میتوانند بهعنوان وقفه پیکربندی شوند.
پینهای تسمهای
تراشهی ESP32 دارای پایههای تسمهای زیر است:
· GPIO 0
· GPIO 2
· GPIO 4
· GPIO 5 (باید در هنگام BOOT بالا باشد)
· GPIO 12 ( باید در هنگام BOOT پایین باشد)
· GPIO 15 (باید در هنگام BOOT بالا باشد)
اینها برای قراردادن ESP32 در حالت BOOT یا حالت چشمکزن استفاده میشوند. در اکثر بردهای توسعه با USB/SERIAL، نیازی به نگرانی درمورد وضعیت این پینها نیست. برد پینها را در حالت مناسب برای چشمکزن یا حالت BOOT قرار میدهد.
پینهای HOGH در حالت BOOT
برخی از GPIOها هنگام راهاندازی یا تنطیم مجدد، حالت خود را به HIGH یا سیگنالهای PWM در BOOT تغییر میدهند، این تغییر بهاین معناست که اگر خروجی به این GPIOها متصل باشد، ممکن است هنگام بازنشانی یا BOOT شدن ESP32 نتایج غیرمنتظرهای کسب کنید.
· GPIO 1
· GPIO 3
· GPIO 5
· GPIO 6 تا GPIO 11 (به فلش مموری یکپارچه SPI در ESP32 متصل است – استفاده از آن توصیه نمیشود).
· GPIO 14
· GPIO 15
Enable (EN)
Enable (EN) پین فعالکنندهی تنظیمکنندهی 3/3 ولت است. زمانی که در حالت Pulled up است، به زمین متصل میشود تا تنظیمکنندهی ۳/۳ ولت را غیرفعال کند. به این معنی است که شما میتوانید از این پین متصل به یک دکمه برای شروع مجدد ESP32 خود استفاده کنید.
برنامهنویسی ESP32
ESP32 را میتوان با استفاده از محیطهای مختلف توسعه برنامهریزی کرد. کد را میتوان به زبان C++ مانند آردوینو یا MicroPython نوشت. برای استفاده از تمام ویژگیهای esp32، ESPressif چهارچوب توسعهی ESPressif IOT یا ESP-IDF را ارائه دادهاست.
برای مبتدیان یک راه آسان برای شروع، استفاده از Arduino IDE است. گرچه این لزوماً بهترین محیط برای کار با ESP32 نیست اما این مزیت را دارد که یک برنامهی کاربردی آشناست. بنابراین منحنی یادگیری مسطح میشود. ما نیز برای پروژهی خود از Arduino IDE استفاده خواهیمکرد.
شروع کار با Arduino IDE
قبل از اینکه بتوانیم از Arduino IDE با یک برد ESP32 استفاده کنیم، باید بردهای ESP32 را با استفاده از Arduino IDE board manager اضافه کنیم. اگر به دنبال دستوالعملهای تنظیم IDE به صورت آنلاین باشید، ممکن است روال پیچیده و طولانی داشته باشد. تا زمانی که از نسخهی اخیر Arduino IDE استفاده میکنید، میتوانید از دستورالعملهای زیر استفاده کنید که بسیار سادهتر هستند.
ESP32 برای Arduino IDE
برای اینکه بتوانید با ESP32 کار کنید باید منبع دیگری را به Arduino IDE board manager اضافه کنید و سپس بردهای ESP32 را نصب کنید. این کار به لطف افراد ESPressif بسیار سادهتر شدهاست. آنها به همین منظور پیوندی به پروندهی JSON ارائه دادهاند. اگر با JSON آشنایی ندارید، یک فایل متنی است که اجازه میدهد اطلاعات ساختاری بین رایانهها به اشتراک گذاشته شود. از این نظر مشابه XML است.
ورودی board manager را اضافه کنید
آنچه در اینجا برای نصب بردهای ESP32 در Arduino IDE باید انجام دهید، آورده شدهاست.
Arduino IDE را باز کنید. مطمئن شوید گه در نسخه 1.8 یا بالاتر هستید در غیر این صورت IDE خود را بهروز کنید. روی منوی File در نوار بالا کلیک کنید. روی منوی preferences کلیک کنید. با این کار یک کادر محاورهای تنظیمات باز میشود. شما باید بهطور پیشفرض در تب settings در کادر گفتوگوی preferences باشید. به دنبال BOX متن با عنوان “ Additional Boards Manager URLs “ باشید. اگر قبلاً در این کادر متنی بودهاست، در انتهای آن کاما اضافه کنید و مرحلهی بعد را دنبال کنید. پیوند زیر را در BOX متن جایگذاری کنید.
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
برای ذخیرهی تنظیمات روی دکمهی تأیید کلیک کنید. BOX متن با پیوند JSON در آن در اینجا نشان داده شدهاست.
در مرحلهی بعدی، شما باید از ورودی جدید استفاده کنید تا در واقع بردهای ESP32 را به Arduino IDE خود اضافه کنید. این کار را با دنبال کردن این روش انجام دهید:
در Arduino IDE برروی منوی Tools در نوار منوی بالا کلیک کنید. به پایین و سمت راست حرکت کنید. ورودی (به عنوان مثال Board: Arduino / Genuino Uno). هنگامی که Board را برجسته میکنید، یک زیر منو باز میشود: ورودی. در بالای زیر منو، Board Manager وجود دارد. روی آن کلیک کنید تا کادر Board Manager باز شود. در BOX جستوجوی Board Manager، ESP32 را وارد کنید. باید ورودی ESP32 توسط ESPressif systems را مشاهده کنید. این ورودی را برجسته کرده و روی دکمهی Install کلیک کنید. با این کار بردهای ESP32 در Arduino IDE شما نصب میشوند.
اگر دوباره به زیر منوی Board برگشتید، باید تعدادی برد ESP32 را ببنید. شما باید بردی را انتخاب کنید که با برد ESP32 که خریداری کردهاید مطابقت داشتهباشد (یا معادل آن). در اینجا من از برد ESP-32S NodeMCU استفاده کردم و برد Node32s را در Board manager انتخاب کردم. احتمالاً راهاندازی Arduino IDE خود را به پایان رساندهاید. دلیل اینکه من “ احتمالاً “ میگویم این است که ممکن است لازم باشد برخی از فایلهای اضافی پایتون را نصب کنید.
سادهترین راه برای کشف این مسئله این است که یک برنامه را در برد ESP32 خود کامپایل و بارگذاری کنید و ببینید آیا خطایی دارید یا خیر؟ نگران نباشید، من به شما نشان خواهمداد که درصورت بروز خطا چگونه میتوانید آن را برطرف کنید!
تجربهی اتصال به اینترنت
قبل از بارگذاری یک برنامهی آزمایشی، باید برد ESP32 خود را متصل کنیم. شکل زیر ارتباطاتی را که برای انجام همهی آزمایشها و نسخه های نمایشی موجود در این پست به آن نیاز خواهیم داشت را نشان میدهد. توجه داشتهباشید که پینهای ESP32 با نام GPIO آنها مشخص میشوند و نه تعداد پینها زیرا بردهای مختلف ESP32 دارای شماره پینهای مختلف خواهندبود.
شما میتوانید از LED به خوبی برای مقاومت در برابر اُفت استفاده کنید. LED در مقادیر بین ۱۵۰ و ۴۷۰ اُهم به خوبی کار میکند. همچنین میتوانید از هر دکمهی فشاری برای ایجاد تماس لحظهای استفاده کنید. مربع کوچک موجود در شکل، طلای نمودار Touchpad است. شما میتوانید از هر جسم فلزی که میتوانید سیم را به آن متصل کنید، استفاده کنید. برای مثال یک قطعهی کوچک PCB عالی کار میکند. من فقط از تکهی کوچک سیم لخت روی بردبورد استفاده کردم. اکنون به سراغ تست اولین برنامهی خود میرویم.
Hello World-چشمک زن برای ESP32
هنگام استفاده از یک محیط توسعهی جدید یا برنامهنویسی برای یک دستگاه جدید، معمولاً برنامهی Hello World را اجرا میکنند. Hello World برای میکروکنترلرها، طرح BLYNK است که مطمئن هستم میدانید که این برنامه، به سادگی یک LED را روشن و خاموش میکند. درحالی که برنامهها و طرحهای Hello World معمولاً کاربرد عملی کمی دارند اما در خدمت تعدادی از توابع هستند.
آنها شما را با عملکرد کتابخانهی توسعه شما آشنا میکنند. در این حالت خاص، آنها به شما اجازه میدهند برنامهها را روی ESP32 بارگذاری کنید اما کمی متفاوتتر از Arduino انجام میشود. آنها شما را با نحوهی برنامهنویسی آشنا میکنند. در این حالت ما از همان C++ استفاده میکنیم که Arduino از آن استفاده میکند. ممکن است شما از قبل با نحوهی برنامهنویسی آشنا باشید. آنها به شما اجازه میدهند سختافزار خود را کنترل کرده و بتوانید با آن کار کنید. کد زیر یک طرح آردوینو BLYNK است که برای ماژول ESP32 بازنویسی شدهاست.
/*
ESP32 Blink
esp32-blink.ino
Rewrite of classic Blink sketch for ESP32
Use LED on GPIO2
DroneBot Workshop 2020
https://dronebotworkshop.com
*/
// LED on GPIO2
int ledPin = 2;
void setup()
{
// Set LED as output
pinMode(ledPin, OUTPUT);
// Serial monitor setup
Serial.begin(115200);
}
void loop()
{
Serial.print("Hello");
digitalWrite(ledPin, HIGH);
delay(500);
Serial.println(" world!");
digitalWrite(ledPin, LOW);
delay(500);
}
این کد به غیر از استفاده از پین GPIO 2 (به جای پین خروجی دیجیتال ۱۳ آردوینو) و افزودن مانیتور سریال، تفاوتی با کد آردوینو BLINK ندارد. توجه داشته باشید که مانیتور سریال با سرعت بالاتری نسبت به بیشتر اسکچهای آردوینو اجرا میشود. اغلب با طرحهای ESP32 انجام میشود زیرا میکروکنترلر بسیار سریعتر از بردهای AVR آردوینو کار میکند.
بارگذاری برنامه
پس از بارگذاری کد در Arduino IDE، باید کامپایل و سپس به برد ESP32 منتقل شود. در آردوینو، با زدن یک دکمه بارگذاری و کامپایل همزمان انجام میشود. درصورتی که در بردهای ESP32 یک مرحلهی اضافی وجود دارد. اینجا دقیقاً همان کاری را انجام میدهید که با آردوینو انجام میدهید. دکمهی بارگذاری (فلش رو به راست) را بزنید. با این کار کامپایلر شروع میشود. احتمالاً متوجه خواهید شد که تدوین برنامههای ESP32 نسبت به اسکچهای آردوینو زمان بیشتر میطلبد.
صفحهی وضعیت را در پایین Arduino IDE مشاهده کنید. هنگامی که فرآیند کامپایلر به پایان رسید، “ Connecting “ و به دنبال آن یک رشتهی دوره چاپ میشود. با مشاهدهی این مورد، باید دکمهی BOOT (در بعضی اوقات با برچسب .IO) را فشار دهید و آن را پایین نگهدارید تا زمانی که مشاهده کنید بارگذاری درحال پیشرفت است که این پیشرفت به صورت درصد است. پس از بارگذاری برنامه، برای شروع آن باید دکمهی enable یا reset را فشار دهید(برخی از بردها به این مرحله نیاز ندارند).
اگر همه چیز خوب پیش برود، با یک LED چشمکزن خواهیدداشت. اما ممکن است در مورد ماژول گمشده با نام سریال پیام خطا دریافت کنید. اگر چنین اتفاقی افتاد نگران نباشید. این مشکل قابل حل است. این خطا به این دلیل رخ میدهد که یک یا چند برنامهی اساسی Python روی رایانه شما نصب نشده است. کامپایلر به دنبال برنامهای بهنام python است و آن را پیدا نمیکند. این برنامهها در رایانههای MAC و Linux معمولاً از قبل نصب شدهاست اما نه همیشه. بنابراین میتوانید از لینک زیر آن را بارگیری و نصب کنید.
sudo usermod -a -G dialout $USER && sudo apt-get install git && wget https://bootstrap.pypa.io/get-pip.py && sudo python get-pip.py && sudo pip install pyserial && mkdir -p ~/Arduino/hardware/espressif && cd ~/Arduino/hardware/espressif && git clone https://github.com/espressif/arduino-esp32.git esp32 && cd esp32 && git submodule update –init –recursive && cd tools && python3 get.py
همانطور که به sudo نیاز دارید، برای تأمین مجوزها باید رمز ورود خود را وارد کنید. کاربران ویندوز ممکن است در نصب pyserial مشکلات دیگری داشته باشند. Adafruit برخی از دستورالعملهای دقیق را منتشر کرد که باید به شما کمک کنند.
استفاده از WIFI
اکنون که محیط برنامهنویسی ما کار میکند، میتوانیم آزمایش ESP32 را آغاز کنیم. هنگام نصب بهروزرسانی Board Manager و سپس انتخاب برد ESP32، تعداد زیادی برنامهی آزمایشی در اختیار شما قرار میگیرد که نحوهی کار با بسیاری از ویژگیهای ESP32 را نشان میدهد. برخی از این برنامهها را مرور خواهیمکرد. ما با برنامههایی که از ویژگیهای WIFI استفاده میکنند شروع خواهیمکرد.
WIFI در ESP32
ESP32 مانند مدل قبلی خود یعنی ESP8266 از WIFI در باند ۴/۲ گیگاهرتز کار میکند. از پروتکلهای WIFI، یعنی 802.11 b/g/n با حداکثر سرعت انتقال داده یعنی ۱۵۰ Mbps پشتیبانی میکند. قدرت انتقال قابل تنظیم دستگاه تا ۵/۲۰ دسیبل در متر است. استفاده از توان کم باعث کاهش جریان مورد نیاز میشود زیرا رادیو WIFI میتواند جریان مناسبی را مصرف کند.
ویژگی پیشرفتهی ESP32 WIFI تنوع آنتن است. با این کار میتوانید از برخی پینهای GPIO برای کنترل سوئیچ RF خارجی متصل به چند آنتن استفاده کنید و سپس رادیو WIFI را به مناسبترین آنتن تغییر دهید (و در صورت تغییر شرایط سیگنال آن را تغییر دهید).
حالتهای WIFI
ESP32 در دو حالت مختلف WIFI قابل استفاده است.
حالت ایستگاه (STA)
در حالت STA یا station، ESP32 به عنوان یک ایستگاه WIFI با مشتری عمل میکند. ترتیب در اینجا نشان داده شدهاست:
در این حالت ESP32 برای دسترسی به شبکهی WIFI باید SSID و رمز عبور را بداند (در یک شبکهی بدون امنیت نیازی به رمز عبور نیست).
ESP32 با استفاده از روترهای داخلی DHCP با آدرس IP شبکه ارائه میشود. سپس با استفاده از آن آدرس قابل دسترسی است. همچنین میتوان یک آدرس IP ثابت به ESP32 اختصاص داد که اگر از آن به عنوان یک سرور وب استفاده کنید که تغییر آدرس IP باعث ایجاد مشکل برای سایر سرویس گیرندگان میشود، مفید خواهد بود.
حالت دسترسی نرمافزار (AP)
در حالت Soft Access Point یا AP، ESP32 اتصال WIFI را برای دستگاههای خارجی فراهم میکند. این دستگاهها میتوانند رایانه، تلفن، رایانهی لوحی، دستگاههای اینترنت اشیاء یا حتی سایر ESP32 باشند که در حالت STA پیکربندی شدهاند.
ESP32 میتواند حداکثر از پنج دستگاه خارجی در حالت AP پشتیبانی کند. آدرس IP پیشفرض آن ۱۹۲.۱۶۸.۴.۱ است و خدمات DHCP را به دستگاههای متصل خارجی ارائه میدهد. اگر با دستگاههای موجود مغایرت داشته باشد، آدرس IP پیشفرض قابل تغییر است. این کار اجازه میدهد تا ESP32، شبکهی مستقل از هر شبکهی WIFI موجود را ایجاد کند. میتوانید شبکه را با رمز عبور ایمن کرده و SSID (نام شبکه) را انتخاب کنید. اتفاقاً، این حرکت به عنوان یک نقطه دسترسی “Soft” شناخته میشود زیرا ESP32 اتصال سختافزاری به اینترنت یا سایر شبکههای موجود را فراهم نمیکند.
WIFI SCANNER
اولین طرحی که ما بررسی خواهیمکرد WIFI SCSNNER است. همانطور که از نام آن پیدا است، این برنامه شبکههای WIFI محلی را اسکن میکند. سپس نتایج را روی مانیتور سریال چاپ میکند. نتایج شامل SSID شبکه (نام شبکه)، قدرت سیگنال در dBm و یک نشانگر در صورت امنیت شبکه است.
پیدا کردن برنامههای مثال این طرح، همراه با سایر برنامههای نمایشی که بررسی خواهیمکرد، به شرح زیر قابل دسترسی است:
· Arduino IDE را باز کنید.
· منوی File را از نوار منوی بالای IDE انتخاب کنید.
· به پایین به عنوان مثال پیمایش کنید. منوی فرعی باز میشود.
· به پایین مثالها بروید تا بخشی از مثالها را برای ESP32 پیدا کنید. این براساس برد ESP32 که شما انتخاب کردهاید، برچسبگذاری میشود، همان بردی که من استفاده میکنم میگوید Examples برای Node 32s.
· تعدادی از موارد منو را در زیر این مشاهده خواهیدکرد. هریک از زیر منوی خود را با یک یا چند مثال دارد.
WIFISCAN را بارگیری کنید
مثالی که اکنون میخواهیم استفاده کنیم تحت WIFI است و WIFISCAN نام دارد.
* This sketch demonstrates how to scan WiFi networks.
* The API is almost the same as with the WiFi Shield library,
* the most obvious difference being the different file you need to include:
*/
#include "WiFi.h"
void setup()
{
Serial.begin(115200);
// Set WiFi to station mode and disconnect from an AP if it was previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.println("Setup done");
}
void loop()
{
Serial.println("scan start");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(")");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*");
delay(10);
}
}
Serial.println("");
// Wait a bit before scanning again
delay(5000);
}
این کد از کتابخانهی WIFI استفاده میکند و کاملاً قابل توضیح است. دستور Wifi.scanNetworks شبکههای موجود را اسکن کرده و آنها را در یک آرایه وارد میکند. سپس آرایه برای تولید نتایج اسکن گام برمیدارد. کد را در ESP32 بارگذاری کنید. به یاد داشتهباشید که درصورت لزوم دکمهی BOOT را پایین نگهدارید. سپس مانیتور سریال خود را باز کنید (مطمئن شوید که روی bude ۱۱۵۲۰۰ تنظیم شدهباشد).
هنگامی که مانیتور را برای اولین بار باز میکنید، احتمال اینکه gibberish را مشاهده کنید وجود دارد. این به این معنا است که سیگنال سریال به درستی همگام نشده است. اکنون باید اسکن شبکههای موجود در مکان خود را مشاهده کنید.
ردیاب Brownout فعال شده
هنگام استفاده از رادیوی داخلی برای WIFI یا بلوتوث، هنگام تنظیم مجدد ESP32 ممکن است با پیام Brownout Detector مواجه شوید. بهطور کلی به این معناست که ESP32 جریان کافی دریافت نمیکند. این پیام معمولاً دلیلی برای هشدار نیست و میتوانید به صورت عادی پیش بروید. درصورت بروز مشکل، سعی کنید کابلهای USB را تغییر دهید یا از USB hub تغذیه شده استفاده کنید تا جریان اضافی را برای ESP32 تأمین کنید.
WIFI Access Point
مثال بعدی که بررسی خواهیمکرد از ESP32 در حالت AP یا Soft Access Point استفاده میکند. این مثال را با مثال قبلی در زیر منوی WIFI خواهید یافت که WIFI Access Point نامیده میشود. این برنامه ESP32 را درحالت AP قرار میدهد و سپس یک وب سرور و صفحه وب بسیار ساده ایجاد میکند. صفحه وب دارای دو پیوند است و از این پیوندها میتوان برای کنترل وضعیت LED در ESP32 استفاده کرد.
WiFiAccessPoint.ino creates a WiFi access point and provides a web server on it.
Steps:
1. Connect to the access point "yourAp"
2. Point your web browser to http://192.168.4.1/H to turn the LED on or http://192.168.4.1/L to turn it off
OR
Run raw TCP "GET /H" and "GET /L" on PuTTY terminal with 192.168.4.1 as IP address and 80 as port
Created for arduino-esp32 on 04 July, 2018
by Elochukwu Ifediora (fedy0)
*/
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
#define LED_BUILTIN 2 // Set the GPIO pin where you connected your test LED or comment this line out if your dev board has a built-in LED
// Set these to your desired credentials.
const char *ssid = "yourAP";
const char *password = "yourPassword";
WiFiServer server(80);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
Serial.println();
Serial.println("Configuring access point...");
// You can remove the password parameter if you want the AP to be open.
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
server.begin();
Serial.println("Server started");
}
void loop() {
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,
Serial.println("New Client."); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
client.print("Click <a href=\"/H\">here</a> to turn ON the LED.<br>");
client.print("Click <a href=\"/L\">here</a> to turn OFF the LED.<br>");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
} else { // if you got a newline, then clear currentLine:
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was "GET /H" or "GET /L":
if (currentLine.endsWith("GET /H")) {
digitalWrite(LED_BUILTIN, HIGH); // GET /H turns the LED on
}
if (currentLine.endsWith("GET /L")) {
digitalWrite(LED_BUILTIN, LOW); // GET /L turns the LED off
}
}
}
// close the connection:
client.stop();
Serial.println("Client Disconnected.");
}
}
بهطور پیشفرض SSID نقطه دسترسی “your AP” و رمز عبور “yourPassword” است. درصورت تمایل میتوانید هر دوی این ثابتها را اصلاح کنید. بهطور پیشفرض آدرس IP سرور وب ۱۸۲.۱۶۸.۴.۱ خواهدبود که آن را برای تست طرح باید بدانید. طرح را در ESP32 بارگیری کرده و دوباره تنظیم کنید. با استفاده از مانیتور سریال میتوانید تنظیم مجدد را کنترل کنید. اکنون از دستگاهی مانند نوتبوک، لپتاپ یا تلفن استفاده کرده و دستگاههای WIFI موجود خود را اسکن کنسد. شما باید شبکهی yourAP را در لیست مشاهده کنید. با استفاده از رمز عبور yourPassword با دستگاه خود به شبکه متصل شوید.
پس از برقراری اتصال، یک مرورگر وب را در دستگاه متصل باز کنید و به شمارهی ۱۹۲.۱۶۸.۴.۱ بروید. شما باید یک صفحه وب با دو پیوند را ببینید. یکی برای روشنکردن LED و دیگری برای خاموشکردن آن. روی پیوندها کلیک کنید و LED را که به ESP32 سیمکشی کردهاید (یا LED تعبیهشده روی خود ماژول) مشاهده کنید. باید بتوانید آن را از طریق صفحه وب کنترل کنبد.
این مثال ساده میتواند به عنوان پایهای برای کد شما استفاده شود.
Simple Wifi Server
مثال Simple Wifi Server عملکردی مشابه طرح قبلی را انجام میدهد. تفاوت در این است که در این حالت ESP32 در حالت STA (ایستگاه) استفاده میشود. بنابراین یک وب سرور در شبکهی خود ایجاد میکند. میتوانید LED را از طریق هر رایانه یا دستگاه متصل به شبکهی خود کنترل کنید. این مثال را در زیر منوی WIFI نیز با نام Simple Wifi Server پیدا خواهید کرد.
/*
WiFi Web Server LED Blink
A simple web server that lets you blink an LED via the web.
This sketch will print the IP address of your WiFi Shield (once connected)
to the Serial monitor. From there, you can open that address in a web browser
to turn on and off the LED on pin 5.
If the IP address of your shield is yourAddress:
http://yourAddress/H turns the LED on
http://yourAddress/L turns it off
This example is written for a network using WPA encryption. For
WEP or WPA, change the Wifi.begin() call accordingly.
Circuit:
* WiFi shield attached
* LED attached to pin 5
created for arduino 25 Nov 2012
by Tom Igoe
ported for sparkfun esp32
31.01.2017 by Jan Hendrik Berlin
*/
#include <WiFi.h>
const char* ssid = "yourssid";
const char* password = "yourpasswd";
WiFiServer server(80);
void setup()
{
Serial.begin(115200);
pinMode(2, OUTPUT); // set the LED pin mode
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
int value = 0;
void loop(){
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,
Serial.println("New Client."); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 2 on.<br>");
client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 2 off.<br>");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
} else { // if you got a newline, then clear currentLine:
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was "GET /H" or "GET /L":
if (currentLine.endsWith("GET /H")) {
digitalWrite(2, HIGH); // GET /H turns the LED on
}
if (currentLine.endsWith("GET /L")) {
digitalWrite(2, LOW); // GET /L turns the LED off
}
}
}
// close the connection:
client.stop();
Serial.println("Client Disconnected.");
}
}
قبل از استفاده از این کد باید چند ویرایش انجام دهید:
· شما باید SSID شبکهی خود را وارد کنید (خط ۳۰).
· باید رمز شبکهی خود را وارد کنید (خط ۳۱).
· شما باید دستور pinMode را ویرایش کنید و “۵” را به “۲” تغییر دهید (خط ۳۸).
· شما باید دستور digitalWrite را ویرایش کنید و “۵” را به “۲” تغییر دهید (خط ۱۰۵).
· شما باید دستور digitalWrite را ویرایش کنید و “۵” را به “۲” تغییر دهید (خط ۱۰۸).
سه ویرایش اخیر به این دلیل است که متأسفانه نویسندهی طرح، بهجای استفاده از یک ثابت یا متغیر، انتخاب کد سخت شمارههای پین GPIO را انتخاب کردهاست. راه دیگر در این مورد این است که فقط LED را به GPIO5 منتقل کنید و از این ویرایشها جلوگیری کنید.
پس از ویرایش، آن را در ESP32 بارگیری کنید. مانیتور سریال خود را باز کنید و ESP32 را دوباره تنظیم کنید. مانیتور سریال آدرس IP را که ESP32 از سرور DHCP روتر شما اختصاص داده شده نشان میدهد. این آدرس را کپی کرده و سپس در مرورگر وب جایگذاری کنید. شما باید یک صفحه وب بسیار مشابه صفحه وب نمایش داده شده در آزمایش قبلی را مشاهده کنید. با کلیک برروی پیوندها، LED کنترل میشود.
استفاده از بلوتوث
یکی از پیشرفتهای بزرگی که ESP32 نسبت به مدل قبلی خود یعنی ESP8266 داشته است، قابلیتهای بلوتوثی یکپارچهی آن است. با بلوتوث، ESP32 قادر است با تعداد زیادی دستگاه بلوتوث ارتباط برقرار کند و تعداد بیشماری از برنامههای بالقوه را باز کند.
بلوتوث و BLE در ESP32
ESP32 دارای بلوتوث کلاسیک و BLE یا بلوتوث کم انرژی است. دستگاه میتواند بهعنوان مشتری بلوتوث یا سرور عمل کند. اگر با تفاوت بلوتوث کلاسیک و BLE آشنا نیستید، در اینجا یک توضیح مختصر آورده شدهاست.
بلوتوث کلاسیک ۴.۲
همانطور که از نام آن مشخص است، بلوتوث کلاسیک عمر بیشتری دارد و احتمالاً بلوتوثی است که بیشتر با آن آشنایی دارید.
از بلوتوث کلاسیک برای انتقال مداوم داده استفاده میشود. میتواند برای برنامههای صوتی بیسیم، وسایل جانبی رایانه مانند MOUSE و صفحه کلید استفاده شود.
بلوتوث کم انرژی
بلوتوث کم انرژی یا به اختصار BLE، دادهها را با انفجارهای کوتاه مبادله میکند. همانطور که از نامش پیداست جریان کمی مصرف میکند. این ویژگی BLE را برای سنسورهای از راه دور و دستگاههای اینترنت اشیاء ایدهآل میکند زیرا اینها تنها به افجار کوتاه نیاز دارند و اغلب از طریق باتری کار میکنند. با استفاده از BLE میتوان محصولاتی را طراحی کرد که به جای ماهها یا روزها، عمر باتری را در سال اندازهگیری کنند! یکی دیگر از برنامههای عالی برای BLE تبلیغات هدفمند است. بهعنوان مثال میتوان به رستورانی اشاره کرد که میتواند منوی غذا یا محصولات ویژهی روزانهی خود را برای مشتریان بالقوهی مجاور پخش کند. پروتکل iBeacon اپل نیز از این ویژگی استفاده میکند.
سریال به سریال BT
برای آزمایش بلوتوث برروی ESP32 ما از یک طرح آزمایشی ساده استفاده خواهیمکرد که نام آن Serial To Serial BT میباشد.
licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32test"); //Bluetooth device name
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(20);
}
عملکرد این برنامه تبادل دادهها بین سریال مانیتور Arduino IDE و یک پایانهی سریال خارجی بلوتوث است. آنچه روی یک دستگاه نوشته شده توسط دستگاه دیگر خوانده میشود و در هر دو جهت کار میکند. شما میتوانید هنگام توسعهی برنامههای بلوتوث خود، میزان مفید بودن آن را ببینید.
برای آزمایش طرح، باید نوعی ترمینال بلوتوث سریال داشته باشید. اگر دستگاه اندرویدی دارید میتوانید از برنامهی Serial Bluetooth Terminal که در Google Play رایگان است استفاده کنید. کاربران دستگاه Apple IOS میتوانند برنامهی Bluetooth Terminal یا Blue Term را که هر دو در Apple App موجود است، امتحان کنند.
پس از برداشتن ترمینال میتوانید طرح را بارگیری کرده و دستگاه خود را با ESP32 جفت کنید. به دنبال دستگاهی به نام ESP32test بگردید (در صورت تمایل میتوانید این نام را با اصلاح خط ۱۷ کد تغییر دهید). اکنون از ترمینال بلوتوث خود برای تایپ کردن چیزی استفاده کنید. شما باید متنی را که تایپ کردهاید در سریال مانیتور Arduino IED مشاهده کنید. همچنین میتوانید متن را در BOX متن سریال مانیتور تایپ کنید. این من باید در ترمینال بلوتوث شما نشان دادهشود.
ویژگیهای بیشتر ESP32
همانطور که در ابتدای پست بیان شد، ESP32 علاوهبر WIFI و بلوتوث، قابلیتهای بسیاری دارد. بهترین راه برای یادگیری، استفاده از این ویژگیها و اجرای مثالهای ارائه شده توسط ESPressif است. درست همانطور که هنگام یادگیری ویژگیهای wifi و بلوتوث انجام دادیم. همهی این مثالها را میتوانید در زیر منوی ESP32 در مثالها پیدا کنید. با برجستهسازی این منو، یک زیر منو ظاهر میشود که به نوبهی خود حاوی زیر منوهای بیشتری است. در زیر نمونهی کوچکی از این مثالها آورده شدهاست.
Simple Time
یکی از ویژگیهای ESP32 ساعت داخلی Real Time آن است. مثال Simple Time، که در زیر منوی Time یافت میشود، نشان میدهد که چگونه میتوانید ساعت را با استفاده از سرور NTP (پروتکل زمان شبکه) در اینترنت تنظیم کنید.
#include <WiFi.h>
#include "time.h"
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void setup()
{
Serial.begin(115200);
//connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop()
{
delay(1000);
printLocalTime();
}
از آنجایی که این برنامه باید به اینترنت متصل شود، باید کد را با WIFI SSID و گذر واژهی خود ویرایش کنید.
محاسبهی جبران GMT و Daylight Offset
برای اینکه ساعت را به منطقهی زمانی محلی خود تنظیم کنید، باید دو مقدار برای آن تنظیم کنید که به موقعیت مکانی شما بستگی دارد.
· GMT Offset: تعداد ثانیههای منطقهی زمانی شما با GMT متفاوت است. این میتواند یک مقدار مثبت یا منفی باشد.
· Daylight Offset: اگر منطقهی شما زمان تابستانی را رعایت میکند، این تعداد ثانیههایی است که ساعت را برای DST پیش میبرید.
برای محاسبهی جابهجایی GTM باید بدانید که منطقهی زمانی شما از ساعت گرینویچ چند ساعت جبران شدهاست. شما احتمالاً از قبل این مقدار را میدانید اما اگر اطلاعی ندارید، میتوانید محاسبه کنید. اگر در شرق رصدخانهی گرینویچ هستید، این مقدار مثبت و اگر در قسمت غربی یعنی آمریکای شمالی و جنوبی زندگی میکنید، این مقدار منفی است.
در مرحلهی بعدی باید این رقم را به ثانیه تبدیل کنید. به این معنا که باید آن را در ۳۶۰۰ ضرب کنید زیرا ۳۶۰۰ ثانیه در یک ساعت وجود دارد. نتیجهی آن جابهجایی GTM است که در خط ۸ کد وارد خواهیدکرد. من منطقهی خود را بهعنوان مثال استفاه میکنم. من در ایران که در زمان شرقی است زندگی میکنم. جبران GTM ما ساعت است.
پس از ویرایش کد با پارامترهای WIFI، تمام کاری که شما باید انجام دهید این ست که کد را در ESP32 بارگذاری کنید، سریال مانیتور را باز کرده و تنظیم مجدد را فشار دهید.
باید ببینید ESP32 به WIFI شما متصل است و سپس هر ثانیه زمان را نمایش دهید. از آنجا که اکثر رایانهها با سرور زمان اینترنت همگامسازی میشوند، مقدار زمان باید با مقدار رایانهی شما مطابقت داشتهباشد.
سنسور هال
سنسور هال (Hall Sensor) دستگاهی است که از هال افکت برای تشخیص یک میدان مغناطیسی استفاده میکند. ESP32 دارای یک سنسور Hall Effect یکپارچه است. بنابراین میتوانید از آن برای تشخیص وجود (یا عدم وجود) یک میدان مغناطیسی استفاده کنید. کد زیر نحوهی خواندن مقدار سنسور یکپارچهی Hall را نشان میدهد.
//Simple sketch to access the internal hall effect detector on the esp32.
//values can be quite low.
//Brian Degger / @sctv
int val = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
val = hallRead();
// print the results to the serial monitor:
//Serial.print("sensor = ");
Serial.println(val);//to graph
}
این کد به راحتی کد blink است و در واقع از برخی از جهات حتی سادهتر است. تابع hallRead() تمام کارها را انجام میدهد و یک مقدار صحیح تولید میکند که خروجی سنسور را نشان میدهد. فقط کافی است این کد را در ESP32 بارگذاری کنید، سریال مانیتور را باز کنید (توجه داشته باشید که این کد برخلاف سایر موارد با ۹۶۰۰ Boud اجراء میشود ) و تنظیم مجدد را فشار دهید. شما یک رشته اعداد دریافت خواهیدکرد. حالا یک آهنربا را نزدیک ماژول ESP32 بیاورید و اعداد را مشاهده کنید. هنگام نزدیک شدن آهنربا به سنسور باید متوجه تغییر مشخصی شوید.
برای یک تجربهی بصری بیشتر، به جای سریال مانیتور، Serial Plotter را باز کنید. باید گرافی را مشاهده کنید که به وجود یا عدم وجود آهنربا شما پاسخ دهد.
کمرنگشدن نرمافزار LED
تغییر روشنایی LED یک کار کاملاً محبوب برای میکروکنترلر است. با استفاده از آردوینو از تابع analogWrite استفاده میکنیم که یک خروجی PWM (مدولاسیون عرض پالس) به پایههای خروجی فعالشده با PWM فراهم میکند. متفاوت بودن چرخهی کار سیگنال PWM، این است که روشنایی LED را کنترل میکند. با اینحال، analogWrite در ESP32 کار نمیکند. درعوض ما نیاز به استفاده از روش دیگری برای کنترل روشنایی LED داریم. ESP32 دارای ۱۶ کانال داخلی برای کنترل روشنایی LED است. شما میتوانید دقت تایمر PWM و فرکانس آن را کنترل کرده که این کار به شما امکان کنترل دقیق روشنایی LED را میدهد.
/*
LEDC Software Fade
This example shows how to software fade LED
using the ledcWrite function.
Code adapted from original Arduino Fade example:
https://www.arduino.cc/en/Tutorial/Fade
This example code is in the public domain.
*/
// use first channel of 16 channels (started from zero)
#define LEDC_CHANNEL_0 0
// use 13 bit precission for LEDC timer
#define LEDC_TIMER_13_BIT 13
// use 5000 Hz as a LEDC base frequency
#define LEDC_BASE_FREQ 5000
// fade LED PIN (replace with LED_BUILTIN constant for built-in LED)
#define LED_PIN 5
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
// Arduino like analogWrite
// value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
// calculate duty, 8191 from 2 ^ 13 - 1
uint32_t duty = (8191 / valueMax) * min(value, valueMax);
// write duty to LEDC
ledcWrite(channel, duty);
}
void setup() {
// Setup timer and attach timer to a led pin
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}
void loop() {
// set the brightness on LEDC channel 0
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
برای کار با اتصال ESP32 باید ثابت LED_PIN (در خط ۲۳) را از “۵” به “۲” تغییر دهید زیرا LED به GPIO2 متصل است. توجه داشتهباشید گه این طرح تابعی بهنام ledcAnalogWrite را تعریف میکند که به روشی مشابه عملکرد analogWrite آردوینو است. ممکن است بخواهید از آن در برنامههایی که برای کنترل LEDها ایجاد میکنید، استفاده کنید.
تکرار تایمر
مثال تکرار تایمر در اصل یک کرونومتر اساسی است. با فشاردادن دکمهی Reset (ENABLE) در ماژول ESP32، شمارش ثانیهها شروع میشود که برروی سریال مانیتور نمایش دادهمیشوند. شمارش تا زمان فشاردادن دکمهی فشار در ماژول ادامه خواهدداشت.
/*
Repeat timer example
This example shows how to use hardware timer in ESP32. The timer calls onTimer
function every second. The timer can be stopped with button attached to PIN 0
(IO0).
This example code is in the public domain.
*/
// Stop button is attached to PIN 0 (IO0)
#define BTN_STOP_ALARM 0
hw_timer_t * timer = NULL;
volatile SemaphoreHandle_t timerSemaphore;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
volatile uint32_t isrCounter = 0;
volatile uint32_t lastIsrAt = 0;
void IRAM_ATTR onTimer(){
// Increment the counter and set the time of ISR
portENTER_CRITICAL_ISR(&timerMux);
isrCounter++;
lastIsrAt = millis();
portEXIT_CRITICAL_ISR(&timerMux);
// Give a semaphore that we can check in the loop
xSemaphoreGiveFromISR(timerSemaphore, NULL);
// It is safe to use digitalRead/Write here if you want to toggle an output
}
void setup() {
Serial.begin(115200);
// Set BTN_STOP_ALARM to input mode
pinMode(BTN_STOP_ALARM, INPUT);
// Create semaphore to inform us when the timer has fired
timerSemaphore = xSemaphoreCreateBinary();
// Use 1st timer of 4 (counted from zero).
// Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more
// info).
timer = timerBegin(0, 80, true);
// Attach onTimer function to our timer.
timerAttachInterrupt(timer, &onTimer, true);
// Set alarm to call onTimer function every second (value in microseconds).
// Repeat the alarm (third parameter)
timerAlarmWrite(timer, 1000000, true);
// Start an alarm
timerAlarmEnable(timer);
}
void loop() {
// If Timer has fired
if (xSemaphoreTake(timerSemaphore, 0) == pdTRUE){
uint32_t isrCount = 0, isrTime = 0;
// Read the interrupt count and time
portENTER_CRITICAL(&timerMux);
isrCount = isrCounter;
isrTime = lastIsrAt;
portEXIT_CRITICAL(&timerMux);
// Print it
Serial.print("onTimer no. ");
Serial.print(isrCount);
Serial.print(" at ");
Serial.print(isrTime);
Serial.println(" ms");
}
// If button is pressed
if (digitalRead(BTN_STOP_ALARM) == LOW) {
// If timer is still running
if (timer) {
// Stop and free timer
timerEnd(timer);
timer = NULL;
}
}
}
مثال RepeatTimer در زیر منوی Timer است و نحوهی ایجاد یک کنترلکنندهی وقفه برای ESP32 را نشانمیدهد. کنترلکنندهی وقفه، عملکردی بهنام onTimer است که به تایمر متصلشده و هر ثانیه فعال میشود.
دکمه در حلقهی LOOP طرح خوانده میشود و برای متوقفکردن تایمر، عملکرد داخلی timerEnd را فراخوانی میکند.