<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فرهاد ادیبی</title>
        <link>https://virgool.io/feed/@farhad3113</link>
        <description>دانشجوی مهندسی برق و علاقه مند به رباتیک و اینترنت اشیاء</description>
        <language>fa</language>
        <pubDate>2026-06-17 02:34:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/57028/avatar/yoo9Km.png?height=120&amp;width=120</url>
            <title>فرهاد ادیبی</title>
            <link>https://virgool.io/@farhad3113</link>
        </image>

                    <item>
                <title>دانلود و پخش جلسات BBB با سرعت 2.5x</title>
                <link>https://virgool.io/uiRobotics/bbb-lasixuhav67h</link>
                <description>سلامامتحانات پایانترم نزدیکه و اگه شما هم مثل من کلاسارو گوش نکردین الان ساعت ها فیلم ضبط شده دارین که روی دستتون مونده. پس بیاین تا دست به دامن پایتون عزیز و دوستاش بشیم تا حداقل بتونیم با سرعت بیشتر کلاس های ضبط شده رو ببینیم ^_^دانلودر و پلیر بیگ بلو باتنعدم دسترسی به اینترنت، قطعی سایت، محدودیت زمانی مشاهده جلسات ضبط شده و عدم امکان پخش جلسات با سرعت بالاتر مشکلاتی هست که پس از خواندن این پست به تاریخ خواهند پیوست.پیش نیاز هابرای استفاده از این برنامه (وب اپ) نیازمند پایتون 3.6 و یا جدیدتر (به همراه pip) هستید.برای تشخیص نصب بودن پایتون از کلید میانبر Windows Key + R استفاده کنید و در پنجره Run عبارت cmd رو تایپ کنید و ok را بزنید. در محیط مشکی رنگ باز شده عبارت زیر را تایپ کنید و enter را بزنید.python --versionدر خروجی باید عبارتی مانند Python 3.9.1 دریافت کنید و عدد 3.9.1 ورژن پایتون نصب شده است که از 3.6 جدید تر هست. اگر به خروجی چیزی جز عبارت فوق بود از طریق این لینک پایتون را دانلود و نصب کنید.دانلود و نصب فایل های مورد نیازابتدا فایل های لازم رو از طریق این لینک دانلود کنید.فایل Zip رو از حالت فشرده خارج کنید و در مکانی دلخواه کپی کنید.سپس در فولدر مربوطه فایل setup.bat را اجرا کنید (در این مرحله دسترسی به اینترنت لازم است). پس از پایان عملیات با کلید Enter از پروسه نصب خارج شوید.اجرا وب اپجهت اجرای برنامه فایل run.bat را اجرا کنید. اگر همه چیز بدون مشکل انجام شده باشد با وارد کرد http://localhost:5000 در مرورگر، صفحه دانلود جلسات برای شما باز خواهد شد.برای دسترسی های آینده فقط کافیست همین مرحله را تکرار کنید.دانلود و پخش جلساتبرای دانلود جلسات ابتدا لینک جلسه مورد نطر را کپی کنید.کپی لینک جلسهبه آدرس http://localhost:5000 بروید و لینک کپی شده را در کادر لینک جلسه paste کنید.یک نام دلخواه برای این جلسه تایپ کنید و بر روی دکمه دانلود کلید کنید.دانلود فایل جلساتمنتظر تکمیل دانلود بمانید. با توجه به سرعت اینترنت شما این مرحله ممکن است چند دقیقه زمان ببرد.به طور میانگین حجم جلسات یک ساعته و بدون استفاده از وب کم و اسکرین شیر، کمتر از 50 مگابایت می باشد.پس از اتمام عملیات دانلود، جلسه دانلود شده با نامی که در مرحله قبل برای آن در نظر گرفتید در لیست جلسات قابل دسترسی است.لیست جلسات دانلود شدهبا کلیک بر روی اسم هر جلسه میتوانید جلسه مورد نظر را پخش کنید.پخش جلساتاز قسمت مشخص شده در عکس می توانید سرعت پخش را از 0.5 تا 2.5 برابر تغییر دهید و به صورت آفلاین به کلاس های دانلود شده دسترسی داشته باشید.سخن پایانیتا زمانی که دارید از وب اپ استفاده می کنید فایل run.bat باید باز باشه.فایل های دانلود شده در فولدر downloadedMeetings ذخیره می شوند و میتونید حذفشون کنید.فقط برای دانلود جلسات نیازمند اینترنت هستید و بعد از اون دیگه نیازی به اینترنت نیست.از طریق تلفن همراهی که توی یک شبکه با سیستم در حال اجرای فایل run.bat هست هم می تونید به صفحه دانلود و پخش جلسات دسترسی داشته باشید و کافیه به جای localhost در آدرس صفحه، آی پی آدرس سیستمتون رو وارد کنید.امیدوارم این پست مورد استفاده شما قرار گرفته باشه و کمکی کنه در گذر از پایانترم های جان فرسای کرونایی!منتظر نظرات، پیشنهادات و انتقادات شما هستم. </description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Sat, 01 May 2021 19:17:32 +0430</pubDate>
            </item>
                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@farhad3113/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-jvfx6px3ciqf</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/glawzcefx7is-DOasP.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۱۳,۸۶۰ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۶۳ مرتبه پسندیدند و  ۱۶ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۳۸ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۲,۴۱۱ بار خوانده شدند و ۴۱۵,۴۰۲ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۵۶۹۵۱۱۹ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۱۱,۹۸۹ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۵۶۹۵۱۱۹ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Mon, 22 Mar 2021 19:30:35 +0430</pubDate>
            </item>
                    <item>
                <title>وب سرور پیشرفته با ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp9-ng7bx9ychr6f</link>
                <description>سلامقسمت نهمدر قسمت هشتم با کتابخانه ESP Async WebServer یک صفحه وب طراحی کردیم که به کمک آن یک LED را می توان کنترل کرد. در این قسمت برای این صفحه وب Username و Password خواهیم گذاشت و طریقه سرو (Serve) کردن فایل های وب از حافظه جانبی را بررسی میکنیم + یکم HTMLAuthenticationبرای محدود کردن دسترسی به پنل (همون صفحه وب خودمون) می توانیم از نام کاربری و پسورد استفاده کنیم.در این قسمت روش ساده و خیلی کاربر نپسند(!) اون رو پیاده میکنیم و در قسمت های آینده روش های بهتر و گرافیکی تر را دنبال می کنیم.لازمه این بخش Redirect ها هستن پس اگر با اون ها آشنایی ندارید توصیه می کنیم از اینجا مطالعه کنید.ابتدا یک صفحه را جهت لاگین در نظر می گیریم. مثلا login/server.on(&amp;quot/login&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
    if(!request-&gt;authenticate(&amp;quotuser&amp;quot, &amp;quotpass&amp;quot))
        return request-&gt;requestAuthentication();
    request-&gt;send(200, &amp;quottext/plain&amp;quot, &amp;quotLogin Success!&amp;quot);
});در خط دوم این دستورات handle کردن این پیج، چک میکنیم آیا کاربر با یورزنیم user و پسورد pass لاگین کرده یا نه! اگر لاگین نکرده بود که تابع ()requestAuthentication را برمیگردانیم تا لاگین کند و اگر لاگین کرده بود مثلا پیغامی مبنی بر لاگین موفق ارسال می کنیم.صفحه لاگین و ورود یورزنیم، پسوردپس از وارد کردن یورزنیم و پسورد و کلیک بر روی Sign in درصورتی که یورزنیم و پسورد صحیح باشند متن Login Success! نمایش داده می شود.برای صفحه اصلی نیز چنین Authentication در نظر میگیریم.server.on(&amp;quot/&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
     if(!request-&gt;authenticate(&amp;quotuser&amp;quot, &amp;quotpass&amp;quot))
          request-&gt;redirect(&amp;quot/login&amp;quot);
     String index = &amp;quot&lt;html&gt;&lt;head&gt;&lt;title&gt;My Async WebServer&lt;/title&gt;&lt;/head&gt;&amp;quot
     index += &amp;quot&lt;body&gt;&lt;center&gt;Hello, World&lt;/center&gt;&lt;/br&gt;&amp;quot
     index += &amp;quot&lt;center&gt;&amp;quot + getLedStatus() + &amp;quot&lt;center&gt;&lt;/br&gt;&amp;quot
     index += &amp;quot&lt;button&gt;&lt;a href=\&amp;quot/on\&amp;quot&gt;ON&lt;/a&gt;&lt;/button&gt;&amp;quot
     index += &amp;quot&lt;button&gt;&lt;a href=\&amp;quot/off\&amp;quot&gt;OFF&lt;/a&gt;&lt;/button&gt;&amp;quot
     index += &amp;quot&lt;/body&gt;&lt;/html&gt;&amp;quot
     request-&gt;send(200, &amp;quottext/html&amp;quot, index);
 });فقط ابتدا فراخوانی این صفحه چک میکنیم که آیا Authentication موفقیت آمیز بوده یا خیر و اگر ناموق بوده به صفحه login ریدایرکت می کنیم.برای بهتر شدن کار در صفحه لاگین پس از لاگین موفق با استفاده از کد زیر به صفحه اول ریدایرکت می کنیم.request-&gt;redirect(&amp;quot/&amp;quot);اکنون فقط کاربرانی که لاگین کرده اند میتوانند به صفحه اصلی دسترسی پیدا کنند ولی همچنان صفحات on و off باز هستند و با لود کردن آنها توابع خاموش و روشن شدن led اجرا می شوند. پس همین کار را نیز برای سایر صفحات انجام می دهیم.چرا یک بار ریدایرکت میکنیم به login و سپس بر میگردیم؟ به دو دلیل: 1) اگر بعدا تغییر در صفحه لاگین دادیم روی تمام لاگین ها اعلام شود. 2) اصولی تره!کد های این قسمت را میتوانید از اینجا دریافت کنید. فایل های مربوط به Auth در فولدر SimpleAuth_ESP8266 قابل دانلود هستند.سرو کردن فایل ها از روی حافظه فلش هدف: فایل های html , ... را به جای اینکه در کد بنویسیم در جای دیگری ذخیره کنیم و زمانی که کاربر به آن ها نیاز داشت، فراخوانی کنیم.مقدمات LittleFSلیتل اف اس یک فایل سیستم سبک مخصوص میکروکنترلر هایی است که یک حافظه فلش به صورت SPI به آنها متصل است که ESP از این نوع هست. خیلی وارد تئوریجات نشیم!در اصل ما فایل های html, css, js و... حتی عکس و فیلم و... رو توسط LittleFS روی حافظه فلش ذخیره می کنیم و زمانی که لازم شد آن ها رو از این حافظه بارگزاری می کنیم.در کنار LittleFS موارد دیگری مانند SPIFFS هم هستند (آخرین باری که آردوینو رو آپدیت کردم با SPIFFS مشکل پیدا کرد و من هم رفتم سراغ LittleFS ولی عموما مشکلی نداره)در ابتدا لازم هست به آردوینو بگیم که فضایی که برای این کار میخواهیم چقدر باشه! از مسیر Tools --&gt; Flash Size گزینه مورد نظر رو انتخاب میکنیم.موارد قابل انتخاب بسته به بورد مورد استفاده ممکنه متفاوت باشه. من در اینجا 4MB حافظه فلش دارم که 2 مگابایت اون رو برای فایل سیستم در نظر می گیرم و تقریبا 1 مگ هم برای OTA (به زودی باش آشنا میشیم خیلی خفنه!) و حدود 1 مگ باقی میمونه که میشه حافظه فلش خودمون که کد ها رو نگه میداره.بریم سراغ کد ^_^اول دو کتابخونه زیر رو باید import کنیم#include &lt;FS.h&gt;
#include &lt;LittleFS.h&gt;در setup باید littleFS را فعال کنیم و مطمئن میشیم که فعال میشه!if (!LittleFS.begin()) {
    Serial.println(&amp;quotLittleFS mount failed&amp;quot);
    return;
}برای تست عملکرد صحیح ابتدا یک فایل در LittleFS مینویسیم و سپس میخوانیم و در سریال مانیتور چاپ میکنیم. پس توابع خواند و نوشتن به شرح زیر هستند:void readFile&#40;const char * path&#41; {
        File file = LittleFS.open(path, &amp;quotr&amp;quot);
        if (!file) {
                Serial.println(&amp;quotFailed to open file for reading&amp;quot);
                return;
        }

        Serial.print(&amp;quotRead from file: &amp;quot);
        while (file.available()) {
                Serial.write(file.read());
        }
        file.close();
}تابع readFile یک مسیر دریافت می کند و در صورت وجود فایل آن را خوانده و در سریال چاپ می کند.void writeFile&#40;const char * path, const char * message&#41; {
        File file = LittleFS.open(path, &amp;quotw&amp;quot);
        if (!file) {
                Serial.println(&amp;quotFailed to open file for writing&amp;quot);
                return;
        }

        if (file.print(message)) {
                Serial.println(&amp;quotFile written&amp;quot);
        } else {
                Serial.println(&amp;quotWrite failed&amp;quot);
        }
        file.close();
}تابع writeFile یک مسیر و عبارت دریافت می کند و در فایل می نویسد.در این توابع مسیر شامل اسم فایل هم هستند مثلا برای ایجاد یک فایل متنی با اسم text مسیر به صورت زیر است:&amp;quot/text.txt&amp;quotدر setup این دو تابع را فراخوانی میکنیم و ازصحت عملکرد LittleFS مطمئن می شویم.writeFile&#40;&amp;quot/text.txt&amp;quot, &amp;quotThis is a test file&amp;quot&#41;;
readFile&#40;&amp;quot/text.txt&amp;quot&#41;;و نتیجه کار، LittleFS به خوبی کار می کند.راستی با دستور ()LittleFS.format می تونید فایل سیستم رو فرمت کنید. (چه کول!)کد های این قسمت را میتوانید از اینجا دریافت کنید. فایل های مربوط به مقدمات در فولدر LittleFS_ESP8266 موجود می باشند.آپلود فایل روی LittleFSبرای آپلود فایل روی فایل سیستم ESP باید پلاگین زیر رو دانلود و نصب کنیدESP8266 LittleFS Plugin For Arduino IDEبعد از دانلود فایل zip کافیه محتوایاتش رو در پوشه tools آدوینو کپی کنید. (این پوشه رو عموما در documents فولدر arduino می تونید پیدا کنید.) در نهایت باید چنین چیزی داشته باشید.&lt;home_dir&gt;/Arduino/tools/ESP8266LittleFS/tool/esp8266littlefs.jarیک بار اردوینو رو ببندید و بعد از باز کردن همانند تصویر زیر پلاگین به آردوینو اضافه می شود.برای استفاده از این قابلیت لازمه در کنار فایل آردوینو یک فولدر به اسم data داشته باشید و فایل هایی که قراره آپلود بشن رو در این فولدر قرار بدین.حتما باید سریال مانیتور بسته باشه و ESP در مود پروگرم باشه تا فرایند انجام بشه.هنوز HTML یادتونه؟ پس بریم همون صفحه اصلی رو در یک فایل HTML بنویسیم.&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;My Async WebServer&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;center&gt;
            ESP8266 Control Panel&lt;/br&gt;
            &lt;button&gt;&lt;a href=&amp;quot/on&amp;quot&gt;ON&lt;/a&gt;&lt;/button&gt;
            &lt;button&gt;&lt;a href=&amp;quot/off&amp;quot&gt;OFF&lt;/a&gt;&lt;/button&gt;
        &lt;/center&gt;
    &lt;/body&gt;
&lt;/html&gt;این متن رو در یک فایل به اسم index.html ذخیره میکنیم. (در اینجا نمی تونیم وضعیت LED رو داشته باشیم چون String هر دفعه که صفحه لود میشه ساخته نمیشه که بتونیم محتواش رو تغییر بدیم فقط فایل از حافظه اصطلاحا سرو میشه! البته واسه اینم راهکارهای خوبی داریم که در قسمت Ajax, js آشنا میشیم.)و اصل ماجرا! چطوری بگیم این فایل هارو سرو کن؟کافیه توابع handle کردن صفحات رو به صورت زیر تغییر دهیم:    server.on(&amp;quot/&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
        if(!request-&gt;authenticate(&amp;quotuser&amp;quot, &amp;quotpass&amp;quot))
            request-&gt;redirect(&amp;quot/login&amp;quot);
        request-&gt;send(LittleFS, &amp;quotindex.html&amp;quot, &amp;quottext/html&amp;quot);
    });به جای ارسال متن در تابع send می گوییم از LittleFS (آرگومان اول) فایل index.html (آرگومان دوم) را که فرمت text/html دارد (آرگومان سوم) ارسال کن. حالا کافیه کد را مثل همیشه آپلود کنید و از طریق منو tools--&gt; ESP8266 LittleFS Data Upload فایل های موجود در فولدر data را نیز آپلود کنید (بستن سریال مانیتور حین آپلود فراموش نشه!)یکم فراتر بریم و یک عکس به نام img.png هم در فولدر Data قرار میدیم.برای ارسال عکس میتونیم از کد زیر استفاده کنیم    server.on(&amp;quot/img&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
        request-&gt;send(LittleFS, &amp;quotimg.png&amp;quot, &amp;quotimage/png&amp;quot, true);
    });این تابع در صورت درخواست آدرس img/ تصویر را ارسال می کند. و همانند قبل آرگومان اول محل ذخیره عکس، ارگومان دوم اسم فایل، ارگومان سوم نوع فایل که در اینجا عکس ما image/png است و آرگومان چهارم مشخص می کند که این عکس باید دانلود شود یا نه. اگر true باشد پس در درخواست عکس شروع به دانلود شدن می کند و اگر false باشد عکس در همان مرورگر نمایش داده می شود.از سرو کردن اصولی لذت ببرید ^_^کد های این قسمت را میتوانید از اینجا دریافت کنید. فایل های مربوط در فولدر Advanced_SimpleAuth_ESP8266 موجود هستند.ممنون که تا انتها با ما همراه بودین.در قسمت دهم از آموزش سعی میکنیم صفحه گرافیکی تری طراحی کنیم و همچنین اتفاقات را در یک فایل log ذخیره کنیم و جهت دانلود روی سرور قرار دهیم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Thu, 17 Sep 2020 01:42:34 +0430</pubDate>
            </item>
                    <item>
                <title>راه اندازی وب سرور غیر همزمان(Async) با ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp8-cm814qewmemq</link>
                <description>سلامدر قسمت هفتم یک وب سرور ساده با کتابخانه اورجینال ESP8266 راه اندازی کردیم و توسط وب توانستیم یک LED رو کنترل کنیم. در این قسمت کمی بیشتر با وب سرور و طراحی صفحات آشنا می شویم و با کتابخانه غیرهمزمان (Async) کار خواهیم کرد.نصب کتابخانه در آردوینودر قسمت قبل مشکل همزمان بودن کتابخانه اورجینال رو بررسی کردیم و چون دستور هندلینگ کلاینت ها در لوپ برنامه بود امکان استفاده از دستورات زمان بر در لوپ وجود نداشت. برای حل این مشکل از دو کتابخانه زیر استفاده خواهیم کرد:ESP Async TCPESP Async WebServerبرای نصب کتابخانه در آردوینو دو روش وجود دارد: مراجعه به مسیر Sketch --&gt; Include Library --&gt; Manage Libraries و جستوجو نام کتابخانه، در صورتی که کتابخانه در لیست موجود بود میتوانید آن را نصب کنید.در مسیر Sketch --&gt; Include Library گزینه Add .ZIP Library را کلیک کنید و فایل ZIP کتابخانه را آدرس دهی کنید.برای نصب کتابخانه های بالا با استفاده دو لینک زیر فایل ZIP آنها را دانلود می کنیم.Download ESP Async TCPDownload ESP Async WebServerسپس مطابق با روش دوم آنها را به آردوینو اضافه می کنیم.راه اندازی وب سرور با کتابخانه Async Web Serverدر اول برنامه کد های زیر را داریم: (کد ها رو یکجا میتونید از لینک آخر همین صفحه دانلود کنید)#include &lt;Arduino.h&gt;
#include &lt;ESP8266WiFi.h&gt;
#include &lt;ESPAsyncTCP.h&gt;
#include &lt;ESPAsyncWebServer.h&gt;

const char* ssid = &amp;quotYOUR_SSID&amp;quot 
const char* password = &amp;quotYOUR_PASSWORD&amp;quot

AsyncWebServer server(80);کتابخانه های ESPAsyncTCP و ESPAsyncWebServer را علاوه بر موارد قبلی فراخوانی می کنیم. همچنین پورتی که سرور روی آن اجرا می شود را نیز تعیین می کنیم (80). کانفیگ شبکه وای فای هم همانند قبل است.توابع led_on, led_off, handleNotFound که در جلسه قبل در مورد آنها صحبت کردیم نیازمند کمی تغییرات به شرح زیر هستند:void handleNotFound(AsyncWebServerRequest *request) {
    String message = &amp;quotPage Not Found\n\n&amp;quot
    message += &amp;quotURL: &amp;quot
    message += request-&gt;url();
    request-&gt;send(404, &amp;quottext/plain&amp;quot, message);

}
void led_on(AsyncWebServerRequest *request){
    digitalWrite(LED_BUILTIN, LOW);
    request-&gt;send(200, &amp;quottext/plain&amp;quot, &amp;quotLED is ON!&amp;quot);
}

void led_off(AsyncWebServerRequest *request){
    digitalWrite(LED_BUILTIN, HIGH);
    request-&gt;send(200, &amp;quottext/plain&amp;quot, &amp;quotLED is OFF!&amp;quot);
}در آرگومان تمام توابع باید AsyncWebServerRequest *request ارسال شود و دستور ارسال صفحه وب به  request-&gt;send تغییر یافته است. همچنین برای دریافت آدرس صفحه (بدون Hostname) باید عبارت ()request-&gt;url فراخوانی شود.کد Setupvoid setup() {
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);

    Serial.begin(115200);
    Serial.println(&amp;quot&amp;quot);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(&amp;quot.&amp;quot);
    }

    Serial.print(&amp;quot\nIP Address: &amp;quot);
    Serial.println(WiFi.localIP());

    server.on(&amp;quot/&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
        request-&gt;send(200, &amp;quottext/plain&amp;quot, &amp;quotHello, world&amp;quot);
    });
    server.on(&amp;quot/on&amp;quot, HTTP_GET, led_on);
    server.on(&amp;quot/off&amp;quot, HTTP_GET, led_off);
    server.onNotFound(handleNotFound);

    server.begin();
}بعد از تنظیم LED به عنوان خروجی و خاموش کردن آن، راه اندازی وای فای و چاپ آی پی به دستورات سرور می رسیم.در اینجا هم تابع  server.on کم متفاوت است. آرگومان اول که همان path است. اما آرگومان دوم روش (Method) تبادل دیتاست که فعلا HTTP_GET رو در نظر میگیریم و آرگومان سوم تابع مدیریت درخواست است. اگر تابع از پیش تعریف شده داشتیم که فقط اسم آن را parse می کنیم اگر نه به صورت (arg)[] تابع را در همان آرگومان تعریف می کنیم با این تفاوت که آرگومان تابعی که تعریف میکنیم AsyncWebServerRequest *request خواهد بود.و نهایتا دستورات NotFound و اجرای سرور.و اما بخش جذاب این کد حلقه Loop اون هست:void loop() {}آخه لوپ قشنگ تر از این هست؟ درسته من دشمن لوپ هستم!همون طور که در اول آموزش اشاره کردم این کتابخونه نیازی به Handle کردن client هست در لوپ نداره و مزیت خیلی بزرگیه، میتونیم هر چی دوست داشتیم در loop بنویسیم :)))بریم تست بگیریم! اگر همه چیز درست انجام شده باشه باید مثل قسمت قبل همه دستورات کار کنند.به سوی HTMLمی خواهیم وضعیت فعلی LED در صفحه Home نوشته شود!اول یک تابع تعریف می کنیم که اگر پایه LED_BUILTIN صفر بود یک رشته به معنی روشن بودن LED برگرداند و در غیر این صورت رشته خاموش بودن را برگرداند. (اگر نمی دونید چرا ولتاژ پین با وضعیت LED برعکسه به آموزش قبل مراجعه کنید)String getLedStatus(){
    if(digitalRead(LED_BUILTIN))
        return &amp;quotLED is OFF!&amp;quot
    else
        return &amp;quotLED is ON!&amp;quot
}سپس باید این خروجی را در صفحه اول نمایش دهیم. یعنی باید دیتایی که ارسال می شود شامل خروجی این تابع باشد.تابع هندل کردن صفحه اصلی را به صورت زیر تغییر می دهیم:server.on(&amp;quot/&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
    String index = &amp;quot&lt;html&gt;&lt;head&gt;&lt;title&gt;My Async WebServer&lt;/title&gt;&lt;/head&gt;&amp;quot
    index += &amp;quot&lt;body&gt;&lt;center&gt;Hello, World&lt;/center&gt;&lt;/br&gt;&amp;quot
    index += &amp;quot&lt;center&gt;&amp;quot + getLedStatus() + &amp;quot&lt;center&gt;&amp;quot
    index += &amp;quot&lt;/body&gt;&lt;/html&gt;&amp;quot
    request-&gt;send(200, &amp;quottext/html&amp;quot, index);
});این تابع زمانی که صفحه درخواست شد یک رشته به نام index تهیه می کند که شامل چند کد HTML است.(مقدمات HTML در پی نوشت آورده شده است) در خط چهارم این کد تابع getLedStatus فراخوانی شده و پس از اجرا و خواندن ولتاژ منطقی پایه LED یک رشته مبنی بر وضعیت آن بر می گرداند و در کد HTML قرار میدهد. و مورد آخر در این تابع داریم کد HTML ارسال میکنیم پس آرگومان دوم دستور send باید به &quot;text/html&quot; تغییر کند. اگر همون &quot;text/plain&quot; باشه چی میشه؟ امتحان کنید :)در صورتی که با استفاده از on/ یا off/ وضعیت LED را تغییر دهید و سپس به صفحه اول مراجعه کنید وضعیت آن به درستی نمایش داده می شود (دقت کنید که حتما باید صفحه Refresh بشه یا مجدد لود بشه! برای آپدیت Real-Time وضعیت LED نیازمند Ajax, Js هستیم!)در صفحه اول کد HTML به خوبی اجرا شده و title به عبارت دلخواه تغییر کرده و متن ها هم وسط صفحه به نمایش آمدند.ریدایرکت (Redirect)تا اینجا خوب اومدیم ولی یه مشکلی داره! باید کلی راه بریم on/ یا off/ رو بزنیم بعد کلی راه برگردیم توی صفحه اول وضعیتش رو ببینیم! پس بذاریم این راه هارو خودش بره :)باید کاری کنیم که وقتی به یکی از آدرس های on/ یا off/ رفتیم دوباره مارو به صفحه اول برگردونه به این عمل Redirect میگیم. خیلی هم آسونه.کافیه به در توابع led_on و led_off به جای اینکه بگیم یک صفحه جدید ارسال کن، Redirect کنیم پس به جای ()request-&gt;send کد زیر رو جایگزین میکنیم:request-&gt;redirect(&amp;quot/&amp;quot);آرگومان داخل redirect آدرسی است که میخواهیم ریدایرکت کنیم. می تواند یک آدرس داخلی باشد مثل &quot;/&quot; یا &quot;login/&quot; و هم میتواند یک آدرس خارجی باشد مثلا &quot;virgool.io&quot;حالا به محض وارد کردن آدرس های on/ یا off/ عملیات مربوطه روی LED اجرا می شود و مجددا به صفحه اول باز میگردد.خب الان نوبت برعکسشه! که از صفحه اول بتونیم به on/ یا off/ بریم. و این کار با HTML انجام میشه!برای این کار دو لینک باید داشته باشیم که به صفحات on/ و off/ بروند و زمانی که این آدرس ها درخواست شدند LED تغییر وضعیت می دهد، متن وضعیت LED تغییر میکند و به صفحه اول باز میگردد. پس کد هندلینگ صفحه اول را به شرح زیر اصلاح میکنیم:server.on(&amp;quot/&amp;quot, HTTP_GET, [](AsyncWebServerRequest *request){
    String index = &amp;quot&lt;html&gt;&lt;head&gt;&lt;title&gt;My Async WebServer&lt;/title&gt;&lt;/head&gt;&quot;
    index += &amp;quot&lt;body&gt;&lt;center&gt;Hello, World&lt;/center&gt;&lt;/br&gt;&quot;
    index += &amp;quot&lt;center&gt;&amp;quot + getLedStatus() + &amp;quot&lt;center&gt;&lt;/br&gt;&quot;
    index += &amp;quot&lt;button&gt;&lt;a href=\&amp;quot/on\&amp;quot&gt;ON&lt;/a&gt;&lt;/button&gt;&quot;
    index += &amp;quot&lt;button&gt;&lt;a href=\&amp;quot/off\&amp;quot&gt;OFF&lt;/a&gt;&lt;/button&gt;&quot;
    index += &amp;quot&lt;/body&gt;&lt;/html&gt;&quot;
    request-&gt;send(200, &amp;quottext/html&amp;quot, index);
});خط پنجم و ششم دو دکمه که هر کدام به لینک مربوطه اشاره می کند قرار داده شده و نتیجه به صورت زیر میشود. (برای درج double quotation یا همون &quot; در یک رشته باید آن را همراه با بک اسلش به صورت &quot;\ نویسیم)وب سرور نهاییپی نوشت: HTML _ این یک رفرنس HTML نیست _هر صفحه وبی از کد HTML و... تشکیل شده و HTML یک زبان نشانه گذاری است. ساختار کلی آن به صورت زیر است:&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt; PAGE TITLE &lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        CONTENT
    &lt;body&gt;
&lt;/html&gt;به هر کدوم از &lt;sth&gt; یک تگ HTML هستند و اغلب دارای تگ بسته شدن به صورت &lt;sth/&gt; هستند.این ساختار در هر صفحه ای ثابت است و فقط عبارت هایی به آن اضافه می شود در PAGE TITLE اسم صفحه رو وارد می کنید. و در بین تگ های body بدنه یا همون صفحه رو ایجاد می کنیم.توضیح برخی تگ ها:تگ center: عبارتی که بین این تگ قرار گیرد در وسط صفحه (وسط بلاک) قرار می گیرد.تگ br: این تگ یک خط جدید ایجاد می کند. همان r/n/ خودمان! این تگ، تگ بسته شدن ندارد و مجرد است.تگ button: این تگ یک دکمه ایجاد می کند. و عبارتی که بین آن قرار میگیرد متن دکمه خواهد بود.تگ a: با استفاده از این تگ میتوان لینک ایجاد کرد به این صورت که باید attribute (هر چیزی که بعدی از باز کردن تگ مینویسیم) مربوط به مرجع لینک (href) مقدار دهی شود. و عبارتی که بین آن قرار میگیرد متن لینک است. مثلا برای اینجا یک لینک به گوگل با عنوان GO to Google کد زیر را مینویسیم.&lt;a href=&amp;quotgoogle.com&amp;quot&gt;GO to Google&lt;/a&gt;حال اگر یک تگ a را داخل button بگذاریم اول متن تگ a در متن button نمایش داده می شود و ثانیا با کلیک بر روی دکمه به لینک مربوطه خواهیم رفت.اگر اطلاعات بیشتری در مورد HTML نیاز دارید میتوانید از لینک های زیر استفاده کنید.W3SchoolsSoloLearnچه کردیم و چه باید کنیم؟هنوز کارمون تموم نشده! یه مشکل داریم هر کسی لینک رو داشته باشه میتونه LED رو خاموش و روشن کنه؛ فرض کنید به جای LED توسط یک رله لامپ اتاق رو خاموش روشن بکنه و قرار کلی حرص بخوریم! پس باید یک authentication برای اون تعریف کنیم که مثلا فقط با یوزرنیم پسورد بشه خاموش و روشنش کرد.بنظرتون ذخیره کردن کوهی از کد HTML اون هم String توی حافظه فلش درسته؟ قطعا افتضاحه!!! این مشکل رو هم باید حل کنیم. (پیش به سوی SPIFFS , LittleFS)باید یکم صفحه رو خوشگل ترش کنیم، چیه این اخه؟! (پیش به سوی bootstrap و css)چقدر زیاد شد :( کد های این آموزش رو می توانید از اینجا دریافت کنید.همه موارد بالا رو در قسمت نهم و شاید هم در قسمت های بزرگ تر مساوی 9 انجام خواهیم داد :)اگر سوالی، ابهامی، نقدی، نظری، پیشنهادی و کلا هر درد دلی دارین در قسمت نظرات همراهتون هستم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Wed, 02 Sep 2020 00:00:31 +0430</pubDate>
            </item>
                    <item>
                <title>راه اندازی یک وب سرور ساده با ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp7-wwihff4ar6dh</link>
                <description>سلاااامدر قسمت ششم ESP رو به وای فای متصل کردیم و در این قسمت و احتمالا چند قسمت بعدی روی وب سرور کار خواهیم کرد.چی هست اصن؟خب وقتی یک سایت رو باز می کنید این اطلاعات از کجا میاد؟ از وب سرورپس وب سرور به تعریف ساده یک کامپیوتر متصل به شبکه است که یک سری فایل و احتمالا دیتابیس رو در خودش نگه داری میکنه مثلا فایل های HTML, JS, CSS یا عکس، فیلم و... و زمانی که کاربر این اطلاعات رو درخواست میکنه، فایل ها رو برای کاربر ارسال می کنه.ما قراره به ESP بگیم که وقتی کاربر یک آدرس رو وارد کرد بیا و مثلا یک صفحه HTML برایش بفرست!از اینجا به بعد ممکنه یکم مباحث وب و شبکه هم قاطی بحثمون بشه !!راه اندازی وب سرور با ESPاز اونجایی که آردوینو مثال درست و درمونی نداشت این کد زیر رو آماده کردم و طبق اون جلو میریم:#include &lt;ESP8266WiFi.h&gt;
#include &lt;ESP8266WebServer.h&gt;

#ifndef STASSID
#define STASSID     &amp;quotSSID&amp;quot                  // YOUR WIFI SSID
#define STAPSK      &amp;quotPASSWORD&amp;quot      // YOUR WIFI PASSWORD
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

ESP8266WebServer server(80);خب اول کتابخونه های لازم که ESP8266WiFi برای اتصال به شبکه و ESP8266WebServer برای اجرای وب سرور رو import کردیم.بعد دوتا define داریم که اسم و پسورد وای فایتون رو وارد می کنید که ESP به اون شبکه متصل بشه.و بعد هم یک Object به اسم سرور تعریف کردیم که آرگومان ورودی اون شماره پورتی هست که سرور قراره اجرا بشه. چندتا نکته:پورت پیشفرض همون 80 هست و اگر اون رو انتخاب کنید لازم نیست بعد از IP یا Host Name پورت رو وارد کنید.پورت 443 برای HTTPS هست. پس این پورت هم نیازی به وارد کرد بعد از آدرس نداره فقط باید Redirect ها رو مدیریت کنید.بعضی پورت ها رو نمیشه استفاده کرد چون برای یک کار دیگه ای در نظر گرفته شده اند. پس اگه می خواهید عوضش کنید لیست پورت های قابل استفاده رو در اینجا ببینید.اگر پورتی جز 80 یا 443 انتخاب کردید باید به صورت IP_or_Domain:Port در مرورگر وارد کنید.اگر بازم باز نشد یک / (اسلش) آخرش قرار بدین یا اول آدرس http or https بزنید تا مرورگر متوجه بشه یک هاست هست.void setup(void) {
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    Serial.println(&amp;quot&amp;quot);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(&amp;quot.&amp;quot);
    }

    Serial.println(&amp;quot&amp;quot);
    Serial.print(&amp;quotConnected to &amp;quot);
    Serial.println(ssid);
    Serial.print(&amp;quotIP address: &amp;quot);
    Serial.println(WiFi.localIP());

    server.on(&amp;quot/&amp;quot, []() {
        server.send(200, &amp;quottext/plain&amp;quot, &amp;quotHello My Little Server&amp;quot);
    });
    server.begin();
    Serial.println(&amp;quotHTTP server started&amp;quot);
    }و اما بخش مهم کار! اول که سریال مانیتور استارت شده، بعد اتصال به وای فای و چاپ کردن آی پی ESP. تا اینجا رو قبلا داشتیم!دستور بعدی  ()server.on یک تابع هست که عموما دوتا پارامتر ورودی دارد یکی path و یک کاری که باید پس از ریکوئست دادن به اون path انجام بده. در اینجا پارامتر اول &quot;/&quot; هست یعنی همون آدرس خالی (HomePage). نگران نباشید در ادامه مثال های بیشتری خواهیم داشت!پارامتر دوم یک خودش یک تابع هست! میتونید قبل از setup یک تابع تعریف کنید یا همین جا اون تابع رو معرفی کنید. این ()[] یعنی یک تابع و اگر توی پرانتز اسم یک متغیر رو بنویسید به عنوان آرگومان اون تابع درنظر گرفته میشه و بعدش هم که { روتین تابع } رو مینویسید. توی روتین تابع یک دستور send داریم. آرگومان اول کد هست که عدد 200 به معنی ok هست. ارگومان بعدی نوع دیتایی هست که میخواهیم بفرستیم که در اینجا یک متن معمولی هست پس text/plain رو در نظر میگیریم. و نهایتا آرگومان سوم دیتای ما هست یعنی همون متن معمولی که متنی که دوست داریم در اون صفحه وب نمایش داده بشه رو می نویسیم.در آخر با دستور  ()server.begin سرور را اجرا میکنیم. پس بعد از اون برای این که مطمئن بشیم این دستور اجرا شده و سرور اصطلاحا بالا اومده توی سریال متنی رو چاپ میکنیم.برخی از ارور کد ها:200 که یعنی همه چی رو به راهه.404 رو هم میدونید دیگه یعنی Not Found یا چنین صفحه ای وجود ندارد.403 به معنی عدم دسترسی هست! احتمالا توی گوگل این ارور کد رو زیاد دیدین و یعنی از ایران اجازه دسترسی نداریم به این صفحه.سری 500 خطاهای سمت سرور هست یعنی توی سرور یه مشکلی هست یا سرور در دسترس نیست.هنوز تموم نشده بریم سراغ لوپvoid loop(void) {
    server.handleClient();
}توی لوپ برنامه باید بگیم که درخواست های کاربر رو رسیدگی! (هندل) کن.خب همه چی آماده است. کد رو آپلود میکنیم. و منتظر می مونیم تا ESP به شبکه وصل بشه و آی پی رو بهمون بده و همچنین سرور رو run کنه!الان کافیه از یک دیوایسی که روی همون شبکه هست آی پی ESP رو در مرورگر سرچ کنیم و یک صفحه خیلی ساده با متن Hello My Little Server نمایش داده میشه. تا اینجا یعنی یک وب سرور کوچیک رو راه اندازی کردیم ^_^دوباره یک سری نکته! برای دسترسی به یک پورت اولا باید اون پورت به چیزی اختصاص داشته باشه (که ما پورت 80 رو به وب سرور اختصاص دادیم).دوما باید توسط دیوایسی که اون پورت رو ایجاد کرده و همچنین فایروال ها اجازه دسترسی داشته باشیم.سوما باید توی یک شبکه باشیم (بیشتر مربوط میشه به آی پی البته!) مثلا سیستمی که وب سرور را ایجاد کرده و سیستمی که اون رو مشاهده می کنه به یک مودم وای فای وصل باشند. حتی این شبکه میتونه توسط خود ESP ایجاد بشه و شما به ESP متصل بشید! احتمالا در مباحث آینده داریم!اگر بخواهیم از طریق اینترنت (دیوایسی که به شبکه فعلی ESP متصل نیست ولی دسترسی به اینترنت دارد) به ESP که آن هم به یک مودم متصل است و خود مودم هم به اینترنت متصله، صفحه وب رو ببینیم میشه؟ معلومه که میشه چون هم سرور و کلاینت در یک شبکه (اینترنت) هستند فقط باید اجازه دسترسی به پورت 80 مربوط به آی پی ESP رو در مودم/روتر آزاد کنید. و با یک Port Forwarding در روتر ترافیک مثلا پورت 5000 آی پی گلوبالتون در نت رو به پورت 80 آی پی ESP اتنقال بدین! کار خاصی نداره البته. فقط اینکه آی پی گلوبال تو نت با هر بار قطع و وصل شدن عوض میشه و باید مشکلات امنیتیش رو به جون بخرید!بیخیال اینا! بریم سر کار خودمونHandle Not Foundبیاین یک صفحه دیگه رو سرچ کنیم! مثلا YourIP:Port/lamp یعنی مثلا چنین چیزی: http://192.168.1.10/lamp خب با یه صفحه زشت 404 مواجه میشیم که یعنی این صفحه وجود ندارد.می خواهیم ببنیم چطوری Not Found ها رو Handle کنیم.اول توی همون کد قبل از setup کد تابع به اسم onNotFound تعریف میکنیمvoid onNotFound() {
    String message = &amp;quotFile Not Found\n\n&amp;quot
    message += &amp;quotURI: &amp;quot
    message += server.uri();

    server.send(404, &amp;quottext/plain&amp;quot, message);
}این تابع زمانی که اجرا بشه یک String درست میکنه که شامل یک پیغام و آدرس اون صفحه است. و یک 404 ارسال میکند که متن آن همین String است.و حالا باید در Setup برنامه بگوییم زمانی که صفحه ای که وجود نداشت درخواست شد این تابع را اجرا کن! به این منظور کد زیر را بعد از sever.on قبلی و قبل از اجرا سرور در تابع setup درج میکنیم.server.onNotFound(onNotFound);و حالا با درخواست کردن یک صفحه ای که موجود نیست میتوانیم به صفحه 404 خودمان برسیم :)صفحه عدم وجود lampخیلی طولانی شد ولی برای اینکه یک خروجی درست حسابی داشته باشیم بیاین با وب یک LED رو خاموش و روشن کنیم.اجرا دستورات آردوینو در متن سرور دوتا تابع داریم به اسم های led_on , led_off و قبل از setup تعریف میکنیم:void led_on(){
    digitalWrite(LED_BUILTIN, LOW);
    server.send(200, &amp;quottext/plain&amp;quot, &amp;quotLED is ON!&amp;quot);
}
void led_off(){
    digitalWrite(LED_BUILTIN, HIGH);
    server.send(200, &amp;quottext/plain&amp;quot, &amp;quotLED is OFF!&amp;quot);
}این دوتا تابع زمانی که اجرا بشن led روی برد ESP روشن و خاموش می کنند. شاید بپرسین چرا اسم تابع با HIGH LOW بودن پایه برعکس؟ چون پایه رو که صفر کنید مدار روشن شدن تکمیل میشه! عکس زیرesp8266 led built schematicو در setup برنامه پایه led را خروجی میکنیم:pinMode(LED_BUILTIN, OUTPUT);
server.on(&amp;quot/on&amp;quot, led_on);
server.on(&amp;quot/off&amp;quot, led_off);  یادتون هست که آرگومان دوم server.on تابع بود؟ الان هم اسم تابع هایی که از قبل نوشتیم را بدون پرانتز وارد می کنیم! و تمامحالا با وارد کردن on/ یا off/ بعد از آی پی ESP ضمن خاموش و روشن کردن LED در صفحه وب هم اطلاع می دهد که LED خاموش یا روشن شد. مثلا http://192.168.1.10/onکلا در تابع هندل کردن صفحات وب میتونید تمام دستورات آردوینو رو استفاده کنید به شرطی که خیلی زمان بر نباشند.اگر شما هم به فکر این افتادین که به جای LED یک رله وصل کنید و لامپ اتاقتون رو با وب خاموش و روشن کنید، صبر کنید!!مشکل این کتابخانهحلقه loop رو ببنید. لازمه که همیشه server.handleClient اجرا بشه و اگر نشه چی؟ سرور بالا نمیاد. مثلا فرض کنید یک دستور زمان بر یا مثلا delay در این حلقه داریم؛ تا زمانی که این دستورات اجرا نشه و به handleClient نرسه شما باید منتظر بارگزاری صفحه مورد نظرتون باشید! این یعنی فاجعه! به همین دلیل خیلی از این مثال و کتابخونه خوشم نمیاد :(کد های این قسمت را می توانید از اینجا دانلود کنید.شما هم مثل من از این کتابخونه خوشتون نیومد؟ یا دوست دارین وب پنل کاربر پسندتری داشته باشین؟منتظر قسمت هشتم باشید تا در حل این موضوع با هم همراه باشیم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Sat, 29 Aug 2020 02:21:40 +0430</pubDate>
            </item>
                    <item>
                <title>دستورات مقدماتی وای فای ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp6-jjrzlcvypek3</link>
                <description>سلام!در قسمت پنجم از سری ماژول وای فای ESP8266 طریقه برنامه این ماژول با IDE آردوینو توضیح داده شد و کد Hello World برقی رو آپلود کردیم (همون Blink). در این قسمت دستورات پایه وای فای را بررسی خواهیم کرد. پس همراه ما باشید  دستورات وای فایبا Example های کتابخونه شروع میکنیم، مثال های مربوط به وای فای ESP در مسیر زیر هستند:File --&gt; Examples --&gt; ESP8266WiFiاسکن شبکه هابرای اسکن شبکه های وای فای موجود کد WiFiScan رو باز میکنیم.توی این کد از هدر فایل ESP8266WiFi.h استفاده شده که اغلب دستورات اتصال به شبکه وای فای رو در خودش داره.در تابع Setup بعد از راه اندازی پورت سریال با کد زیر مواجه میشد:WiFi.mode(WIFI_STA);
WiFi.disconnect();خط اول کد مشخص میکنه که ESP در وضعیت Station هست (یعنی قرار هست به یک اکسس پوینت متصل بشه) و در خط دوم اگر به شبکه وای فای متصل بوده، قطع می شود.در loop برنامه ابتدا تمام شبکه های موجود توسط دستور زیر اسکن می شوند:int n = WiFi.scanNetworks();که n تعداد شبکه های پیدا شده است.و سپس یک حلقه for که اسم شبکه وای فای WiFi.SSID، قدر سیگنال اون WiFi.RSSI و همچنین نوع رمزنگاری شبکه WiFi.encryptionType در سریال مانیتور چاپ می شود. البته تمام توابع فوق یک ورودی دارند که عددی است بین صفر تا n و شبکه وای فای مورد نظر رو تعیین می کند.در مورد قدرت سیگنال در پی نوشت همین پست بیشتر بخونید!اتصال به یک شبکهبرای اتصال به یک وای فای کافیه SSID و Passwrod اون رو به صورت زیر در کد وارد کنید:WiFi.begin(SSID, PASSWORD);البته ورودی این تابع میتواند دو پوینتر (متغیر) const char* باشد. پس از اجرای این دستور ESP تلاش می کند به شبکه وای فای موجود متصل شود. پس از اتصال خروجی تابع WiFi.status برابر با WL_CONNECTED خواهد شد.پس میتونیم برای نشان دادن اتصال از کد زیر استفاده کنیم تا زمانی که در حال اتصال است نقطه چاپ کند و پس از اتصال از طریق سریال مانیتور اطلاع دهد.while (WiFi.status() != WL_CONNECTED) {
       delay(500);
       Serial.print(&amp;quot.&amp;quot);
}
Serial.println(&amp;quot&amp;quot);
Serial.println(&amp;quotWiFi connected&amp;quot);
Serial.println(&amp;quotIP address: &amp;quot);
Serial.println(WiFi.localIP());در کد بالا تابع WiFi.localIP پس از اتصال IP ماژول را در شبکه متصل شده بر میگرداند.اتصال به چند شبکهدر قسمت قبل ESP فقط به شبکه معرفی شده می توانست متصل شود و اگر شبکه در دسترس نبود نمیتوانست به جایی وصل شود. در این جا یک لیست به ESP خواهیم داد تا به هر کدام دردسترس بود یا قدرت سیگنال بیشتری داشت متصل شود.برای این منظور مثال WiFiMulti رو باز کنید. در این مثال علاوه بر هدر فایل ESP8266WiFi از ESP8266WiFiMulti.h هم استفاده شده که مربوط به اتصال به چند شبکه است.با استفاده از کد زیر میتوانید لیست شبکه ها را به  ESP معرفی کنید.wifiMulti.addAP(&amp;quotSSID1&amp;quot, &amp;quotPASSWORD1&amp;quot);
wifiMulti.addAP(&amp;quotSSID2&amp;quot, &amp;quotPASSWORD2&amp;quot);
wifiMulti.addAP(&amp;quotSSID3&amp;quot, &amp;quotPASSWORD3&amp;quot);و زمانی که ESP به یکی از شبکه ها متصل شد تابع wifiMulti.run() خروجی WL_CONNECTED را بر میگرداند.پی نوشت: قدر سیگنال!تابع ()WiFi.RSSI اگر با آرگومان فراخوانی شود قدر سیگنال شبکه ای که ایندکس آن به تابع داده شده را بر میگرداند و اگر بدون آرگومان باشد و همچنین به یک شبکه متصل باشیم، قدرت سیگنال شبکه متصل را خواهد داد.این قدرت سیگنال یک عدد منفی بین صفر تا 120- است بر حسب دسیبل (dBm) که متناسب است با میلی وات (خیلی تئوری شدااا) اگر این عدد:بزرگ تر مساوی 50dBm- باشد یعنی قدرت سیگنال 100% است مثلا 25dBm- کوچک تر مساوی 100dBm- باشد یعنی قدرت سیگنال 0% است مثلا 110dBm-در غیر این موارد قدرت سیگنال از رابطه 2×(dBm + 100) بدست می آید مثلا 75dBm- معادل 50% است.معمولا قدرت سیگنال کمتر از 80dBm- بسته به نویز محیط، شبکه پایداری نخواهد بود!ممنون که همراه ما بودین. در قسمت هفتم ساخت یک وب سرور ساده را با ESP8266 شروع خواهیم کرد.پیشاپیش منتظر نظرات، پیشنهادات و انتقادات شما هستم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Fri, 28 Aug 2020 01:54:55 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp5-ybvscgdvqtzj</link>
                <description>بعد از یه غیبت نسبتا زیاد سلام! بالاخره امتحانات تموم شد :)در قسمت های قبلی با سخت افزار ماژول وای فای ESP8266 آشنا شدیم و الان در قسمت پنجم نوبت به برنامه نویسی اون هست.NodeMCUزبان های برنامه نویسی در قسمت اول دیدم که با آردوینو، پایتون، LUA، C و... میشه برای این ماژول برنامه نوشت که در این قسمت محوریت آردوینو هست. اگر دوست دارین با آردوینو بیشتر آشنا بشین لینک زیر میتونه مفید باشه https://vrgl.ir/Kap1n نصب IDE آردوینوبرای نصب آردوینو کافیه از لینک زیر نسخه متناسب با سیستم عاملتون رو دانلود کنید و مثل بیشتر نرم افزار ها برای نصب فقط Next بزنید :) https://www.arduino.cc/en/Main/Software محیط این IDE به صورت زیر هستArduino IDEفرض کردیم با این نرم افزار و برنامه نویسی با اون آشنایی دارین!نصب ESP8266 روی آردوینوبرای اینکه آردوینو بتونه کد ها رو برای ESP کامپایل کنه باید یک سری فایل ها رو نصب کنیم. به این منظور باید به منوی File مراجعه کنید و وارد Preferences بشین.در پنجره باز شده باید لینک زیر رو در قسمت Additional Boards Manager URLs وارد کنید.https://arduino.esp8266.com/stable/package_esp8266com_index.jsonبا این کار لینک دانلود فایل های مورد نیاز رو به آردوینو معرفی کردیم.از منو Tools قسمت Board، گزینه Boards Manager رو انتخاب کنید.در کادر جستوجو ESP8266 را وارد کنید. و با انتخاب ورژن از لیست کشویی روی Install کلیک کنید.پس از پایان دانلود و نصب فایل ها، در مسیر Tools --&gt; Board تعدادی برد مربوط به ماژول ESP اضافه می شوند. همچنین با انتخاب برد، Example های مربوط به آن برد در مسیر File --&gt; Examples در دسترس خواهند بود.در این آموزش ها مبنا برد NodeMCU خواهد بود برای انتخاب این برد باید NodeMCU 1.0 (ESP12E Module) رو انتخاب کنید. اگر از برد های دیگری استفاده می کنید مثل Wemos Mini D1 pro که در قسمت های قبل معرفی شد یا خود ماژول ESP مانند عکس فوق گزینه مربوطه رو انتخاب کنید.و در آخر بورد NodeMCU را متصل کنید و پورت سریال مربوطه که در اینجا COM2 هست را انتخاب کنید.تقریبا آماده است!آپلود اولین کدبرای تست عملکرد صحیح کد یک LED چشمک زن را روی برد آپلود می کنیم. در مسیر زیر کد مربوطه رو باز کنید.File --&gt; Examples --&gt; ESP8266 --&gt; Blinkکد فوق LED روی برد را به حالت چشمک زن تنظیم می کند. پایه مربوط به LED روی برد با LED_BUILTIN شناخته می شود.برای آپلود کافیه دکمه Upload رو بزنید یا Ctrl + U و منتظر بمونید تا آپلود انجام بشه.پ ن: اگر از برد ESP استفاده میکنید تقریبا همیشه بدون مشکل آپلود میشه اما اگر از ماژول ESP استفاده می کنید با اول اون رو روی حالت پروگرم شدن بوت کنید که با صفر و یک کردن پایه های خاصی این اتفاق میوفته ( به دیتاشیب مراجعه کنید)خب این هم از این! منتظر قسمت ششم باشین تا کار های خفن تری با ESP انجام بدیم...</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Mon, 27 Jul 2020 17:17:34 +0430</pubDate>
            </item>
                    <item>
                <title>توسعه پذیرترین برد ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp4-iau93cjn0drw</link>
                <description>سلامدر قسمت چهارم از سری ماژول وای فای ESP، می خواهیم با یکی از خفن ترین برد های مبتنی بر ESP8266 آشنا بشیم یعنی Wemos D1!Wemos D1 Mini Proبرد Wemos D1 Mini Pro که به اختصار بهش Wemos d1 میگیم، بردی شبیه به NodeMCU هست (اگر میخواهید با NodeMCU آشنا شوید قسمت سوم را مطالعه کنید)وموس مدل های مختلفی با هسته ESP8266 داره که بنظر من کاربردی ترین و بهترینشون همین D1 mini pro هست.Wemos D1 Mini Proسایز وموس از NodeMCU خیلی کوچک تر هست و برخلاف NodeMCU میتونید آنتن خارجی هم به اون وصل کنید. حافظه فلشی که در این برد تعبیه شده 16 مگابایت هست! و 16 پایه داره که 11 تای اونها I/O هستند ولی تقریبا تمام پین های لازم رو داره. مثل NodeMCU ولتاژش 3.3 ولت هست (اون 5 ولتی که میبینید همون ورودی میکرو USB هست) با فرکانس های 80 و 160 مگ هم میتونه کار کنه و...چرا توسعه پذیر ترین؟وموس شیلد (shield) های آماده بسیار زیادی داره که بدون کمترین دردسر میشه اون رو توسعه داد.تعدادی از شیلد هاتعدادی از این شیلد ها رو در بالا میبینید. مثلا شیلد button که روی وموس نصب میکنید و میتونید مقدار دیجیتال یک پین را صفر و یک کنید. یا شیلد رله و...یک شیلد خاص هم به اسم Dual Base داره که اگر خواستید شیلد هارو کنار هم نصب کنید نه روی هم از اون استفاده میشه. شیلد باتریش خیلی خوبه ^_^این کانفیگی که میبینید شامل یک برد Wemos d1 mini هست به عنوان پردازشگر، یک باتری لیتیومی که به شیلد باتری وصل شده، یک شیلد SHT30 که سنسور دما و رطوبت هست و در نهایت یک نمایشگر OLED برای نمایش دما و رطوبت. سخت افزار شما تکمیله فقط کافیه کد رو آپلود کنید.به همین راحتی، نه سیم میخاد، نه برد بورد، نه PCB! برای همین توسعه پذیر ترینه :))راستی دیتاشیت دقیق تمام شیلد ها در اینترنت موجوده. حتی خودتونم میتونید برای وموس شیلد طراحی کنید.TFT 2.4 Touch Shieldشیلد بالا یکی از مورد علاقه ترین شیلد های منه! چرا؟ چون یک نمایشگر لمسی 2.4 اینچی TFT به وموس شما اضافه میکنه :) آخرش کدوم؟هیچ فرقی نمیکنه که شما از Wemos استفاده میکنید یا از NodeMCU! حتی خود ماژول های ESP. برنامه نویسی اونها مثل همه و فقط اسم پایه ها رو باید تغییر بدین. اگر خیلی به سخت افزار علاقه ندارید، با وموس به راحتی کل سخت افزار رو پیاده کنید. یا اگر میخواهید دستتون توی سخت افزار بیشتر باز باشه و هر مداری خواستید ببندید NodeMCU به کمکتون میاد.ولی اگر دیوونه سخت افزارین قطعا درگیر شدن با ماژول ها و حتی آی سی ESP شمارو به جنون میرسونه! تصمیم با خودتون، یکی رو انتخاب کنید تا استارت کد زدن رو در قسمت پنجم بزنیم. </description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Wed, 13 May 2020 17:45:16 +0430</pubDate>
            </item>
                    <item>
                <title>برد همه فن حریف NodeMCU</title>
                <link>https://virgool.io/uiRobotics/esp3-xrv7nhfbu0tw</link>
                <description>سلامدر قسمت دوم با ماژول های ESP8266 آشنا شدیم. در این قسمت و قسمت بعدی با دوتا از معروف ترین برد ها این ماژول یعنی NodeMCU و Wemos D1 آشنا خواهیم شد.برد NodeMCU چیست؟خب NodeMCU یک برد هست که روی اون ماژول ESP8266-12 قرار گرفته و در کنارش امکاناتی برای استفاده راحت تر از ESP فراهم اومده.برد NodeMCUاز جمله امکانات این برد که در قسمت اول هم به اونها اشاره کردیم، قرار گرفتن آی سی USB به سریال هست. این آی سی بسته به برد NodeMCU میتونه CH340g یا CP2102 باشه و برای پروگرم کردن این برد دیگه نیازی به سیم کشی و Pull-up/down کردن پایه ها نیست. فقط کافیه NodeMCU رو با یک کابل Micro-USB به سیستموتون وصل کنید دقیقا مثل آردوینو. (واو! حقیقتا که خود ماژول پیرمون کرد تا پروگرم بشه)سخت افزار NodeMCUNodeMCU Hardwareطبق عکس NodeMCU سه تا پایه 3.3 ولت داره که از خروجی رگولاتور روی برد میاد و با Vcc ماژول مشترک هست. همچنین یک پایه Vin که برای تغذیه خارجی مثلا آداپتور! این پایه به ورودی رگولاتور و Vcc پورت USB  وصل هست پس اگر با USB برد رو تعذیه می کنید میتونید با این پایه به ولتاژ USB یعنی 5 ولت دسترسی داشته باشید.سخت افزار NodeMCUبرد NodeMCU مجموعا 2 عدد LED روی خودش داره. LED اول که روی خود برد هست به پایه GPIO16 ماژول ESP8266 وصل شده و پایه D0 نود ام سی یو هست. پس برای روشن کردن این LED کافیه پایه D0 رو 1 کنید. LED دوم که روی خود ماژول هست به پایه GPIO2 وصل هست یعنی پایه D4 برد.این برد دو تا کلید هم داره که برای ریست و پروگرم استفاده میشه برای رفتن روی مود پروگرم کافیه کلید Flash رو نگه دارید و برد رو ریست کنید. البته نیازی نیست وقتی با آردوینو پروگرم میکنید مستقیم خودش میره تو مود پروگرم و بعد از اتمام ریست میشه و روی مود عادی بوت میشه.NodeMCU CP2102 ICدر عکس بالا هم آی سی USB به سریال CP2102 رو مشاهده می کنید.بررسی پایه های NobdeMCUبرد NodeMCU دارای 30 پایه است که در ادامه بررسی می کنیم اونهارو. (البته همشون در حالت عادی قابل استفاده نیستند)odeMCU Pinout پایه های قرمز و مشکی: از رنگش دیگه پیداست برای پاور هست و مجموعا 8 پایه به این منظور درنظر گرفته شده.پایه های زرد: این پایه های برای کنترل عملکرد های ماژول هست مثلا CHIP_EN که برای فعال کردن ماژول استفاده میشه و روی برد پول آپ شده. از پایه RST هم میتونید برای ریست خارجی استفاده کنید. با پایه Flash هم که آشنا هستید و اما پایه WAKE، این پایه برای بیدار کردن میکرو از خواب هست.پایه نارنجی A0: این پایه همون مبدل آنالوگ به دیجیتال هست. (ولتاژ آنالوگ رو میشه باش خواند مثلا ولتاژ پتانسیومتر)پایه های آبی: برای ارتباط I2C استفاده میشن که شامل پایه کلاک SCL و پایه دیتا SDA هست.پایه های بنفش: همون GPIO های خودمون هستند. همشون به طور مستقیم در دسترس نیستند توی برنامه نویسی بررسی میکنیمپایه های سورمه ای: این پایه ها برای ارتباط SPI هستند (سریع ترین ارتباط سیمی راه نزدیک) البته به طور دقیق تر بخوام بگم پایه های HSPI هستند ولی همون SPI خودمونه!پایه های سبز: اسم این پایه ها رو خیلی شنیدید پایه های ارتباط سریال! البته بیشتر از Tx , Rx اونها استفاده میشود.پایه های اون یکی سبز: این پایه ها برای اتصال SD کارت به ماژول هست. (یکم سخت میشه بحث باید معماری کامل ماژول رو بدونید. شاید یه روز یه پست اختصاصی گذاشتم واسه SD کارت)پایه های خاکستری هم نگاهشون نکنید اینها رزرو شدن.پایه های سینوسی: برای تولید پالس PWM از 4 پایه ای استفاده میشه که این علامت رو دارند.(امیدوارم به اسم رنگ هام ایراد نگیرید :) )درمورد پایه ها دقت کنید که زمان برنامه نویسی باید از اسمی که روی برد نوشته شده استفاده کنید!در قسمت چهارم با برد WEMOS D1 mini pro آشنا خواهیم شد ولی در قسمت برنامه نویسی با NodeMCU کار خواهیم کرد (البته هیچ فرقی نمیکنه فقط اسم پایه ها متفاوته)راستی اگر به این جور مطالب علاقه مند هستید پیج من و پیج انجمن رباتیک دانشگاه اصفهان رو در ویرگول میتونید دنبال کنید تا پستی رو از دست ندهید. ;=)پیشاپیش منتظر نظرات شما هستم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Sat, 09 May 2020 00:39:50 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با سخت افزار ESP8266</title>
                <link>https://virgool.io/uiRobotics/esp2-yvtuwrzcrffv</link>
                <description>سلامدر قسمت دوم از سری ماژول ESP درمورد ویژگی های سخت افزاری این برد صحبت میکنیم. پشنهاد میکنم حتما قسمت اول رو مطالعه کرده باشید.هسته برد های ESP8266همون طور که در قسمت قبل دیدیم برد های ESP دارای آی سی ESP8266EX هستند از ویژگی های این آی سی موارد زیر رو بررسی میکنیم:پردازنده این آی سی یک میکروپروسسور 32 بیتی به نام Tensilica L106 با معماری ARM هست و در حالت عادی با ولتاژ 2.5 تا 3.6 ولت تغذیه میشه و جریان میانگین 80 میلی آمپر میکشه.حداکثر فرکانس کاری این میکروپروسسور 160MHz هست! (بازم برین با آردوینو 20 مگی کد بزنید) که در حالت پیشفرض با 80 مگاهرتز به فروش میرسه.این پروسسور فاقد حافظه فلش داخلی هست و باید از حافظه فلش اکسترنال که با باس SPI به اون وصل میشه استفاده کنید. (نگران نباشید شما نیاز نیست اینکارو بکنید و فقط ماژول رو میخرید) از نظر تئوری هم تا 16MB از حافظه فلش پشتیبانی میکنه.شبکه وای فای این آی سی 2.4GHz هست و از استاندارد b/g/n 802.11 پشتیبانی میکنه اما همون طور که گفتم فقط 2.4 گیگاهرتزش! همچنین از لحاظ تئوری میتونه تا 72.2 مگابیت بر ثانیه نرخ دیتا داشته باشه. (تئوری!)در حالت های فقط اکسس پوینت - فقط ایستگاه (Station) و هم اکسس پوینت و هم استیشن میتونه فعالیت کنه.برای ارتباط فیزیکی با پایه های اون هم از UART/ SDIO/ SPI/ I2C/ I2S/ IR Remote Control/ GPIO/ ADC/ PWM میتونید استفاده کنید. (نترسید کم کم یادشون میگیرید)این از اصن قضیه بریم سراغ ماژول ها!ماژول های ESP8266ماژول های زیادی از esp وجود دارند و فرقشون توی تعداد پایه ها، نوع آنتن وای فای، میزان حافظه فلش و تعداد LED های روی برد هست. اینجا بعضی از ماژول ها که خیلی معروف هستند و در بازار ایران موجود هستند رو بررسی میکنیم:ESP-01ساده ترین ماژول ESP8266 این ماژول هست و فقط 8 تا پایه خارجی داره در دو مدل معمولی و S تولید شده، در مدل معمولی 512KB حافظه فلش وجود داره و در مدل S یک مگابایت.ESP01ماژول ESP-01 دارای دو تا پایه GPIO، آنتن روی PCB و یک LED و پایه های Tx, Rx هست. برای پروژهای کوچیک مثل قطع و وصل کردن یک رله و یا جایی که یک میکروکنترلر به جز ESP داریم استفاده میشود و با پایه های Tx, Rx (پایه های سریال) میکروکنترلر دیگر ارتباط برقرار می کند.کیت ESP و رلهدر تصویر بالا کیت ESP-01 و رله رو مشاهده می کنید و میتونید با این کیت از طریق وای فای یک لامپ (یا هر چیز دیگه) رو خاموش روشن کنید.ESP-01 Programmer Adapterبرد های آماده زیادی برای این ماژول هست مثل مدل زیر که میتونید با استفاده از اون بدون هیچ دردسری ESP رو پروگرم کنید و در پروژه هاتون استفاده کنید.ESP-07اگر نیازمند آنتن خارجی هستید ESP07 گزینه خیلی خوبیه و پایه های آزاد بیشتری هم دارد.ESP-07این مدل هم در دو مدل معمولی و S وجود داره. در مدل معمولی آنتن وای فای به صورت سرامیکی و خارجی وجود داره (برد های آبی رنگ) ولی در مدل s (برد مشکی) فقط آنتن خارجی پشتیبانی میشه در این مدل وای فای نیز تقویت شده.ESP-12این ماژول در چهار مدل معمولی و E و F و S تولید شده که به همین ترتیب مدل S وای فای بهتر و تقویت شده تری دارد. (اصن به چشم نمیاد که)ماژول ESP12 دارای 4 مگابایت حافظه فلش هست و در برد های NodeMCU استفاده شده است.ESP12ماژول ESP12 رو بیشتر بررسی کنیمPinoutخب همون طور که توی تصویر بالا می بینید ESP12 کلا 22 پایه داره. پایه شماره 8 و 15 به ترتیب VCC و GND هستند که باید به پتانسیل های 3.3 و صفر ولت متصل شوند. فقط این دو پایه کافی نیست برای روشن شدن ESP، پایه شماره 3 (CHIP_EN) هم باید به پتانسیل بالا وصل بشه. در اصل باید با یک مقاومت (ترجیحا 12 کیلواهم) Pull-Up بشه.الان ESP روشن شد ولی کاری واسه شما نمیکنه :| چون باید بهش بگید که روی کدوم Mode میخواهید کار کنه! همون طور که سمت راست و پایین تصویر میبینید پایه های GPIO2 و GPIO15 به ترتیب باید به Vcc و Gnd وصل بشن! (اتصال این ها هم ترجیحا با مقاومت 12 کیلو).و GPIO0 تعیین کننده وضعیت مود پروگرم یا اجرا برنامه است. اگر این پایه ولتاژ صفر ولت داشته باشد در مود پروگرم یا Flash است و اگر ولتاژ 3.3 داشته باشد در مود اجرا برنامه قرار میگیرد. (مود های دیگه ای هم وجود داره که فعلا کاری نداریم باشون) معمولا این پایه رو با یک مقاومت 12 کیلو پول آپ میکنن و زمانی که نیاز به پروگرم شد توسط یک سوئیچ اون پایه رو زمین میکنند.دقت کنید که برای ریست (با هر منبع ریستی)، بوت (اتصال تغذیه) و بیدار شدن ESP از خواب حتما حتما باید بر اساس مود عملکردی سه پایه  GPIO های 0، 2 و 15 به پتانسیل صحیح وصل شوند!خب دید که چقدر دردسر داره ماژول های ESP؟ برای همین استفاده از برد های آماده راحت تره (میتونید با آی سی هایی مثل CH340 و با پایه DTR اون و یه تعداد مقاومت این کارا رو انجام بدید ولی خب برد آماده اش هست دیگه!پایه RESET هم که دیگه بلدید برای ریست کردن استفاده میشه. این پایه از داخل ماژول پول آپ شده ولی من برای احتیاط از خارج هم پول آپ میکنم. خازن نویز گیر فراموش نشه! مدار کلی راه اندازی به صورت زیر میشه:مدار پروگرم و بوتبرای پروگرم کردن کافیه پایه های Rx, Tx و زمین رو به مبدل USB به سریال وصل کنید و زمانی که کلید فلش رو نگه داشتین( GPIO2 زمینه) برد رو ریست کنید. (مبدل USB to Serial رو در آخر همین پست معرفی میکنم)خب بقیه پایه ها! ESP12 چهار تا پایه PWM داره (pwm یه جور مدلاسیونه که میتونید با اون پالس با پهنای دلخواه درست کنید) پایه های شماره 5،6،16 و 19 و با این پایه های میتونید ولتاژ متغیر تولید کنید.پایه شماره 2 هم ADC هست و به مبدل آنالوگ به دیجیتال وصله، یعنی یک ولتاژ آنالوگ رو میتونید بخونید!پایه های دیگه هم داره که مهم ترین هاش رو دیدم بقیه رو در قسمت های بعدی خواهیم دید.پی نوشت: مبدل USB به سریالخب همتون میدونید USB چی هست. کار این مبدل اینه که پروتکل Uart به USB تبدیل کنه.پروتکل Uart یا همون سریال خودمون دوتا خط ارتباطی داره یکی Tx برای ارسال و یکی Rx برای دریافت که باید به صورت برعکس به بین مبدل و ESP وصل بشن( یعنی Tx ماژول به Rx مبدل!). گراند مشترک هم فراموش نکنید!USB to Serialحتما به ولتاژ های منطقی دقت کنید. مبدل باید از 3.3 ولت پشیبانی کنه و درایور اون رو نصب کرده باشید.با آردوینو هم میشه مبدل یو اس بی به سریال درست کرد که زیاد واردش نمیشم با جستوجو در اینترنت میتونید روشش رو یاد بگیرید. ( هم با برنامه نویسی میشه و هم با اتصال کوتاه کردن پایه ریست میکرو اصلی آردوینو یا کلا جدا کردن میکرو از روی برد)خیلی طولانی شد!اگر روی خواستید از ماژول ESP استفاده کنید نه از بورد های آماده، پیشنهاد من این سه مورد بالاست که البته هر کدوم جزئیات مخصوص به خودشون رو دارند. ولی اگر از برد های آماده و بدون دردسر رو ترحیج میدید در قسمت سوم با NodeMCU و تا حدی Wemos D1 mini آشنا میشیم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Thu, 07 May 2020 21:17:25 +0430</pubDate>
            </item>
                    <item>
                <title>دنیای جذاب ESP ها</title>
                <link>https://virgool.io/uiRobotics/esp1-rutfyg8tdc4z</link>
                <description>سلاماگر علاقه مند به اینترنت اشیاء هستید، یا با میکروکنترلر ها سر و کار دارید و یا مثل من موقع خواب حال و حوصله ندارید که بلند بشین و لامپ رو خاموش کنید، ESP احتمالا واستون جذاب خواهد بود.ماژول ESP8266چی هست؟ یک ماژول وای فای&quot;ای اس پی&quot; یا به طور دقیق تر و خاص تر ESP8266 به یک دسته ماژول گفته میشه هسته پردازشی اونها آی سی 32 پایه ای با نام ESP8266EX هست.آی سی ESP8266EXاین IC یک میکروکنترلر با یک قابلیت خفن هست! اتصال وای فای، یعنی علاوه بر GPIO و پروتکل های ارتباطی معروف مثل SPI, UART, I2C و... وای فای هم داره. و با وای فای اون میتونید با تقریبا هر دیوایسی که وای فای داره ارتباط برقرار کنید، مثلا تلفن همراهتون.فرض کنید اون دیوایس یک مودم اینترنت باشه! با یکم تنظیمات شما یک میکروکنترلر دارید که میتونید از هر جای دنیا با اون ارتباط برقرار کنید. دیگه چی میخاین؟این هم دیتاشیتزیاد تئوریش نمیکنم بریم که یکیشو بخریم!ماژول های ESP8266برای اینکه بتونید با  ESP کار کنید نیاز دارید تا یک ماژول ESP8266 تهیه کنید. ماژول های ESP8266 خیلی متنوع هستند و تفاوتشون در میزان حافظه فلش، تعداد پایه ها، نوع آنتن و... هست که درموردشون کم کم بحث میکنیم.ساده ترین ماژول ESP8266 درواقع ESP-01 هست و مدل های دیگه ای مثل ESP8266-12E, ESP8266-12F, ESP-07 ,... هم داره.ESP8266-12اما برای شروع پیشنهاد میکنم هیچ کدوم از این موارد بالا رو نگیرید! چرا؟ چون پروگرم کردن اون دردسره! (البته روش دقیق پروگرمر کردن اونها رو هم در آینده میگم)برای پروگرم کردن اون باید یک سری پایه ها رو زمین کنید و یک سری به VCC وصل کنید،(pull-up &amp; pull-down) ماژول رو ریست کنید، با با پورت سریال کدتون رو آپلود کنید :| تازه بعد هر بار پروگرم کردن باید اتصالات رو عوض کنید و دوباره ماژول رو ریست کنید تا کد شما رو اجرا کنه! ولمون کن!به جاش از  NodeMCU استفاده کنید.NodeMCUبرد nodeMCU (یا همون ماژول) در واقع یک ESP8266-12E هست که در کنار اون یک آی سی USB به سریال CH340G یا CP2102 قرار گرفته و کار پروگرم کردن ESP رو راحت می کنه. همچنین میتونید روی برد بورد از اون استفاده کنید. (خود ماژول های ESP رو نمیشه مستقیما روی برد بورد قرار داد!)NodeMCUراستی ماژول های ESP همه 3.3v هستند (به قول برقیا تری وی تری 3v3!) اما NodeMCU این کار رو هم راحت کرده و یک رگولاتور AMS1117-3.3v داره پس میتونید با خیال راحت با یک کابل Micro-USB اونو تغذیه کنید.دیگه بگم براتون که منطق ولتاژی ESP همیشه و همه جا 3.3 ولت هست حتی توی ارتباط سریال! پس وقتی میخواهید به Arduino اونو وصل کنید (منطق آردوینو های معمولی 5 ولته) مشکل پیدا میکنید که در NodeMCU پایه های RX و TX دارای Level-Shifter هستند.توی پرانتز: ماژول Wemos D1 mini , Wemos D1 هم خوبن همه کار های NodeMCU رو انجام میدن و حافظه فلش بیشتری هم دارن ولی خب NodeMCU معروف تره.توی پرانتز تر: NodeMCU هایی هستند که هسته اونها ESP8266 نیست و ESP32 هست. بعدا با ESP32 آشنا میشیمحالا بازم مثل من NodeMCU نخرید و برید خود ماژول ESP رو بخرید :)برنامه نویسی ESPتا اینجا فهمیدیم که ESP رو باید با پورت سریال پروگرم کرد اما کدش کو؟ماژول های ESP رو می تونید با ide آردوینو برنامه نویسی کنید! آردوینو دوست ندارید؟ پایتون به دادتون میرسه! ولی فعلا آردوینو رو ترجیح میدم (البته آردوینو و پایتون تنها زبان های برنامه نویسی ESP نیستند و چیز های دیگه هم وجود داره مثل LUA و ...)بعله :))در آینده مفصل درمورد کانفیگ IDE آردوینو برای پروگرم کردن ESP صحبت می کنیم. الان وقت خزانه! پس یکم درمورد توانایی های ESP بگم براتون D:قابلیت های ESPمیتونه در 3 مود SoftAP، Station و SoftAP + Station کار کنه یعنی میتونه وصل بشه به یک شبکه وای فای  (مثلا مودم یا هات اسپات گوشی) یا خودش یک شبکه وای فای درست کنه و یا هر دو اینها!میتونه با اتصال به مودم و تبعاً اینترنت اطلاعاتی رو از یک سایت بخونه یا حتی بنویسه توی اون سایت! حتی میتونه به دیتابیس وصل بشه (مثل MySQL و Redis)میتونه یک وب سرور برای شما اجرا کنه، یعنی یک آدرس رو میزنید توی مرورگر وبتون و یک صفحه وب رو نشون میده که مثلا شامل دوتا کلید هست OFF , ON و لامپ اتاقتون رو موقع خواب با گوشی خاموش روشن کنید! البته منم که اصن تنبل نیستم!یک مدیا سنتر کوچیک باش راه اندازی کنیدبا پروتکل های TCP و UDP ارتباط دیتا رو بین چند دیوایس جا به جا کنید.فایلی رو برای دانلود بگذارید یا فایلی رو آپلود کنید. میتونید از طریق وای فای پروگرمش کنید و حتی سریال مانیتور رو تحت وب باز کنید :))میتونید رباتتون رو با وای فای کنترلر کنید.تبدیلش کنید به یک ریپیتر شبکه وای فای.باهاش یه پروژه کوچیک خانه هوشمند درست کنید.آقا خودش میکروکنترلره!و...خیلی آردوینو، آردوینو کردم! اگه دوست دارین با اون آشنا بشید و IDE اون رو نصب کنید پست امیرمسعود رو بخونید. https://vrgl.ir/Kap1n در قسمت دوم، ماژول های مختلف ESP رو بررسی خواهیم کرد. پس با ما همراه باشید</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Mon, 04 May 2020 01:53:42 +0430</pubDate>
            </item>
                    <item>
                <title>بهانه‌ای برای ورود به دنیای امبدد سیستم‌ها (V)</title>
                <link>https://virgool.io/uiRobotics/rpi5-aq2lkcntro6w</link>
                <description>سلامدر قسمت چهارم با کلاس های LED , Button از کتابخانه gpiozero آشنا شدیم و همچنین با کمک این کتابخانه برای رزبری پای دکمه Shutdown درست کردیم.در این قسمت با کلاس های بیشتر از همین کتابخونه آشنا میشیم.رزبری پای مدل 4BPWMLEDکلاس LED رو یادتونه؟ کلاس PWMLED همون کلاس LED هست که شما میتونید روشنایی هر LED رو هم تنظیم کنید. طریقه کار کردش ایجاد یک پالس PWM هست که با تغییر پهنای پالس میتونید سطح ولتاژ میانگین رو کم و زیاد کنید.اتصال LED به رزبری پایاول کلاس pwmled رو فراخوانی میکنیمfrom gpiozero import PWMLEDو بعد روی پایه ای که میخواهیم یک شی تعریف میکنیمled = PWMLED(17)و با استفاده از پراپرتی value میتونیم روشنایی led رو کم و زیاد کنیم. value یک عدد بین 0 تا 1 را میگیرد که 0 به معنای خاموش و 1 به معنای حداکثر روشنایی است.from gpiozero import PWMLED
from time import sleep

led = PWMLED(17)

while True:
    led.value = 0  #off
    sleep(1)
    led.value = 0.5  # half brightness
    sleep(1)
    led.value = 1  # full brightness
    sleep(1)LightSensorاول یکم درمورد light sensor حرف بزنیم. سنسور روشنایی یا به اصطلاح برقیا LDR، یک المان دو پایه مثل LED هست با این تفاوت که دقیقا برعکس led هست. در واقع LDR زمانی که نور بهش نرسه مقاومت بی نهایت داره و زمانی که در معرض نور قرار بگیره مقاومت تقریبا صفر داره. (یعنی مقاومت با افزایش میزان روشنایی کاهش پیدا میکنه، پس میتونیم مقاومت رو برای معیاری از روشنایی مدل کنیم)یک نمونه LDRبه دو طریق میشه از LDR استفاده کرد. 1) دیجیتال 2)آنالوگ در قسمت دیجیتال دو حالت خاموش و روشن داریم. (LDR مثل کلید عمل میکنه)مدارمدار LDRدر مدار فوق یک پایه LDR به VCC (پتانسیل بالا) وصل شده و پایه دوم به GPIO18 وصل شده. همچنین یک خازن (نسبتا ظرفیت کم در حد نانوفاراد) برای نویز گیری بین پایه زمین و پایه دوم LDR قرار گرفته. (اگر از خازن پلاریته دار استفاده می کنید به پلاریته دقت کنید. البته با 5 ولت خازن نمیترکه ولی خب!)بریم سراغ کد ^_^from gpiozero import LightSensor
sensor = LightSensor(18)

while True:
     sensor.wait_for_light()
     print(&amp;quotIt&#039;s light! :)&amp;quot)
     sensor.wait_for_dark()
     print(&amp;quotIt&#039;s dark :(&amp;quot)اول که کلاس LightSensor رو از کتابخونه فراخونی کردیم. و تعریف کردیم که آبجکت sensor یک لایت سنسور هست که روی پایه GPIO18  وصله.تو حلقه از تو تابع wait_for_light و wait_for_dark استفاده کردیم که به ترتیب برای روشنایی و تاریکی صبر می کنند. با در این حین برای ما توی ترمینال چاپ میکنند که الان تاریکه یا روشن!میتونید با LDR یک LED رو کنترل کنیدfrom gpiozero import LightSensor, LED

sensor = LightSensor(18)
led = LED(16)

sensor.when_dark = led.on
sensor.when_light = led.offدیگه فکر کنم با کد های بالا آشنا هستید و سعی میکنم کمتر توضیحشون بدم. کد بالا زمانی که نوری به LDR نمیرسه LED رو روشن میکنه و برعکس.و قسمت آنالوگ، توی این قسمت در اصل میزان ولتاژ LDR توسط رزبری پای خونده میشه (ولتاژ هم که طبق قانون اهم رابطه مستقیم داره با مقاومت) و متناسب با مقداری که خونده شده میتونید از اون عدد استفاده کنید. مثلا با کتابخونه LEDPWM که توی همین آموزش دیدیم میزان روشنایی یک LED رو کنترل کنید.مدار همون مدار قبله ولی کد به صورت زیر هست:from gpiozero import LightSensor, PWMLED

sensor = LightSensor(18)
led = PWMLED(16)

led.source = sensorتوی خط اخر مشاهده می کنید که سورس آبجکت led همون ابجکت sensor که در واقع LDR هست. قرار داده شده و میزان روشنایی LED با توجه به میزان نوری که به LDR (مقاومت) میشه تغییر میکنه.امیدوارم که آموزش ها تونسته باشه کمی بیشتر شمارو با این برد دوست داشتنی آشنا کنه و در قسمت های بعدی بیشتر با مباحث الکترونیکی آشنا خواهیم شد. منتظر قسمت ششم باشید.ممنون که وقت گذاشتید و با ما همراه بودید.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Sat, 25 Apr 2020 17:06:14 +0430</pubDate>
            </item>
                    <item>
                <title>بهانه ای برای ورود به دنیای امبدد سیستم ها (IV)</title>
                <link>https://virgool.io/uiRobotics/rpi4-oqyshdn9iizs</link>
                <description>سلامدر قسمت سوم، رزبری جان (!) رو راه اندازی کردیم و الان میتونیم از اون استفاده کنیم. در این قسمت با سخت افزار و GPIO های اون آشنا میشیم و روش های برنامه نویسی اون ها رو بررسی می کنیم.بهتره قبل از شروع این قسمت مروری بر برنامه نویسی پایتون داشته باشید.Pinoutقبل از شروع کار به ترمینال رزبری پای ریموت بزنید. و کد زیر رو اجرا کنید.pinoutRaspberry Pi Pinoutچیزی که بالا میبیند اصطلاحا pinout رزبری پای هست و توضیحی در مورد سخت افزار، شماره و نام پایه های رزبری پای میدهد. همون طور که میبینید اون مستطیل سبز رنگ رزبری پای هست و اون کادر های خاکستری پورت های USB, HDMI, شبکه، دوربین، نمایشگر و AV هستند.اون o هایی که اون بالا می بینید همون GPIO های رزبری پای هستند و عدد یک شماره پایه 1 هستتوضیحاتی شامل تعداد پورت ها، میزان رم و... داده شده که کاری نداریم با اون ها فعلا.پایین تر (قسمت راست تصویر بالا) نام و شماره تمام GPIO های رزبری پای هست که برای پیدا کردن شماره پایه ای باید این ها رو با اون شماره پایه 1 که توی شکل بود تطبیق بدین.راه ساده تر این هست که به ادرس زیر مراجعه کنید. https://pinout.xyz/ برای راحتی کار میتونید از این تگ ها تهیه کنید:Pinout Tag  GPIO همون پایه های رزبری پای که با اون ها با دنیای خارج ارتباط برقرار میکنیم را GPIO می گویند و مخخف General Propose Input/Output هست.GPIOرزبری پای 40 تا پایه برای ارتباط های خارجی داره که از این 40 پایه شامل:پین های پاور: 8 پایه زمین - 2 پایه 5 ولت - 2 پایه 3.3 ولت 28 پین ورودی خروجی (که با قسمت های دیگه مشترک هست)دو سری پین SPI , دو سری پین I2C و یک UART (با این پایه ها بعدا آشنا میشیم)برنامه نویسی پایه ها و LEDروش های مختلفی برای برنامه نویسی پایه ها وجود داره. میتونید با زبان های C ، Cpp و Python کد بنویسید یا از واسط های گرافیکی مثل Scratch استفاده کنید.در این قسمت برنامه نویسی پایتون رو کار خواهیم کرد.خب برای باز کردن پایتون توی ترمینال کد زیر رو اجرا کنید.python3با اجرا این کد محیط پایتون توی ترمینال باز میشه و میتونید کد های پایتون رو اونجا اجرا کنید.اول سلام کنیم بعد بریم جلوprint(&#039;Hello World!&#039;)خروجی این کد عبارت Hello Word را در همون ترمینال چاپ می کند. دیگه بیشتر وارد پایتون نمیشم و در روند کار آشنا میشیم.برای استفاده از پین ها باید کتابخونه GPIO رو فراخوانی کنیم. اسم این کتابخونه gpiozero هست که در قدم اول ما میخواهیم یک LED رو روشن کنیم. پس کد زیر رو در همون میحط پایتون اجرا میکنیم.from gpiozero import LEDکد بالا یعنی از کتابخونه gpiozero وارد کن LED را (!)از این به بعد میتونیم از LED استفاده کنیم. LED یک کلاس پایتون هست که شماره GPIO را به عنوان آرگومان (ورودی) میگیرد مثلا (LED(21. این کار GPIO21 را به عنوان یک پایه برای روشن و خاموش کردن led تعریف میکند. برای راحتی کار به (LED(21 یک نام دیگر اختصاص می دهیم و از این به بعد به myled یک شئ (object) میگوییم.myled = LED(21)موازی با کد سخت افزار هم ببندیم! مدار LEDپایه منفی LED به یکی از زمین های رزبری پای و پایه مثبت LED را به GPIO21 (که همون پایه شماره 40) هست وصل میکنیم.حالا برای روشن کردن LED از تابع on استفاده میکنیم.myled.on()مشاهده میکنید که led روشن شد. برای خاموش کردنش از تابع off استفاده میکنیم.myled.off()علاوه بر دو تابع بالا تابع های دیگری مثل toggle هم هست که وضعیت led رو برعکس میکند یعنی از خاموش به روشن یا برعکس.تابع blink: این تابع یک led چشمک زن برای ما درست می کند که ورودی آن فاصله بین هر چشمک هست بر حسب ثانیه مثلا:myled.blink(5)مشاهده می کنید که هر 5 ثانیه یک بار led خاموش و روشن می شود.البته بدون استفاده از تابع blink هم میشود به صورت دستی این کار رو انجام داد. برای این کار باید بتونیم تاخیر ایجاد کنیم. پس از کتابخونه time تابع sleep رو فراخوانی میکنیم.from time import sleepیک حلقه هم نیاز داریم که مداوم این عمل خاموش روشن شدن رو انجام دهد. دستور حلقه در پایتون while هست و جلو آن شرط حلقه را مینویسیم مثلا while 1 که یک حلقه بی نهایت هست و تا ابد این حلقه را اجرا خواهد کرد. (دستورات داخلی while باید با یک tab نوشته شوند)while 1:
    led.toggle()
    sleep(1)کد بالا دقیقا همون کاری که تابع blink میکرد رو انجام می دهد.Buttonکلاس button برای تعریف کلید هست و طریقه استفاده همانند کلاس led می باشد.یک آبجکت تعریف میکنیم که پایه GPIO2 را به عنوان یک کلید استفاده کنیم*** دقت کنید شماره پایه با شماره GPIO (عددی که در پرانتز می نویسید) فرق میکنهbtn = Button(2)طریقه وصل کردن هم خیلی ساده است. یک پایه کلید رو به زمین و پایه دیگر به GPIO2 که در کد تعریف کردیم.آبجکت btn دارای 2 ویژگی (property) است: is_pressed , is_held و روش استفاده هم به صورت زیر هست:while True:
     if btn.is_pressed: 
          led.on()
     else: 
          led.off()زمانی که شرط btn.is_pressed صحیح باشد led روشن میشود و در غیر این صورت خاموش میشود. با btn.is_held میتوانیم شرط رو طوری بنویسیم که فقط زمانی که کلید نگه داشته شد روشن شود.علاوه بر ویژگی های بالا btn دارای دو متد (method) نیز هست : wait_for_release و wait_for_press با این دو متد میتوان تعیین کرد رزبری پای منتظر بماند که کلید فشار داده شود یا رها شود:while True:
     button.wait_for_press() 
      led.on() 
      button.wait_for_release() 
      led.off()در این کد رزبری پای صبر می کند تا کلید فشار داده شود و led را پس از فشار دادن روشن میکند و همچنین صبر می کند تا کلید رها شود و led را خاموش کند.روش دیگر پیاده سازی این کد بدون حلقه while به صورت زیر است:btn.when_pressed = led.on
btn.when_released = led.offو روش سوم و ساده ترین روش که منبع خاموش و روشن شدن ابجکت led را کلید btn قرار میدهد.led.source = btnکم کم به آخر آموزش نزدیک می شویم و باید رزبری پای رو خاموش کنیم ولی این دفعه با کلید خاموش میکنیم.کلید خاموش و روشن برای رزبری پایfrom gpiozero import Button
from subprocess import check_call 

def shutdown(): 
        print(&#039;shutdown...&#039;)
       check_call([&#039;sudo&#039;, &#039;poweroff&#039;])

shutdown_btn = Button(17, hold_time=2)
shutdown_btn.when_held = shutdown در 2 خط اول کتابخانه های لازم رو فراخوانی میکنیم. تابع check_call از کتابخانه subprocess  برای نوشتن دستور در ترمینال رزبری پای هست.در خط سوم یک تابع با نام shutdown تعریف کردیم و کد خط پنجم کامند poweroff را با sudo اجرا میکند (sudo دسترسی به کاربر Root رو میدهد) میتونید خودتون امتحان کنید و sudo poweroff را در ترمینال بنویسید تا رزبری پای خاموش شود. حال هر زمان که این تابع فراخوانی شود رزبری پای خاموش میشود.یک کلید با نام shutdown_btn نیز تعریف میکنیم. کلاس Button در اینجا با یک آرگومان جدید تعریف شده. عدد 17 که شماره gpio هست و hold_time=2 تعیین میکند که زمان نگه داشته شدن کلید 2 ثانیه است. یعنی اگر 2 ثانیه کلید را نگه داریم رزبری پای when_held را تشخیص می دهد که در خط بعد استفاده شده.در خط اخر هم هر زمان که shutdown_btn نگه داشته شود تابع shutdown را اجرا می کند.برای اینکه کد را همیشه داشته باشیم آن را در دسکتاپ رزبری پای ذخیره میکنیم. پس کد زیر را در ترمینال رزبری پای اجرا کنیدcd Desktopاکنون وارد دایرکتوری دسکتاپ شده اید. سپس یک فایل با نام shutdown و با پسوند py. (پسوند فایل پایتون) ایجاد میکنیم.sudo touch shutdown.pyکد فوق را در به کمک nano در فایل مینویسیم.sudo nano shutdown.pyپس از نوشتن کد با کلید های  ctrl + o و فشار دادن Enter فایل را ذخیره میکنیم. و با ctrl + x از ادیتور خارج میشویم.برای اجرا کردن برنامه کافیست در آدرس مربوطه (cd Desktop را زده باشیم) کد زیر را در ترمینال اجرا کنیمpython3 shutdown.pyاکنون هر زمان که کلید را فشار دهیم و برنامه اجرا باشد رزبری پای خاموش خواهد شد.--- سخن آخر ---ممنون که همراه ما بودین.در قسمت پنجم با کتابخانه ها و کد های بیشتری آشنا می شویم. با به اشتراک گذاشتن این مجموعه از ما حمایت کنید.راستی اگر هرجای کار سوالی داشتید در قسمت نظرات همین پست بپرسید.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Sun, 05 Apr 2020 19:39:37 +0430</pubDate>
            </item>
                    <item>
                <title>بهانه ای برای ورود به دنیای امبدد سیستم ها (III)</title>
                <link>https://virgool.io/uiRobotics/rpi3-v2tfaxznucsj</link>
                <description>سلامدر قسمت دوم با رزبین آشنا شدیم و امیدوارم الان مقدماتی که لازم هست برای راه اندازی رزبری پای رو آماده کرده باشید. در این قسمت سیستم عامل رزبین (Raspbian) رو روی رزبری پای نصب می کنیم.لینک دانلود تمامی نرم افزار های استفاده شده در این آموزش در قسمت دوم ذکر شده است.آماده سازی SD کارتبا استفاده از نرم افزار win32 disk imager سیستم عاملی رزبین که دانلود کردیم رو روی SD کارت نصب میکنیم.قبل از همه فایل zip سیستم عامل رزبین رو از حالت فشرده خارج کنید (Extract) محیط نرم افزار win32 disk imagerفایل ISO. سیستم عامل که در مرحله قبل extract کردین رو با استفاده از علامت فولدر در قسمت 1 فراخوانی کنید.مموری کارت را وارد سیستم کنید و نام پارتیشن آن را از لیست قسمت 2 انتخاب کنید.و دکمه Write را بزنید.در آخر از شما می پرسه که میخواهید SD کارت فرمت شود؟ با زدن دکمه Yes این اجازه را به نرم افزار بدهید.صبر کنید تا عملیات Write تکمیل شود.هنوز تموم نشده!برای اینکه بتونید بدون مانیتور، کیبورد و موس رزبری پای رو راه اندازی نیاز هست تا قابلیت ssh اون رو فعال کنید.برای این کار باید وارد درایو boot رزبری شوید. (دقت کنید بعد از انجام عملیات write مموری کارت شما 2 پارتیشن میشود که شما باید وارد پارتیشنی شوید که boot نام دارد.)و یک فایل بدون پسوند با نام ssh در پارتیشن بوت ایجاد کنید. (برای این کار میتونید در پارتیشن کلیک راست کنید و از قسمت new گزینه Text Document را انتخاب کنید و اونو به ssh تغییر نام بدین. حتما پسوند txt. را پاک کنید.)آماده سازی رزبری پایمموری کارت را در شیار SD رزبری وارد کنید. (شیار SD پشت برد است) نصب SD کارتاگر موس، کیبورد و یا مانیتور در دسترس دارید میتونید اون هارو به رزبری پای وصل کنید. در غیر این صورت نیازی نیستکابل شبکه را بین رزبری پای و مودم (یا پورت شبکه کامپیوتر) متصل کنید.اتصال کابل شبکهتغذیه رزبری پای را متصل کنید.اتصال کابل پاوربا اتصال تغذیه رزبری بای یک LED قرمز زنگ کنار کانکتور پاور روشن میشود به معنی بر قراری صحیح تغذیه مدار. منتظر بمانید تا کنار LED قرمز رنگ یک LED سبز روشن شود.روشن شدن LED سبز بیانگر راه اندازی سیستم عامل رزبری پای می باشد.بوت شدن کامل رزبری پای و روشن شدن led سبز و قرمزاگر مانیتور، کیبورد و موس داشته باشید که تقریبا تمومه و رزبری پای آماده استفاده است اگر نه در ادامه چگونگی استفاده از رزبری پای به صورت ریموت رو بررسی میکنیم.اتصال SSH به رزبری پایبرای اتصال به رزبری پای نیازمند نرم افزار Putty هستیم. putty یک واسط گرافیکی برای ارتباطات ssh, telnet, serial, ... هست.Putty1. در قسمت HostName عبارت زیر را وارد کنیدraspberrypi2. دقت کنید که گزینه ssh انتخاب شده باشد.3. روی Open کلیک کنید.4. اگر اولین بار است که به یک دیوایس وصل می شود پیغامی مبنی بر تبادل Secret Key دریافت می کنید، با آن موافقت کنید.درصورت عدم وجود مشکل صفحه همانند صفحه زیر باز خواهد شد. (در غیر این صورت در انتهای همین پست اتصال با IP را امتحان کنید.)اتصال به رزبری پای توسط sshدر اینجا برای ارتباط ssh باید یورزنیم و پسورد را وارد کنید که مقادیر پیشفرض آنها به شرح زیر است.Username : piPassword : raspberryپس از ورود با صفحه زیر رو به رو می شود که همان ترمینال رزبین هست. و تقریبا با این محیط سیاه و سفید (سبز هم داره انگار!) همه کاری میشه کرد.ترمینال رزبری پایبعد با ترمینال زیاد کار خواهیم داشت :)اتصال به محیط گرافیکی رزبری پایبرای دیدن محیط دسکتاپ رزبری پای رو کامپیوتر خودمون از نرم افزار VNC Veiwer (شاید با اسم های RealVNC یا VNC Connect هم بشناسید) نیاز داریم.قبل از ورود به نرم افزار لازمه یک خط کد توی ترمینال (همین صفحه سیاهه بالا) اجرا کنید. پس کد زیر رو اجرا کنید vncserverپس از اجرا کامل کد راه انداری vncتوی آخرین خط یک HostName:Port و یک IP Address:Port به شما ارایه می دهد.که در این جا raspberrypi:2 هست و 192.168.1.51:2 به جای 2 بعد از دو نقطه میتونه هر عددی باشه.نرم افزار VNC Viewer را اجرا کنید و هاست نیم و پورتی که در مرحله قبل بدست آوردیم رو در کادر 1 وارد کنید و Enter را بزنید.vnc viewerاگر پیغام نشون داد Continue رو بزنید.در این جا مثل دفعه قبل که اتصال ریموت داشیتم یورزنیم و پسورد میخواهد که وارد میکنم و دسکتاپ رزبری پای به نمایش می آید.Username : piPassword : raspberryدسکتاپ رزبری پایقبل از اتمام کار یک سری تنظیمات انجام میدیم.روی لوگو رزبری پای کلیک کنید و در قسمت Preferences گزینه Raspberry Pi Configuration رو بزنید تا تنظیمات رزبری پای باز بشه.تنظیمات رزبری پایدر تب اول (system) فیلدی به نام hostname وجود دارد که همان عبارتی است که زمان اتصال به رزبری پای از آن استفاده کردیم. در اینجا میتونید اونو تغییر بدین.در تب سوم (Interfaces) موارد ssh و vnc را روی enable قرار دهید. با این کار هنگام ریموت دسکتاپ رزبری پای نیازی به اجرای کامند vncserver در ترمنیال رزبری نیست و به طور پیش فرض فعال است. کافیست hostname یا ip رزبری پای را در vnc viewer وارد کنید.اتصال وای فایاز کابل شبکه خسته نشدید؟ خب بیاین رزبری پای رو وصل کنیم به شبکه وای فای که از این به بعد بدون سیم بتونیم به صورت ریموت با اون کار کنیم.اگر یک بار رزبری پای را به یک شبکه وای فای متصل کنید (و رزبری پای را خاموش کنید. نه که از برق بکشید!) از این به بعد به طور پیشفرض رزبری پای بعد از روشن شده به اون شبکه متصل میشه.وای فای رزبری پایدر گوشه بالا سمت راست دسکتاپ روی علامت فلش پایین و بالا بزنید. اگر فای وای رزبری پای خاموش باشه با گزینه Turn ON Wi-Fi اون رو روشن کنید و صبر کنید تا شبکه های موجود رو اسکن کنه. بعد از اسکن شبکه مورد نظر رو انتخاب کنید و در کادری که باز میشه پسورد شبکه وای فای رو وارد کنید و اوکی رو بزنید. منتظر بمونید تا علامت فلش بالا و پایین به علامت وای فای تبدیل بشه و رزبری پای به وای فای وصل بشه.خاموش کردن !!!برای خاموش کردن رزبری پای روی لوگو رزبری پای کلیک کنید و گزینه اخر shutdown رو بزنید و مجددا shutdown! در قسمت های بعدی طریقه خاموش کردن رزبری پای با ترمینال رو بررسی میکنیم و شاید یک کلید پاور برای اون طراحی کردیم که فیزیکی هم بتونیم خاموشش کنیم.ضمیمه 1 : پیدا کردن IP Address رزبری پایدر قسمت اتصال ssh (و اتصال با vnc) اگر با تایپ کردن Hostname رزبری پای نتونستید کانکت بشید با IP امتحان کنید.اگر مانیتور دارین که رزبری پای رو به مانیتور متصل کنید و دستور زیر رو توی ترمینال رزبری پای وارد کنید.ifconfigاینترفیس eth0 مربوط به اترنت هست و میتونید ip خودتون رو مشاهده کنید. و wlan0 مربوط به اتصال وای فای که در این جا متصل نیست.اگر مانیتور در دسترس نبود و رزبری پای به مودم متصل بود میتوانید به تنظیمات مودم مراجعه کنید(192.168.1.1) دیوایس های متصل رو مشاهده کنید.اگر مستقیما رزبری پای به کامپیوتر متصل بود با نرم افزار های اسکن آی پی مانند nmap تمامی آی پی های فعال شبکه رو مشاهده کنید.پس از بدست آوردن IP هر کجا نیازمند hostname بودیم از ip استفاده کنید. https://virgool.io/uiRobotics/rpi4-oqyshdn9iizs --- سخن آخر ----ممنون که تا اینجا همراه ما بودید. امیدوارم مطالب مفید بوده باشه. در قسمت چهارم چندتا پروژه ساده با رزبری پای و یکم کارای جذاب انجام میدیم :)منتظر نظرات، پیشنهادات و انتقادات شما هستیم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Mon, 30 Mar 2020 18:52:12 +0430</pubDate>
            </item>
                    <item>
                <title>بهانه ای برای ورود به دنیای امبدد سیستم ها (II)</title>
                <link>https://virgool.io/uiRobotics/rpi2-rs8ds3uodc1c</link>
                <description>سلامدر قسمت اول با برد رزبری پای آشنا شدیم. امروز سیستم عامل های مختلف رزبری پای رو مرور می کنیم و در نهایت موارد لازم برای نصب سیستم عامل رزبین رو بررسی می کنیم.رزبری پای 3سیستم عامل (OS)برای اینکه بتونیم از رزبری پای استفاده کنیم باید روی اون یک سیستم عامل نصب کنیم که اتفاقا سیستم عامل های زیادی برای اون توسعه پیدا کردند. چند موردش رو همین پایین اشاره میکنیم.1. رزبین (Raspbian)رزبین سیستم‌عاملی بر مبتنی بر لینوکس (Debian base) معروف ترین و بهترین سیستم عامل مخصوص رزبری پای که توسط بنیاد رزبری پای تولید شده است.سیستم عاملی که در آینده با اون کار خواهیم کرد همین رزبین هست.Raspbian OS2. نوبز (Noobs)نوبز که مخفف New Out Of Box Software می‌باشد درواقع یک رابط کاربری برای نصب سیستم عامل های دیگر است که برای افراد تازه کار توصیه می شود.3. اوبونتو (Ubuntu)شاید محبوب ترین توزیع لینوکسی اوبونتو باشه و شما می تونید اوبونتو رو در سه نسخه Ubuntu mate ، Ubuntu Core و Ubuntu Server روی رزبری پای نصب کنید. البته ممکنه نسبت به رزبین یکم کند باشه و حتی باگ داشته باشه.Ubuntu Mate4. گوگل کدر (Google Coder)این سیستم‌عامل به صورت رسمی از سوی گوگل ارائه شده است. با سیستم‌عامل گوگل کدر برد رزبری پای را به یک سرور جهت برنامه‌نویسی HTML، CSS، JavaScript و NodeJS تبدیل کنید.سیستم عامل گوگل کدر5.اندروید (Andoid)و اندروید محبوب! در واقع یک نسخه ای اندروید 7 برای رزبری پای پورت شده و میتونید روی رزبری پای خودتون اندروید رو نصب کنید، اون رو به یک نمایشگر با تاچ اسکرین وصل کنید و تمام. شما یک تبلت اندرویدی دارید! (البته که به پای یک تبلت نخواهد رسید)رزبری پای متصل به نمایشگر6. ویندوز (Windows 10 IoT Core)بین این همه سیستم عامل مگه میتونه ویندوز نباشه؟ البته نه اون ویندوزی که همه میشناسیم!ویندوز 10 IOT یک نسخه از همان ویندوز 10 هست ولی فاقد محیط دسکتاپ و همون طور که از اسمش پیداست برای توسعه پلتفرم هایی در دنیای اینترنت اشیا است. در ویندوز IOT میتوانید با استفاده از ویژال استودیو نرم افزار های خود را پیاده کنید و حتی برنامه های پایتون را اجرا کنید.ناگفته نمونه که به جز پروژه های خاص، Windows 110 IOT نمیتواند جایگزین سیستم عامل های لینوکسی رزبری پای باشد.7. کُدی (Kodi)و اما کُدی جذاب! به طور خلاصه کُدی برای تبدیل رزبری پای به یک سینمای خانگی است.با کُدی میتونید تلویزیون خودتون رو به یک تلویزیون هوشمند تبدیل می‌کنید که قابلیت پخش فیلم و موسیقی از منابع مختلف مثل یوتیوب را دارد.سیستم عامل kodiسعی میکنیم در آینده در مورد KODI بیشتر صحبت کنیم.8. فقط همین هفت تا نبود!خیلی سیستم عامل های دیگه هست که میتونید با یک سرچ ساده به اون ها دسترسی پیدا کنید.نصب رزبین روی رزبری پایبرای شروع به کار با رزبین و نصب اون پیشنیاز هایی لازم داریمسخت افزاربرد رزبری پایمموری کارت Micro SD با ظرفیت حداقل 8GB آداپتور (ترجیحا 2 آمپر و بیشتر) کابل Micro USB (اگر از رزبری پای 4 استفاده می کنید کابل USB Type-C مورد نیاز است)کابل شبکه (LAN)سخت افزار های مورد نیازنرم افزاردانلود سیستم عامل رزبین از سایت رزبری پاینرم افزار Win32 Disk Imagerنرم افزار VNC Viewerنرم افزار Puttyنرم افزار WinRARموارد اختیاریمانیتورکابل HDMI (برای رزبری پای 4 کابل micro-HDMI مورد نیاز است) جهت اتصال به مانیتورموس و کیبورد USBکیس و خنک کننده رزبری پای https://virgool.io/@farhad3113/rpi3-v2tfaxznucsj --- سخن آخر ----خب تا شما موارد بالا رو تهیه می کنید قسمت بعدی هم آماده میشه.در قسمت سوم رزبین رو روی برد رزبری پای نصب میکنیم و بررسی میکنیم چطوری بدون مانیتور و کیبورد از رزبری پای استفاده کنیمبا نظرات خودتون مارو در تهیه این مجموعه دلگرم کنید.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Fri, 27 Mar 2020 17:09:14 +0430</pubDate>
            </item>
                    <item>
                <title>بهانه ای برای ورود به دنیای امبدد سیستم ها</title>
                <link>https://virgool.io/uiRobotics/rpi1-zzwc3ukzd6dz</link>
                <description>سلامتوی این روز های کرونایی مطمئناً خیلی ها رفتن دنبال دیدن فیلم و سریال، میدونم خودتون هم یکی از همون ها هستید!خب داستان از اونجایی شروع شد که داشتم سریال Mr. Robot رو میدیدم. بیاین اول یه سکانسش رو باهم ببینیم. https://www.aparat.com/v/DwJPr این بردی که باهم دیدیم یک امبدد سیستم هست با نام رزبری پای! قرار هست توی این سریال توسط این برد و از راه دور، ترموستات یک شرکت رو دستکاری کنند که دمای محیط افزایش پیدا کنه و...اطلاعات بیشتر درمورد مستر ربات رو میتونید این پایین ببینید. https://www.imdb.com/title/tt4158110/ امبدد سیستم (Embedded system)امبدد سیستم ها در واقع کامپیوتر هایی هستند که برای کنترل یک سیستم بزرگ و مشخص طراحی شده‌اند. معمولاً به عنوان قسمتی از یک سیستم بزرگ که اغلب دارای سخت افزار و قسمت‌های مکانیک مختلفی است استفاده می شوند. برخلاف یک کامپیوتر رومیزی که به شکلی طراحی شده تا بیشتر نیازهای کاربران رو برآورده کنه، امبد سیستم ها برای انجام کار مشخصی طراحی شده‌اند و امروزه برای کنترل خیلی از دستگاه‌ها به کار می‌روند.رزبری پای (Raspberry Pi)رزبری پای یک کامپیوتر کوچیک (Mini-Computer) و ازون قیمت 35 دلاری در ابعاد یک کارت بانکی هست که میتونید اغلب کار های روزمره ای که با یک کامپیوتر معمولی انجام میدین رو با اون انجام بدین. مثل همین فیلم دیدن و...بر اخلاف ابعاد کوچیکش با اون میتونید کار های خیلی زیادی بکنید و برای پین های GPIO اون برنامه بنویسید و با دنیای خارج از صفر و یک ارتباط برقرار کنید. میتونید سنسور ها و ماژول های مختلف رو بهش وصل کنید و در پروژه های اینترنت اشیا، رباتیک،الکترونیک، هوش مصنوعی و خانه هوشنمد از اون استفاده کنید.گفتم یه جور کامپیوتره پس میتونید سیستم عامل های مختلفی هم که مختص رزبری پای هست رو روش نصب کنید، مثلا ویندوز، توزیع های لینوکس، اندروید و...رزبری پای مدل 2Bکی و کجا؟برد رزبری پای توسط بنیاد رزبری پای در کشور انگلستان با هدف آموزش برنامه نویسی به دانش آموزان و کودکان در مدارس ساخته شد. اولین نسخه برد رزبری پای در ۲۴ فوریه سال ۲۰۱۲ با قیمت ۲۵ دلار روانه بازار شد که در مدت کوتاهی به شدت مورد استقبال قرار گرفت. اما برخلاف هدف و پیش بینی اولیه از طراحی اون، بیشتر دانشجویان، اساتید دانشگاه، توسعه دهندگان برد های الکترونیکی، برنامه نویسان و شرکت های دانش بنیان از این کامپیوتر کوچک استقبال کردند.چهارمین مربای تمشک!توی این 8 سال که از تولید اولین رزبری پای یا به ترجمه تحت اللفظی مربای تمشک! میگذره نسخه های مختلفی از اون تولید شدند که جدیدترین اونها تا به امروز رزبری پای 4B هست.Raspberry Pi 4Bاز ویژگی های این نسخه میتونم به موارد زیر اشاره کنم: پردازنده 4 هسته ای ARM Cortex-A72 با فرکانس کاری 1.5GHzحافظه رم 1 - 2 - 4 گیگابایت (بسته به مدل)2 پورت micro-HDMI با پشتیبانی از نمایشگر های 4K2 پورت USB 3.0 و 2 پورت USB 2.0یک پورت شبکه گیگابیتیجک 3.5 میلیمتریبلوتوث و وای فای40 پین GPIOسوکت دوربین و نمایشگرپورت های مختلف رزبری پای 4 http://vrgl.ir/2j5FH --- سخن آخر ---این اولین پست از انتشارات انجمن رباتیک بود! (به قول ویرگول) امیدوارم مفید بوده باشه و در قسمت های بعد همراه ما باشید. برای اطلاع از پست های جدید پیج ما رو در ویرگول دنبال کنید. در قسمت دوم با سیستم عامل های رزبری پای آشنا میشیم و تجهیراتی که برای راه اندازی رزبری پای لازمه رو میبنیم، پس منتظر قسمت بعدی باشید. منتظر پیشنهادات و نظرات شما هستیم.</description>
                <category>فرهاد ادیبی</category>
                <author>فرهاد ادیبی</author>
                <pubDate>Wed, 25 Mar 2020 02:33:36 +0430</pubDate>
            </item>
            </channel>
</rss>