اتصال به وای‌فای (Wi-Fi) با MicroPython در Vscode: پروژه IoT گام به گام

فهرست مطالب

اتصال به وای‌فای (Wi-Fi) با MicroPython در Vscode: پروژه IoT گام به گام

در عصر اینترنت اشیاء (IoT)، قابلیت اتصال بی‌سیم برای دستگاه‌های تعبیه‌شده اهمیت حیاتی دارد. MicroPython، با سادگی و کارایی خود، به یکی از محبوب‌ترین انتخاب‌ها برای توسعه‌دهندگان IoT تبدیل شده است، به‌ویژه هنگامی که با بردهای قدرتمند و ارزان‌قیمت مانند ESP32 و ESP8266 ترکیب می‌شود. این ترکیب، امکان ساخت نمونه‌های اولیه سریع و کارآمد را فراهم می‌آورد. این مقاله، یک راهنمای جامع و گام به گام برای اتصال بردهای ESP مبتنی بر MicroPython به شبکه Wi-Fi با استفاده از محیط توسعه محبوب Visual Studio Code (VSCode) ارائه می‌دهد. ما به جزئیات فنی و پیکربندی‌های لازم خواهیم پرداخت تا شما بتوانید به راحتی دستگاه IoT خود را آنلاین کرده و آن را برای کاربردهای مختلف آماده سازید.

هدف از این راهنما، فراتر از یک اتصال ساده است. ما قصد داریم تا با درک عمیق از ماژول‌های شبکه MicroPython، مدیریت ارتباط، رفع اشکال احتمالی و حتی یک پروژه نمونه کاربردی، دانش تخصصی شما را در این زمینه ارتقا دهیم. از مراحل اولیه آماده‌سازی سخت‌افزار و نصب فریم‌ور MicroPython گرفته تا پیکربندی VSCode، کدنویسی پیشرفته برای اتصال پایدار و نهایتاً پیاده‌سازی یک سناریوی ارسال داده به سرور، تمامی جوانب پوشش داده خواهد شد. این محتوا برای توسعه‌دهندگان، مهندسان امبدد سیستم و علاقه‌مندان به IoT که به دنبال راهی مطمئن و کارآمد برای اتصال دستگاه‌های MicroPython خود به دنیای اینترنت هستند، طراحی شده است. پس با ما همراه باشید تا گام به گام، دستگاه IoT خود را به شبکه متصل کرده و پتانسیل‌های بی‌کران آن را کشف کنید.

پیش‌نیازها و ابزارهای مورد نیاز برای شروع پروژه MicroPython IoT

برای شروع این سفر هیجان‌انگیز در دنیای MicroPython و IoT، لازم است که پیش‌نیازها و ابزارهای خاصی را آماده داشته باشید. این بخش به تفصیل به معرفی این موارد می‌پردازد تا اطمینان حاصل شود که شما برای هر مرحله از فرآیند آماده هستید. عدم توجه به این پیش‌نیازها می‌تواند منجر به چالش‌ها و اتلاف وقت در مراحل بعدی شود، بنابراین توصیه می‌شود که تمامی موارد ذکر شده را با دقت بررسی و تهیه نمایید.

سخت‌افزارهای اساسی: قلب پروژه شما

  • برد توسعه ESP32 یا ESP8266: اینها ستون فقرات پروژه IoT شما هستند. بردهای محبوبی مانند NodeMCU (ESP8266)، ESP-WROOM-32، ESP32-DevKitC، Wemos D1 Mini و سایرین، انتخاب‌های عالی هستند. اطمینان حاصل کنید که برد شما سالم و دارای پورت USB است. این بردها به دلیل قیمت مناسب، قابلیت‌های Wi-Fi و بلوتوث (در ESP32) و پشتیبانی قوی از MicroPython، گزینه‌های ایده‌آلی به شمار می‌روند. انتخاب بین ESP32 و ESP8266 بستگی به نیازهای پروژه شما دارد؛ ESP32 با هسته‌های بیشتر، حافظه بیشتر و قابلیت‌های BLE، برای پروژه‌های پیچیده‌تر و ESP8266 برای کاربردهای ساده‌تر و کم‌مصرف‌تر مناسب است.
  • کابل USB Micro-B یا USB-C: بسته به نوع برد ESP شما، برای اتصال آن به کامپیوتر و تأمین انرژی و همچنین برنامه‌ریزی آن، به یک کابل USB مناسب نیاز دارید. کیفیت کابل می‌تواند بر پایداری اتصال و فرآیند فلش کردن تأثیر بگذارد، لذا استفاده از کابل با کیفیت توصیه می‌شود. اطمینان حاصل کنید که کابل شما قابلیت انتقال داده (نه فقط شارژ) را دارد.

نرم‌افزارهای کلیدی: محیط توسعه و ابزارهای جانبی

  • پایتون 3 (Python 3): MicroPython یک پیاده‌سازی از پایتون است و برای تعامل با برد ESP و استفاده از ابزارهایی مانند esptool.py، به نصب پایتون 3 روی سیستم عامل خود نیاز دارید. توصیه می‌شود آخرین نسخه پایدار پایتون 3 را از وب‌سایت رسمی python.org دانلود و نصب کنید. در حین نصب، اطمینان حاصل کنید که گزینه “Add Python to PATH” را فعال کرده‌اید تا بتوانید به راحتی از خط فرمان از آن استفاده کنید.
  • pip: مدیر بسته پایتون که معمولاً با پایتون 3 نصب می‌شود. از pip برای نصب کتابخانه‌ها و ابزارهای پایتون مورد نیاز مانند esptool.py استفاده خواهیم کرد. می‌توانید با دستور pip --version در ترمینال، از نصب بودن آن اطمینان حاصل کنید.
  • Visual Studio Code (VSCode): یک محیط توسعه یکپارچه (IDE) سبک و قدرتمند که به دلیل انعطاف‌پذیری و پشتیبانی از افزونه‌های متعدد، برای توسعه MicroPython ایده‌آل است. VSCode را از وب‌سایت رسمی code.visualstudio.com دانلود و نصب کنید. محیط کاربری آن با قابلیت‌های پیشرفته ویرایش کد، ترمینال یکپارچه و سیستم مدیریت افزونه‌ها، تجربه توسعه را به شدت بهبود می‌بخشد.
  • اکستنشن‌های VSCode برای MicroPython: دو اکستنشن اصلی وجود دارد که توسعه MicroPython در VSCode را تسهیل می‌کنند:
    • Pymakr: این اکستنشن توسط Pycom توسعه یافته و ابزارهای قدرتمندی برای همگام‌سازی فایل‌ها، اجرای کد، و دسترسی به کنسول سریال ارائه می‌دهد. Pymakr به طور خاص برای توسعه MicroPython طراحی شده و قابلیت‌های زیادی را برای مدیریت پروژه و آپلود کد فراهم می‌کند.
    • MicroPython: یک اکستنشن دیگر که امکانات مشابهی را ارائه می‌دهد و توسط جامعه توسعه یافته است. این اکستنشن نیز قابلیت‌های اتصال سریال، آپلود فایل و اجرای اسکریپت‌ها را داراست. انتخاب بین این دو ممکن است به ترجیح شخصی شما بستگی داشته باشد، اما Pymakr معمولاً امکانات جامع‌تری برای مدیریت پروژه ارائه می‌دهد.

    شما می‌توانید این اکستنشن‌ها را از طریق Marketplace در VSCode نصب کنید. کافی است به بخش Extensions (با آیکون مربع در نوار کناری) بروید و نام اکستنشن را جستجو کنید.

  • درایورهای USB سریال: برای اینکه کامپیوتر شما بتواند با برد ESP از طریق کابل USB ارتباط برقرار کند، نیاز به درایورهای مناسب دارید. اکثر بردهای ESP از چیپ‌های مبدل USB به سریال مانند CP210x (تولید Silicon Labs) یا CH340/CH341 (تولید WCH) استفاده می‌کنند.
    • برای CP210x: درایورها را می‌توانید از وب‌سایت رسمی Silicon Labs دانلود کنید.
    • برای CH340/CH341: درایورها را می‌توانید با جستجوی “CH340 driver” در اینترنت پیدا کنید، معمولاً از وب‌سایت تولیدکننده یا مخازن گیت‌هاب مربوطه.

    پس از نصب درایورها، برد ESP شما باید به عنوان یک پورت COM (در ویندوز) یا /dev/ttyUSBx یا /dev/tty.SLAB_USBtoUART (در لینوکس/مک) شناسایی شود. می‌توانید این را در Device Manager ویندوز یا با دستور ls /dev/tty.* در لینوکس/مک بررسی کنید.

با آماده‌سازی این ابزارها و سخت‌افزارها، شما یک محیط توسعه قوی و پایدار برای شروع پروژه MicroPython IoT خود خواهید داشت. این مرحله زیربنای تمامی فعالیت‌های آینده شما خواهد بود، پس از صحت و کامل بودن تمامی موارد اطمینان حاصل کنید.

آماده‌سازی برد ESP: نصب MicroPython Firmware

پیش از آنکه بتوانید کد MicroPython را روی برد ESP خود اجرا کنید، لازم است که فریم‌ور MicroPython را بر روی آن نصب کنید. این فرآیند، سیستم عامل MicroPython را بر روی حافظه فلش برد شما رایت می‌کند و امکان اجرای کدهای پایتون را فراهم می‌آورد. در این بخش، گام به گام نحوه انجام این کار با استفاده از ابزار esptool.py را توضیح خواهیم داد، که ابزار رسمی برای تعامل با تراشه‌های ESP است.

گام 1: دانلود آخرین فریم‌ور MicroPython

اولین قدم، دریافت فایل فریم‌ور مناسب برای برد شماست. فریم‌ورهای MicroPython به طور مداوم در حال توسعه هستند و نسخه‌های جدید با بهبودها و رفع اشکالات منتشر می‌شوند.
برای ESP32، به صفحه دانلود فریم‌ور ESP32 MicroPython در وب‌سایت micropython.org مراجعه کنید. معمولاً فایلی با پسوند .bin و نامی شبیه esp32-xxxx-xx-xx.bin را دانلود خواهید کرد.
برای ESP8266، به صفحه دانلود فریم‌ور ESP8266 MicroPython مراجعه کنید. فایلی شبیه esp8266-xxxx-xx-xx.bin مورد نظر شماست.
توصیه می‌شود همواره از جدیدترین نسخه پایدار (stable) فریم‌ور استفاده کنید. فایل دانلود شده را در مکانی مناسب در کامپیوتر خود ذخیره کنید، زیرا در مراحل بعدی به آن نیاز خواهید داشت.

گام 2: نصب esptool.py

esptool.py یک ابزار خط فرمان پایتون است که برای فلش کردن فریم‌ور و انجام عملیات دیگر روی تراشه‌های ESP طراحی شده است. اگر پایتون و pip را قبلاً نصب کرده‌اید، می‌توانید esptool.py را به راحتی نصب کنید.
ترمینال یا Command Prompt را باز کرده و دستور زیر را اجرا کنید:

pip install esptool

این دستور esptool.py و تمامی وابستگی‌های آن را نصب خواهد کرد. برای اطمینان از نصب صحیح، می‌توانید esptool.py --version را اجرا کنید. اگر با پیامی مبنی بر نمایش نسخه مواجه شدید، نصب موفقیت‌آمیز بوده است.

گام 3: پاک کردن حافظه فلش برد (اختیاری اما توصیه می‌شود)

قبل از فلش کردن فریم‌ور جدید، به خصوص اگر قبلاً فریم‌ور دیگری (مانند Arduino یا نسخه‌ای قدیمی از MicroPython) روی برد شما بوده است، توصیه می‌شود حافظه فلش برد را پاک کنید. این کار از بروز تداخلات احتمالی جلوگیری می‌کند و اطمینان می‌دهد که MicroPython روی یک حافظه “تمیز” نصب می‌شود.

  1. برد ESP خود را از طریق کابل USB به کامپیوتر متصل کنید.
  2. پورت سریال برد خود را شناسایی کنید.
    • در ویندوز: به Device Manager بروید و پورت COM مربوط به برد را پیدا کنید (مثلاً COM3، COM4 و غیره).
    • در لینوکس: دستور ls /dev/tty* را اجرا کرده و به دنبال پورت‌هایی مانند /dev/ttyUSB0 یا /dev/ttyACM0 بگردید.
    • در macOS: دستور ls /dev/tty.* را اجرا کرده و به دنبال پورت‌هایی مانند /dev/tty.usbserial-XXXX یا /dev/tty.SLAB_USBtoUART بگردید.
  3. اکنون دستور زیر را در ترمینال اجرا کنید. <YOUR_PORT> را با پورت شناسایی شده خود جایگزین کنید (مثلاً COM4 یا /dev/ttyUSB0).
esptool.py --port <YOUR_PORT> erase_flash

اگر با خطای دسترسی مواجه شدید، در لینوکس ممکن است نیاز به اجرای دستور با sudo داشته باشید یا کاربر خود را به گروه dialout اضافه کنید (sudo usermod -a -G dialout $USER و سپس log out و log in کنید). در طول فرآیند پاک کردن، ممکن است لازم باشد دکمه BOOT (گاهی اوقات با نام FLASH یا IO0) را روی برد ESP خود فشار داده و نگه دارید تا زمانی که ابزار شروع به ارتباط کند و سپس آن را رها کنید. برخی بردها این کار را به صورت خودکار انجام می‌دهند.

گام 4: فلش کردن فریم‌ور MicroPython

پس از پاک کردن حافظه فلش، اکنون زمان فلش کردن فریم‌ور MicroPython است.
دستور زیر را در ترمینال اجرا کنید. مطمئن شوید که <YOUR_PORT> را با پورت صحیح و <PATH_TO_FIRMWARE.bin> را با مسیر کامل فایل فریم‌ور .bin که دانلود کرده‌اید، جایگزین کنید.

برای ESP32:

esptool.py --chip esp32 --port <YOUR_PORT> write_flash -z 0x1000 <PATH_TO_FIRMWARE.bin>

برای ESP8266:

esptool.py --chip esp8266 --port <YOUR_PORT> write_flash -z 0x1000 <PATH_TO_FIRMWARE.bin>

توجه: 0x1000 آدرس شروع برای فلش کردن فریم‌ور است که استاندارد برای MicroPython است. دوباره، ممکن است نیاز باشد دکمه BOOT را نگه دارید تا فرآیند شروع شود.

پس از اتمام فرآیند فلش کردن، پیامی مبنی بر موفقیت‌آمیز بودن عملیات نمایش داده خواهد شد. اکنون برد ESP شما آماده اجرای کدهای MicroPython است.

گام 5: تأیید نصب MicroPython

برای اطمینان از نصب صحیح فریم‌ور، می‌توانید از یک ترمینال سریال برای اتصال به برد استفاده کنید. ابزارهایی مانند PuTTY (ویندوز)، Minicom (لینوکس)، Screen (لینوکس/macOS) یا حتی ترمینال داخلی VSCode (که در بخش بعدی توضیح داده می‌شود) قابل استفاده هستند.
پس از اتصال به پورت سریال برد با نرخ باد (baud rate) 115200، دکمه RESET (EN یا RST) را روی برد فشار دهید. شما باید یک پیام خوش‌آمدگویی از MicroPython و پرامپت REPL (>>>) را مشاهده کنید. به عنوان مثال:

MicroPython v1.19.1-XXXX on 2022-XX-XX; ESP32 module with ESP32
Type "help()" for more information.
>>>

اگر این پیام را دیدید، تبریک می‌گوییم! MicroPython با موفقیت بر روی برد ESP شما نصب شده است و آماده کدنویسی هستید.

پیکربندی VSCode برای توسعه MicroPython

Visual Studio Code (VSCode) به دلیل انعطاف‌پذیری بالا، اکستنشن‌های قدرتمند و محیط کاربری مدرن، انتخابی عالی برای توسعه MicroPython است. در این بخش، نحوه پیکربندی VSCode را برای ایجاد یک محیط توسعه بهینه برای پروژه‌های MicroPython خود، به تفصیل بررسی خواهیم کرد.

گام 1: نصب اکستنشن‌های MicroPython در VSCode

اولین و مهم‌ترین گام، نصب اکستنشن‌های مورد نیاز است که به VSCode اجازه می‌دهند تا با بردهای MicroPython شما ارتباط برقرار کند.
برای نصب، VSCode را باز کرده و به بخش Extensions (آیکون مربع در نوار کناری سمت چپ) بروید، یا کلیدهای Ctrl+Shift+X را فشار دهید.
در نوار جستجو، یکی از اکستنشن‌های زیر را جستجو و نصب کنید:

Pymakr

Pymakr یک اکستنشن جامع است که توسط Pycom برای توسعه MicroPython ساخته شده است. این اکستنشن قابلیت‌های زیر را ارائه می‌دهد:

  • همگام‌سازی فایل‌ها: امکان آپلود خودکار یا دستی فایل‌های پروژه شما به برد.
  • کنسول REPL: یک ترمینال داخلی برای تعامل مستقیم با MicroPython REPL روی برد.
  • مدیریت پروژه: قابلیت ایجاد و مدیریت پروژه‌های MicroPython.
  • اجرای کد: امکان اجرای قطعه کد یا کل فایل‌ها روی برد.

برای نصب، “Pymakr” را جستجو کرده و روی دکمه Install کلیک کنید.

MicroPython

این اکستنشن یک جایگزین سبک‌تر است که قابلیت‌های اصلی مورد نیاز برای توسعه MicroPython را ارائه می‌دهد، از جمله ارتباط سریال، آپلود فایل و REPL. اگر به دنبال یک راه حل ساده‌تر هستید، این اکستنشن نیز می‌تواند مفید باشد.
برای نصب، “MicroPython” را جستجو کرده و روی دکمه Install کلیک کنید.

در این راهنما، ما بر روی Pymakr تمرکز خواهیم کرد زیرا قابلیت‌های جامع‌تری برای مدیریت پروژه ارائه می‌دهد.

گام 2: ایجاد یک پروژه جدید MicroPython در VSCode

پس از نصب Pymakr، VSCode را مجدداً راه‌اندازی کنید تا اکستنشن فعال شود.
1. یک پوشه جدید برای پروژه خود ایجاد کنید (مثلاً my_iot_project).
2. در VSCode، به مسیر File > Open Folder بروید و پوشه تازه ایجاد شده را انتخاب کنید.
3. در نوار پایین VSCode، دکمه “Pymakr” را مشاهده خواهید کرد. روی آن کلیک کنید یا به View > Command Palette (Ctrl+Shift+P) بروید و Pymakr > Create Project را جستجو کنید.
4. Pymakr فایل project.json را در ریشه پوشه پروژه شما ایجاد می‌کند. این فایل حاوی تنظیمات پروژه شما، از جمله پورت سریال و نرخ باد است.

گام 3: پیکربندی Pymakr در project.json

فایل project.json را باز کنید. این فایل شامل تنظیمات کلیدی برای اتصال به برد شماست. مهم‌ترین تنظیمات عبارتند از:

  • "port": پورت سریال برد ESP شما (مثلاً "COM3" در ویندوز یا "/dev/ttyUSB0" در لینوکس).
  • "baudrate": نرخ باد ارتباط سریال، که معمولاً 115200 است.

نمونه‌ای از فایل project.json:

{
    "name": "my_iot_project",
    "target": "pyboard",
    "firmware": "MicroPython",
    "debugPymakr": true,
    "fastUpload": true,
    "syncFolders": [
        "./"
    ],
    "alwaysUploadOnSave": false,
    "safeWrite": false,
    "py_ignore": [
        ".vscode",
        ".git",
        ".venv",
        "node_modules",
        "Pymakr.sublime-settings",
        "project.json",
        "boot.py",
        "main.py"
    ],
    "serial": {
        "port": "COM3", 
        "baudrate": 115200,
        "parity": "N",
        "dataBits": 8,
        "stopBits": 1,
        "rtscts": false,
        "xonxoff": false
    },
    "defaultReplBaudrate": 115200
}

تنظیم "port" را با پورت صحیح برد خود جایگزین کنید. اگر از macOS یا لینوکس استفاده می‌کنید، مسیر پورت ممکن است متفاوت باشد. مثلاً برای macOS: "/dev/tty.usbserial-A104E9J1".

گام 4: استفاده از ترمینال Pymakr و آپلود کد

پس از پیکربندی project.json، می‌توانید از قابلیت‌های Pymakr استفاده کنید.
1. اتصال به برد: در نوار پایین VSCode، روی دکمه “Connect” یا “Pymakr” کلیک کنید. Pymakr سعی می‌کند به برد شما متصل شود. پس از اتصال موفقیت‌آمیز، یک پنجره ترمینال (Pymakr Console) در پایین VSCode باز می‌شود که REPL برد شما را نمایش می‌دهد. شما می‌توانید دستورات پایتون را مستقیماً در این ترمینال وارد کرده و نتیجه را مشاهده کنید.
2. آپلود فایل‌ها:
* Manual Upload: روی فایلی در Explorer کلیک راست کرده و گزینه “Upload file” را انتخاب کنید.
* Upload Project: در نوار پایین VSCode، روی آیکون “Upload” کلیک کنید تا کل پروژه به برد آپلود شود. این کار تمامی فایل‌های موجود در syncFolders را به برد منتقل می‌کند.
* Auto Upload on Save: می‌توانید "alwaysUploadOnSave": true را در project.json تنظیم کنید تا فایل‌ها به صورت خودکار با هر بار ذخیره، آپلود شوند. این ویژگی می‌تواند بسیار مفید باشد اما در مراحل اولیه ممکن است باعث برخی تداخلات شود، پس با احتیاط از آن استفاده کنید.
3. اجرای کد: پس از آپلود، می‌توانید با تایپ دستور import <your_module_name> در کنسول REPL، کد خود را اجرا کنید. یا اگر فایل شما main.py است و در ریشه برد قرار دارد، پس از ریستارت، به صورت خودکار اجرا خواهد شد.

نکات تکمیلی برای تجربه بهتر:

  • فایل boot.py و main.py: در MicroPython، فایل boot.py هنگام راه‌اندازی برد اجرا می‌شود (برای تنظیمات اولیه مانند Wi-Fi یا پورت سریال) و سپس main.py اجرا می‌شود که حاوی منطق اصلی برنامه شماست. Pymakr به طور پیش‌فرض این فایل‌ها را با فایل‌های پروژه شما آپلود می‌کند.
  • REPL (Read-Eval-Print Loop): کنسول REPL یک ابزار فوق‌العاده برای تست سریع قطعات کد، اشکال‌زدایی و بررسی وضعیت برد است. از آن به طور فعال استفاده کنید.
  • پیکربندی VSCode برای Python Linting و Formatting: حتماً اکستنشن Python را نصب کنید و ابزارهایی مانند Pylint یا Flake8 برای Linting و Black یا autopep8 برای Formatting را پیکربندی کنید. این ابزارها به حفظ کیفیت کد و رعایت استانداردهای پایتون کمک می‌کنند.

با این پیکربندی‌ها، شما یک محیط توسعه قدرتمند و کارآمد برای پروژه‌های MicroPython خود در VSCode خواهید داشت که به شما امکان می‌دهد با سرعت و دقت بالاتری کدنویسی و اشکال‌زدایی کنید.

اتصال به Wi-Fi با MicroPython: کدنویسی گام به گام

یکی از قابلیت‌های کلیدی بردهای ESP، توانایی اتصال به شبکه Wi-Fi است که آن‌ها را به ابزاری قدرتمند برای پروژه‌های اینترنت اشیاء تبدیل می‌کند. در MicroPython، ماژول network مسئول مدیریت تمام جنبه‌های ارتباط بی‌سیم است. در این بخش، به طور مفصل به نحوه استفاده از این ماژول برای اتصال برد ESP به یک شبکه Wi-Fi در حالت ایستگاه (Station mode) خواهیم پرداخت.

آشنایی با ماژول network در MicroPython

ماژول network رابطی برای کنترل ارتباطات شبکه فراهم می‌کند. این ماژول امکان پیکربندی و مدیریت رابط‌های شبکه Wi-Fi را در حالت‌های مختلف از جمله Station (STA) و Access Point (AP) می‌دهد. حالت STA به برد شما اجازه می‌دهد تا به عنوان یک کلاینت به یک روتر Wi-Fi موجود متصل شود، در حالی که حالت AP به برد اجازه می‌دهد تا خود به عنوان یک نقطه دسترسی عمل کرده و دستگاه‌های دیگر به آن متصل شوند. برای اتصال به اینترنت، ما از حالت STA استفاده خواهیم کرد.

کد پایه برای اتصال در حالت STA

برای اتصال به یک شبکه Wi-Fi، به حداقل اطلاعات SSID (نام شبکه) و رمز عبور (اگر شبکه امن است) نیاز دارید. کدهای زیر را می‌توانید در فایل main.py پروژه خود قرار دهید.

گام 1: وارد کردن ماژول network

در ابتدای کد خود، ماژول network و utime (برای تأخیر زمانی) را وارد کنید:

import network
import utime

گام 2: تعریف اطلاعات شبکه

SSID و رمز عبور شبکه Wi-Fi خود را تعریف کنید. این اطلاعات حساس هستند، بنابراین در محیط‌های تولیدی باید به روش‌های امن‌تری مدیریت شوند (مثلاً از فایل پیکربندی جداگانه یا ذخیره در EEPROM مجازی):

# اطلاعات شبکه Wi-Fi شما
WIFI_SSID = "Your_WiFi_SSID"
WIFI_PASSWORD = "Your_WiFi_Password"

گام 3: پیکربندی و فعال‌سازی رابط WLAN در حالت STA

یک شیء WLAN برای حالت STA ایجاد کنید و آن را فعال کنید. این کار رابط Wi-Fi را برای اتصال آماده می‌کند:

# ساخت یک شی WLAN در حالت STA (Station)
wlan = network.WLAN(network.STA_IF)

# فعال کردن رابط WLAN
wlan.active(True)
print("رابط WLAN فعال شد.")

گام 4: اسکن شبکه‌های موجود (اختیاری)

اگر می‌خواهید قبل از اتصال، شبکه‌های Wi-Fi موجود را ببینید، می‌توانید از تابع scan() استفاده کنید. این کار یک لیست از تاپل‌ها برمی‌گرداند که هر تاپل شامل (SSID، BSSID، کانال، RSSI، امنیت، پنهان بودن) است:

# اسکن شبکه‌های Wi-Fi (اختیاری)
print("در حال اسکن شبکه‌های Wi-Fi...")
networks = wlan.scan()
for net in networks:
    print(f"  SSID: {net[0].decode('utf-8')}, RSSI: {net[3]} dBm")

توجه داشته باشید که net[0] یک بایت‌آرایه است و باید با decode('utf-8') به رشته تبدیل شود.

گام 5: اتصال به شبکه Wi-Fi

برای اتصال، متد connect() را با SSID و رمز عبور فراخوانی کنید. سپس باید صبر کنید تا اتصال برقرار شود. می‌توانید از یک حلقه while برای این کار استفاده کنید و وضعیت اتصال را با isconnected() بررسی کنید:

# بررسی وضعیت اتصال و قطع ارتباط قبلی در صورت وجود
if wlan.isconnected():
    wlan.disconnect()
    print("اتصال قبلی قطع شد.")

# اتصال به شبکه Wi-Fi
print(f"در حال اتصال به شبکه Wi-Fi: {WIFI_SSID}...")
wlan.connect(WIFI_SSID, WIFI_PASSWORD)

# انتظار برای برقراری اتصال
max_attempts = 20  # حداکثر تلاش برای اتصال
attempts = 0
while not wlan.isconnected() and attempts < max_attempts:
    print(f"در انتظار اتصال... تلاش {attempts + 1}/{max_attempts}")
    utime.sleep(1) # تأخیر 1 ثانیه
    attempts += 1

if wlan.isconnected():
    print("اتصال به Wi-Fi برقرار شد!")
    # نمایش اطلاعات IP
    print("پیکربندی شبکه (IP, Subnet, Gateway, DNS):", wlan.ifconfig())
else:
    print(f"خطا در اتصال به Wi-Fi پس از {max_attempts} تلاش.")
    print("لطفاً SSID و رمز عبور را بررسی کنید.")

wlan.ifconfig() یک تاپل را برمی‌گرداند که شامل آدرس IP، Netmask، Gateway و DNS سرور است. این اطلاعات بسیار مهم هستند و نشان‌دهنده موفقیت‌آمیز بودن اتصال و دریافت آدرس IP از DHCP سرور روتر شماست.

گام 6: مدیریت خطاها و پایداری اتصال

در پروژه‌های واقعی، نیاز به مدیریت قوی‌تر خطاهای اتصال و اطمینان از پایداری آن دارید. این شامل استراتژی‌های اتصال مجدد و بررسی دوره‌ای وضعیت اتصال است. در بخش بعدی به این موضوع می‌پردازیم.

کد کامل برای اتصال به Wi-Fi

در اینجا یک نمونه کد کامل که تمامی مراحل بالا را ترکیب می‌کند، آورده شده است:

import network
import utime

# اطلاعات شبکه Wi-Fi شما
WIFI_SSID = "Your_WiFi_SSID"
WIFI_PASSWORD = "Your_WiFi_Password"

def connect_to_wifi(ssid, password, max_wait_time=10):
    """
    تلاش برای اتصال به شبکه Wi-Fi مشخص شده.
    :param ssid: نام شبکه Wi-Fi (SSID)
    :param password: رمز عبور شبکه Wi-Fi
    :param max_wait_time: حداکثر زمان انتظار برای اتصال (بر حسب ثانیه)
    :return: شی WLAN در صورت موفقیت، در غیر این صورت None
    """
    wlan = network.WLAN(network.STA_IF)

    if not wlan.active():
        wlan.active(True)
        print("رابط WLAN فعال شد.")
    
    # اگر قبلاً متصل بود، ابتدا قطع شود
    if wlan.isconnected():
        print("اتصال قبلی Wi-Fi یافت شد. قطع اتصال...")
        wlan.disconnect()
        utime.sleep(1) # تأخیر کوتاه برای اطمینان از قطع کامل

    print(f"در حال اتصال به شبکه Wi-Fi: {ssid}...")
    wlan.connect(ssid, password)

    start_time = utime.time()
    while not wlan.isconnected() and (utime.time() - start_time) < max_wait_time:
        print(f"در انتظار اتصال... {int(utime.time() - start_time)} ثانیه گذشته است.")
        utime.sleep(1)

    if wlan.isconnected():
        print("اتصال به Wi-Fi برقرار شد!")
        print("پیکربندی شبکه (IP, Subnet, Gateway, DNS):", wlan.ifconfig())
        return wlan
    else:
        print(f"خطا در اتصال به Wi-Fi پس از {max_wait_time} ثانیه.")
        print("لطفاً SSID و رمز عبور را بررسی کنید و از در دسترس بودن شبکه اطمینان حاصل کنید.")
        return None

# ----- اجرای تابع اتصال -----
if __name__ == "__main__":
    wifi_connection = connect_to_wifi(WIFI_SSID, WIFI_PASSWORD)

    if wifi_connection:
        print("برد آماده برای ارتباط اینترنتی است.")
        # اینجا می‌توانید کدهای مربوط به ارتباط اینترنتی خود را اضافه کنید
        # مثلاً ارسال داده به یک سرور، دریافت فرمان، و غیره.
    else:
        print("عدم موفقیت در اتصال به Wi-Fi. برنامه نمی‌تواند ادامه یابد.")

    # مثال: در حلقه اصلی برای ادامه کار
    # while True:
    #     if wifi_connection and wifi_connection.isconnected():
    #         print("اتصال فعال است، ادامه کار...")
    #         # انجام عملیات IoT
    #     else:
    #         print("اتصال قطع شده، تلاش برای اتصال مجدد...")
    #         wifi_connection = connect_to_wifi(WIFI_SSID, WIFI_PASSWORD)
    #     utime.sleep(10) # تأخیر برای جلوگیری از مصرف بیش از حد CPU و شبکه

با آپلود این کد در برد ESP خود (مثلاً به عنوان main.py)، پس از ریستارت، برد سعی می‌کند به شبکه Wi-Fi شما متصل شود و پیام‌های مربوط به وضعیت اتصال را در کنسول REPL نمایش می‌دهد. این یک نقطه شروع محکم برای تمامی پروژه‌های IoT شماست که نیاز به اتصال به اینترنت دارند.

مدیریت اتصال Wi-Fi و رفع اشکال

اتصال به Wi-Fi تنها نیمی از ماجراست؛ حفظ پایداری این اتصال و توانایی رفع مشکلات احتمالی، برای هر پروژه IoT حیاتی است. دستگاه‌های IoT اغلب در محیط‌هایی با سیگنال ضعیف، تداخلات الکترومغناطیسی، یا قطعی‌های برق موقت قرار می‌گیرند که می‌تواند منجر به قطع ارتباط Wi-Fi شود. این بخش به استراتژی‌های مدیریت اتصال مجدد، شناسایی مشکلات رایج و تکنیک‌های رفع اشکال می‌پردازد تا دستگاه شما همیشه آنلاین بماند و به درستی عمل کند.

استراتژی‌های اتصال مجدد (Reconnection Strategies)

دستگاه‌های MicroPython باید توانایی بازیابی خودکار از قطع ارتباط Wi-Fi را داشته باشند. پیاده‌سازی یک مکانیزم اتصال مجدد قوی، کلید پایداری پروژه شماست.

  1. بررسی دوره‌ای وضعیت اتصال:

    در حلقه اصلی برنامه خود، به طور مداوم وضعیت اتصال Wi-Fi را با wlan.isconnected() بررسی کنید. اگر اتصال قطع شده بود، باید فرآیند اتصال مجدد را آغاز کنید.

    import network
    import utime
    
    # ... کد اتصال اولیه Wi-Fi (تابع connect_to_wifi) ...
    
    def main_loop():
        wlan_obj = None
        while True:
            if wlan_obj is None or not wlan_obj.isconnected():
                print("اتصال Wi-Fi قطع شده است. تلاش برای اتصال مجدد...")
                wlan_obj = connect_to_wifi(WIFI_SSID, WIFI_PASSWORD, max_wait_time=30)
                if wlan_obj:
                    print("اتصال مجدد موفقیت‌آمیز.")
                else:
                    print("اتصال مجدد ناموفق. در انتظار 30 ثانیه قبل از تلاش مجدد.")
                    utime.sleep(30) # تأخیر بیشتر در صورت عدم موفقیت اتصال
                    continue # شروع دوباره حلقه برای تلاش مجدد
    
            # اگر اتصال برقرار است، کارهای اصلی برنامه را انجام دهید
            print("اتصال Wi-Fi فعال است. انجام عملیات IoT...")
            # مثلاً خواندن سنسور و ارسال داده
            utime.sleep(5) # تأخیر کوتاه قبل از بررسی مجدد وضعیت اتصال
    
    if __name__ == "__main__":
        main_loop()
  2. تأخیر نمایی (Exponential Backoff):

    برای جلوگیری از اشباع شبکه با درخواست‌های اتصال مکرر و همچنین مصرف بی‌رویه انرژی، می‌توانید از تأخیر نمایی استفاده کنید. به این صورت که پس از هر بار تلاش ناموفق برای اتصال، مدت زمان انتظار برای تلاش بعدی را به صورت نمایی افزایش دهید (مثلاً 1، 2، 4، 8، 16 ثانیه و...).

    def connect_with_backoff(ssid, password):
                wlan = network.WLAN(network.STA_IF)
                wlan.active(True)
                attempts = 0
                while not wlan.isconnected():
                    if attempts > 0:
                        wait_time = min(2 ** attempts, 300) # حداکثر 5 دقیقه
                        print(f"تلاش {attempts} ناموفق. انتظار {wait_time} ثانیه...")
                        utime.sleep(wait_time)
                    
                    print(f"تلاش برای اتصال به {ssid}...")
                    wlan.connect(ssid, password)
                    start_time = utime.time()
                    while not wlan.isconnected() and (utime.time() - start_time) < 10: # 10 ثانیه انتظار اولیه
                        utime.sleep(1)
                    
                    if wlan.isconnected():
                        print("اتصال موفقیت‌آمیز!")
                        print(wlan.ifconfig())
                        return wlan
                    else:
                        print("اتصال ناموفق.")
                        attempts += 1
                return wlan
  3. ریست نرم‌افزاری:

    در برخی موارد، ممکن است رابط Wi-Fi به حالت ناپایدار رفته و نیاز به ریست نرم‌افزاری داشته باشد. می‌توانید با wlan.active(False) و سپس wlan.active(True) این کار را انجام دهید. در موارد شدیدتر، ممکن است نیاز باشد برد را به طور کامل ریست کنید (machine.reset()).

مشکلات رایج و تکنیک‌های رفع اشکال

هنگام اتصال به Wi-Fi، ممکن است با مشکلات مختلفی مواجه شوید. درک این مشکلات و نحوه عیب‌یابی آن‌ها ضروری است.

  1. SSID یا رمز عبور اشتباه:
    • علامت: برد دائماً تلاش می‌کند متصل شود اما موفق نمی‌شود، یا پس از تلاش‌های متعدد به خطا می‌خورد.
    • رفع اشکال: اولین چیزی که باید بررسی کنید، املای صحیح SSID و رمز عبور است. مطمئن شوید که حروف بزرگ و کوچک (case-sensitivity) را رعایت کرده‌اید. برخی شبکه‌ها ممکن است کاراکترهای خاصی در SSID یا رمز عبور داشته باشند که باید به درستی مدیریت شوند.
  2. قدرت سیگنال ضعیف:
    • علامت: برد به کندی متصل می‌شود، یا اتصال برقرار می‌شود اما به سرعت قطع می‌شود. در wlan.scan()، مقدار RSSI (Received Signal Strength Indicator) بسیار پایین (مثلاً زیر -80 dBm) است.
    • رفع اشکال: برد را به روتر نزدیک‌تر کنید. اطمینان حاصل کنید که موانع فیزیکی (مانند دیوارها یا دستگاه‌های الکترونیکی دیگر) بین برد و روتر وجود ندارد. استفاده از آنتن‌های خارجی (اگر برد شما پشتیبانی می‌کند) می‌تواند کمک کننده باشد.
  3. مشکلات DHCP (عدم دریافت آدرس IP):
    • علامت: برد به شبکه Wi-Fi متصل می‌شود (wlan.isconnected() ممکن است True برگرداند) اما نمی‌تواند آدرس IP دریافت کند، یا wlan.ifconfig() همه صفرها را نمایش می‌دهد (('0.0.0.0', '0.0.0.0', '0.0.0.0', '0.0.0.0')).
    • رفع اشکال:
      • روتر خود را ریستارت کنید.
      • تعداد دستگاه‌های متصل به روتر را بررسی کنید؛ ممکن است ظرفیت DHCP سرور پر شده باشد.
      • IP استاتیک (Static IP) را روی برد تنظیم کنید، اگرچه این کار برای بسیاری از پروژه‌ها پیچیدگی بیشتری ایجاد می‌کند. (wlan.ifconfig(('192.168.1.100', '255.255.255.0', '192.168.1.1', '8.8.8.8')))
  4. تداخل کانال Wi-Fi:
    • علامت: اتصال ناپایدار یا کند است، به خصوص در محیط‌های شلوغ با شبکه‌های Wi-Fi زیاد.
    • رفع اشکال: از ابزارهای تحلیل‌گر Wi-Fi (مانند Wi-Fi Analyzer در گوشی‌های هوشمند) برای شناسایی کانال‌های کم‌ترافیک استفاده کرده و کانال روتر خود را به یکی از این کانال‌ها (معمولاً 1، 6 یا 11) تغییر دهید.
  5. مشکلات فریم‌ور MicroPython:
    • علامت: رفتار غیرمنتظره، کرش کردن برد، یا عدم عملکرد صحیح ماژول network.
    • رفع اشکال: اطمینان حاصل کنید که از آخرین نسخه پایدار فریم‌ور MicroPython استفاده می‌کنید. اگر مشکل همچنان پابرجاست، سعی کنید فریم‌ور را مجدداً فلش کنید (شامل پاک کردن کامل فلش).
  6. کشینگ (Caching) پورت سریال / مشکلات اکستنشن VSCode:
    • علامت: Pymakr نمی‌تواند به برد متصل شود، یا خطا در آپلود فایل‌ها.
    • رفع اشکال: VSCode را ریستارت کنید. درایورهای USB سریال را مجدداً نصب کنید. پورت سریال را در project.json دوباره بررسی کنید. گاهی اوقات بستن برنامه‌هایی که ممکن است پورت سریال را اشغال کرده باشند (مانند Arduino IDE یا سایر ترمینال‌های سریال) ضروری است.

تکنیک‌های اشکال‌زدایی:

  • استفاده از print(): بهترین دوست شما در MicroPython. از print() برای نمایش وضعیت متغیرها، نتایج توابع و جریان برنامه در کنسول REPL استفاده کنید.
  • wlan.ifconfig(): پس از تلاش برای اتصال، همیشه wlan.ifconfig() را بررسی کنید تا مطمئن شوید برد یک آدرس IP معتبر دریافت کرده است.
  • wlan.status(): این تابع وضعیت فعلی رابط Wi-Fi را به صورت یک کد عددی برمی‌گرداند. می‌توانید از آن برای درک دقیق‌تر وضعیت اتصال استفاده کنید (مثلاً network.STAT_CONNECTING، network.STAT_GOT_IP، network.STAT_NO_AP_FOUND).
  • پایش لاگ‌های روتر: برخی روترها لاگ‌های اتصالات دستگاه‌ها را نمایش می‌دهند. بررسی این لاگ‌ها می‌تواند اطلاعات مفیدی در مورد اینکه آیا برد شما به روتر متصل شده و آدرس IP دریافت کرده است، فراهم آورد.

با پیاده‌سازی استراتژی‌های اتصال مجدد و تسلط بر تکنیک‌های رفع اشکال، شما می‌توانید اطمینان حاصل کنید که پروژه‌های IoT مبتنی بر MicroPython شما حتی در شرایط نامساعد نیز به طور قابل اعتمادی کار خواهند کرد.

پروژه IoT نمونه: ارسال داده به سرور

اکنون که برد ESP شما با موفقیت به شبکه Wi-Fi متصل شده است، زمان آن رسیده که از این اتصال برای یک کاربرد عملی در دنیای IoT استفاده کنیم: ارسال داده‌ها به یک سرور. این یک گام اساسی در اکثر پروژه‌های IoT است، زیرا به دستگاه‌ها امکان می‌دهد تا اطلاعات جمع‌آوری شده از محیط را به سیستم‌های مرکزی منتقل کنند تا تجزیه و تحلیل، ذخیره و نمایش داده شوند. در این بخش، یک پروژه نمونه را پیاده‌سازی می‌کنیم که در آن برد ESP یک مقدار فرضی سنسور را خوانده و آن را به یک سرویس آنلاین (به عنوان مثال ThingSpeak یا یک API ساده) ارسال می‌کند.

انتخاب پروتکل و سرویس

برای ارسال داده به سرور، پروتکل‌های مختلفی وجود دارند که رایج‌ترین آن‌ها عبارتند از:

  • HTTP/HTTPS: پروتکل‌های استاندارد وب برای ارسال درخواست‌های GET (دریافت داده) و POST (ارسال داده). این روش ساده و برای ارسال داده‌های کم حجم یا در فواصل زمانی مشخص مناسب است.
  • MQTT (Message Queuing Telemetry Transport): یک پروتکل سبک و کارآمد برای IoT که بر اساس مدل انتشار/اشتراک (publish/subscribe) کار می‌کند. MQTT برای دستگاه‌های با منابع محدود و شبکه‌های ناپایدار بهینه‌سازی شده است.

برای سادگی و شروع سریع، در این مثال از HTTP (با ماژول urequests) برای ارسال داده‌ها به یک سرویس آنلاین مانند ThingSpeak استفاده خواهیم کرد. ThingSpeak یک پلتفرم IoT رایگان و متن‌باز است که به شما امکان می‌دهد داده‌ها را از سنسورهای خود جمع‌آوری، تجسم و تجزیه و تحلیل کنید.

آماده‌سازی ThingSpeak

قبل از نوشتن کد، باید یک کانال در ThingSpeak ایجاد کنید:

  1. به وب‌سایت ThingSpeak.com بروید و یک حساب کاربری رایگان ایجاد کنید.
  2. وارد شوید و به بخش "Channels" بروید و روی "New Channel" کلیک کنید.
  3. یک نام برای کانال خود (مثلاً "ESP_Sensor_Data") و یک توضیح (Description) وارد کنید.
  4. یک یا چند "Field" تعریف کنید. به عنوان مثال، اگر می‌خواهید دما را ارسال کنید، "Field 1" را به "Temperature" تغییر نام دهید.
  5. کانال را ذخیره کنید.
  6. پس از ذخیره، به تب "API Keys" بروید. در اینجا "Write API Key" خود را مشاهده خواهید کرد. این کلید برای ارسال داده به کانال شما لازم است. آن را کپی کنید.

کدنویسی MicroPython: ارسال داده به ThingSpeak از طریق HTTP

ماژول urequests در MicroPython یک نسخه ساده‌شده از ماژول requests پایتون است که برای انجام درخواست‌های HTTP طراحی شده است. این ماژول به طور پیش‌فرض در فریم‌ور MicroPython وجود ندارد و باید آن را به صورت دستی روی برد آپلود کنید.

گام 1: نصب ماژول urequests

اگر از Pymakr استفاده می‌کنید، معمولاً urequests به عنوان یک کتابخانه استاندارد در پکیج‌های MicroPython وجود ندارد. شما باید فایل urequests.py را از مخزن micropython-lib دانلود کرده و آن را در پوشه پروژه VSCode خود (کنار main.py) قرار دهید. سپس Pymakr آن را همراه با سایر فایل‌ها به برد آپلود خواهد کرد.

گام 2: پیاده‌سازی کد ارسال داده

کد زیر را در فایل main.py (یا یک ماژول جداگانه) خود قرار دهید. این کد پس از اتصال به Wi-Fi، یک مقدار فرضی دما را تولید کرده و آن را به ThingSpeak ارسال می‌کند.

import network
import utime
import urequests # مطمئن شوید که urequests.py روی برد آپلود شده است
import random # برای تولید داده‌های فرضی

# --- اطلاعات Wi-Fi (از بخش قبل) ---
WIFI_SSID = "Your_WiFi_SSID"
WIFI_PASSWORD = "Your_WiFi_Password"

# --- اطلاعات ThingSpeak ---
THINGSPEAK_API_KEY = "YOUR_THINGSPEAK_WRITE_API_KEY" # کلید API نوشتن کانال شما
THINGSPEAK_CHANNEL_ID = "YOUR_THINGSPEAK_CHANNEL_ID" # ID کانال شما
THINGSPEAK_URL = f"http://api.thingspeak.com/update" # URL برای ارسال داده

# --- تابع اتصال به Wi-Fi (همانند قبل) ---
def connect_to_wifi(ssid, password, max_wait_time=10):
    wlan = network.WLAN(network.STA_IF)
    if not wlan.active():
        wlan.active(True)
    if wlan.isconnected():
        wlan.disconnect()

    print(f"در حال اتصال به Wi-Fi: {ssid}...")
    wlan.connect(ssid, password)
    start_time = utime.time()
    while not wlan.isconnected() and (utime.time() - start_time) < max_wait_time:
        print(f"در انتظار اتصال... {int(utime.time() - start_time)} ثانیه")
        utime.sleep(1)

    if wlan.isconnected():
        print("اتصال به Wi-Fi برقرار شد!")
        print("پیکربندی شبکه:", wlan.ifconfig())
        return wlan
    else:
        print("خطا در اتصال به Wi-Fi.")
        return None

# --- تابع خواندن سنسور فرضی ---
def read_sensor_data():
    # در یک پروژه واقعی، اینجا سنسور فیزیکی خود را می‌خوانید.
    # به عنوان مثال، DHT11، BME280، یا LDR.
    # برای این مثال، یک عدد تصادفی بین 20 تا 30 تولید می‌کنیم.
    temperature = random.uniform(20.0, 30.0)
    print(f"مقدار سنسور خوانده شد: دما = {temperature:.2f} °C")
    return temperature

# --- تابع ارسال داده به ThingSpeak ---
def send_to_thingspeak(api_key, channel_id, field_data):
    try:
        # ساخت URL با پارامترهای GET
        # ThingSpeak برای هر فیلد از field1, field2 و ... استفاده می‌کند
        # ما در اینجا فرض می‌کنیم که دما به Field 1 ارسال می‌شود
        url = f"{THINGSPEAK_URL}?api_key={api_key}&field1={field_data:.2f}"
        
        print(f"ارسال به ThingSpeak: {url}")
        
        # ارسال درخواست GET
        response = urequests.get(url)
        
        # بررسی پاسخ سرور
        if response.status_code == 200:
            print("داده با موفقیت به ThingSpeak ارسال شد.")
        else:
            print(f"خطا در ارسال داده به ThingSpeak. کد وضعیت: {response.status_code}")
            print(f"پاسخ سرور: {response.text}")
        
        response.close() # بستن اتصال برای آزادسازی منابع
        
    except Exception as e:
        print(f"خطا در حین ارسال داده به ThingSpeak: {e}")

# --- حلقه اصلی برنامه ---
def main():
    wlan = None
    while True:
        if wlan is None or not wlan.isconnected():
            print("Wi-Fi قطع شده یا متصل نیست. در حال تلاش برای اتصال مجدد...")
            wlan = connect_to_wifi(WIFI_SSID, WIFI_PASSWORD, max_wait_time=20)
            if not wlan:
                print("عدم موفقیت در اتصال به Wi-Fi. در انتظار 30 ثانیه برای تلاش مجدد.")
                utime.sleep(30)
                continue

        # اگر Wi-Fi متصل است، داده‌ها را بخوانید و ارسال کنید
        try:
            temperature_data = read_sensor_data()
            send_to_thingspeak(THINGSPEAK_API_KEY, THINGSPEAK_CHANNEL_ID, temperature_data)
        except Exception as e:
            print(f"خطا در عملیات سنسور یا ارسال: {e}")
        
        # تأخیر برای جلوگیری از ارسال داده بیش از حد و رعایت محدودیت‌های API ThingSpeak
        # ThingSpeak معمولا اجازه ارسال هر 15 ثانیه یک بار را می‌دهد
        utime.sleep(20) # ارسال هر 20 ثانیه یک بار

if __name__ == "__main__":
    main()

نکات مهم برای پروژه نمونه:

  • THINGSPEAK_API_KEY و THINGSPEAK_CHANNEL_ID: این مقادیر را با کلید API و ID کانال خود در ThingSpeak جایگزین کنید.
  • مدیریت خطا: از بلوک‌های try...except برای مدیریت خطاهای احتمالی در ارتباطات شبکه و سنسورها استفاده کنید.
  • بستن پاسخ‌ها: حتماً متد response.close() را پس از اتمام کار با پاسخ HTTP فراخوانی کنید تا منابع شبکه آزاد شوند. این امر برای دستگاه‌های با حافظه محدود بسیار مهم است.
  • محدودیت‌های API: سرویس‌های ابری مانند ThingSpeak معمولاً محدودیت‌هایی در نرخ ارسال داده (Rate Limit) دارند (مثلاً هر 15 ثانیه یک بار برای ThingSpeak رایگان). برنامه خود را طوری طراحی کنید که این محدودیت‌ها را رعایت کند.
  • سنسورهای واقعی: در یک پروژه واقعی، تابع read_sensor_data() را با کدهای خواندن سنسورهای فیزیکی (مانند DHT11 برای دما و رطوبت، BME280 برای دما، رطوبت و فشار، یا LDR برای نور) جایگزین خواهید کرد. برای این کار، معمولاً نیاز به نصب کتابخانه‌های مربوط به سنسور خواهید داشت.
  • مصرف انرژی: ارسال مکرر داده‌ها می‌تواند مصرف انرژی را افزایش دهد. در پروژه‌های باتری‌خور، باید استراتژی‌هایی برای بهینه‌سازی مصرف انرژی (مانند Deep Sleep) در نظر گرفته شود.

با آپلود این کد در برد ESP خود، مشاهده خواهید کرد که برد به Wi-Fi متصل شده، مقادیر فرضی دما را می‌خواند و به طور منظم آن‌ها را به کانال ThingSpeak شما ارسال می‌کند. شما می‌توانید با مراجعه به تب "Private View" کانال خود در ThingSpeak، نمودارهای داده‌های ارسالی را مشاهده کنید. این پروژه یک گام عملی و قدرتمند در درک چگونگی تعامل دستگاه‌های IoT با سرویس‌های ابری است.

بهینه‌سازی و نکات پیشرفته در توسعه MicroPython IoT

پس از اینکه با اصول اولیه اتصال به Wi-Fi و ارسال داده در MicroPython آشنا شدید، زمان آن رسیده است که به جنبه‌های پیشرفته‌تر و بهینه‌سازی بپردازیم. این نکات برای ساخت پروژه‌های IoT با پایداری بالاتر، مصرف انرژی کمتر و امنیت بیشتر حیاتی هستند.

مدیریت مصرف انرژی در حالت Wi-Fi (Deep Sleep)

بزرگترین چالش در بسیاری از دستگاه‌های IoT که با باتری کار می‌کنند، مصرف انرژی است، به خصوص زمانی که Wi-Fi فعال است. ماژول Wi-Fi یکی از پرمصرف‌ترین قطعات روی برد ESP است. MicroPython راهکارهایی برای کاهش مصرف انرژی ارائه می‌دهد:

  1. حالت Deep Sleep (خواب عمیق): این کارآمدترین روش برای صرفه‌جویی در مصرف انرژی است. در حالت Deep Sleep، تقریباً تمام اجزای تراشه (از جمله پردازنده و Wi-Fi) خاموش می‌شوند، به جز یک تایمر یا پین خاص که می‌تواند برد را پس از یک دوره مشخص یا با یک رویداد خارجی بیدار کند.
    import machine
    import utime
    import network
    
    # ... (کد اتصال به Wi-Fi) ...
    
    def enable_deep_sleep(seconds):
        # فعال کردن حالت Deep Sleep پس از زمان مشخص
        print(f"ورود به Deep Sleep برای {seconds} ثانیه...")
        machine.deep_sleep(seconds * 1000) # machine.deep_sleep بر حسب میلی‌ثانیه کار می‌کند
    
    # مثال استفاده در main loop:
    if __name__ == "__main__":
        wlan = connect_to_wifi(WIFI_SSID, WIFI_PASSWORD)
        if wlan:
            # انجام عملیات IoT (خواندن سنسور، ارسال داده)
            temperature = read_sensor_data()
            send_to_thingspeak(THINGSPEAK_API_KEY, THINGSPEAK_CHANNEL_ID, temperature)
            
            # پس از اتمام کار، وارد Deep Sleep شوید
            enable_deep_sleep(60) # هر 60 ثانیه بیدار شود
        else:
            print("خطا در اتصال Wi-Fi. تلاش مجدد پس از تأخیر.")
            utime.sleep(30) # تأخیر قبل از تلاش مجدد در صورت عدم اتصال

    نکته: پس از بیدار شدن از Deep Sleep، برنامه از ابتدا اجرا می‌شود. برای حفظ اطلاعات یا وضعیت، باید از حافظه RTC (Real-Time Clock) یا سایر روش‌های ذخیره‌سازی غیرفرار استفاده کنید.

  2. خاموش کردن Wi-Fi زمانی که استفاده نمی‌شود: اگر برد شما نیاز به ارتباط Wi-Fi مداوم ندارد، پس از اتمام عملیات (مثلاً ارسال داده)، رابط Wi-Fi را غیرفعال کنید.
    wlan = network.WLAN(network.STA_IF)
            wlan.active(True)
            # ... اتصال و ارسال داده ...
            wlan.disconnect()
            wlan.active(False) # غیرفعال کردن Wi-Fi برای صرفه‌جویی در انرژی

امنیت اتصال Wi-Fi

امنیت در IoT از اهمیت بالایی برخوردار است. محافظت از داده‌ها و دستگاه شما در برابر دسترسی غیرمجاز ضروری است.

  1. استفاده از HTTPS: برای ارتباط با سرورها، همیشه از HTTPS به جای HTTP استفاده کنید، به خصوص اگر داده‌های حساس ارسال می‌کنید. ماژول urequests از HTTPS پشتیبانی می‌کند، اما ممکن است نیاز به فریم‌ور با پشتیبانی TLS/SSL فعال داشته باشید.
    # تغییر URL به HTTPS
            THINGSPEAK_URL_HTTPS = "https://api.thingspeak.com/update"
            response = urequests.get(THINGSPEAK_URL_HTTPS + "?..." )
  2. پنهان کردن کلیدهای API و اعتبارنامه‌ها: هرگز کلیدهای API، رمزهای عبور Wi-Fi یا سایر اعتبارنامه‌های حساس را مستقیماً در کد به صورت Hardcode شده قرار ندهید. به جای آن:
    • آنها را در یک فایل پیکربندی جداگانه (مثلاً config.py) ذخیره کنید که از سیستم کنترل نسخه مستثنی شده است.
    • از Environment Variables (برای توسعه‌دهنده) یا مکانیزم‌های امن‌تر ذخیره‌سازی در برد (مانند ماژول eeprom اگر در دسترس باشد) استفاده کنید.
  3. به‌روزرسانی فریم‌ور و کتابخانه‌ها: همیشه از آخرین نسخه‌های فریم‌ور MicroPython و کتابخانه‌های مورد استفاده استفاده کنید، زیرا این نسخه‌ها اغلب شامل پچ‌های امنیتی و رفع آسیب‌پذیری‌ها هستند.

به‌روزرسانی Over-the-Air (OTA) فریم‌ور و کد

قابلیت به‌روزرسانی نرم‌افزار دستگاه‌ها از راه دور (بدون نیاز به اتصال فیزیکی) برای پروژه‌های IoT که در مکان‌های دورافتاده نصب شده‌اند، بسیار مهم است. MicroPython از OTA به روش‌های مختلفی پشتیبانی می‌کند:

  1. به‌روزرسانی کد برنامه: می‌توانید کدهای MicroPython خود را به صورت OTA به‌روزرسانی کنید. این کار معمولاً با نوشتن یک اسکریپت در دستگاه انجام می‌شود که فایل‌های جدید را از یک سرور HTTP یا FTP دانلود کرده و آنها را جایگزین فایل‌های موجود می‌کند.
    import urequests
            import os
            import machine
            
            def update_firmware_ota(url):
                try:
                    print("در حال دانلود فایل جدید...")
                    response = urequests.get(url)
                    if response.status_code == 200:
                        with open("new_main.py", "w") as f:
                            f.write(response.text)
                        response.close()
                        print("فایل جدید با موفقیت دانلود شد. ریستارت برای اعمال تغییرات.")
                        os.rename("new_main.py", "main.py") # جایگزینی فایل قدیمی با جدید
                        machine.reset()
                    else:
                        print(f"خطا در دانلود: {response.status_code}")
                except Exception as e:
                    print(f"خطا در به‌روزرسانی OTA: {e}")
  2. به‌روزرسانی فریم‌ور MicroPython (OTA Firmware Update): این یک فرآیند پیچیده‌تر است و نیاز به پشتیبانی خاص در فریم‌ور و بوت‌لودر دارد. ESP32 دارای قابلیت‌های OTA داخلی است که MicroPython می‌تواند از آن بهره ببرد. برای پیاده‌سازی کامل OTA فریم‌ور، ممکن است نیاز به استفاده از ابزارهای خاص یا کتابخانه‌هایی مانند esp-idf (که MicroPython بر پایه آن ساخته شده) داشته باشید. برخی اکستنشن‌های VSCode یا پلتفرم‌های IoT ممکن است ابزارهای ساده‌تری برای این کار فراهم کنند.

استفاده از کتابخانه‌های MicroPython برای پروتکل‌های پیشرفته‌تر

MicroPython دارای مجموعه‌ای غنی از کتابخانه‌های از پیش ساخته شده یا قابل دانلود است که پیاده‌سازی پروتکل‌های ارتباطی پیشرفته را ساده می‌کند:

  • MQTT: برای ارتباطات Real-time و کارآمد در IoT، ماژول umqtt.simple یا umqtt.robust گزینه‌های عالی هستند.
    from umqtt.simple import MQTTClient
    
            # ... (اتصال Wi-Fi) ...
    
            client = MQTTClient(client_id="esp32_sensor", server="mqtt_broker_address", port=1883)
            client.connect()
            client.publish(b"topic/sensor_data", b"Hello from ESP32")
            client.disconnect()
  • WebSocket: برای ارتباطات دوطرفه و مداوم بین دستگاه و سرور.
  • UDP/TCP Sockets: برای ارتباطات سطح پایین‌تر و کنترل دقیق‌تر جریان داده، می‌توانید مستقیماً از ماژول usocket استفاده کنید.

این نکات و تکنیک‌های پیشرفته به شما کمک می‌کنند تا پروژه‌های MicroPython IoT خود را نه تنها کاربردی، بلکه پایدار، امن و بهینه بسازید. درک و پیاده‌سازی آن‌ها به شما امکان می‌دهد تا پتانسیل کامل سخت‌افزار ESP و انعطاف‌پذیری MicroPython را به کار بگیرید.

نتیجه‌گیری: گامی محکم در مسیر IoT با MicroPython و VSCode

در طول این راهنمای جامع، ما سفر خود را از مراحل اولیه آماده‌سازی سخت‌افزار تا پیاده‌سازی یک پروژه کاربردی IoT با MicroPython و VSCode به اتمام رساندیم. شما اکنون مسلح به دانش و ابزارهایی هستید که به شما امکان می‌دهد بردهای ESP خود را به دنیای اینترنت متصل کرده، داده‌ها را جمع‌آوری و ارسال نمایید و پروژه‌های خلاقانه خود را زندگی ببخشید.

ما آموختیم که چگونه فریم‌ور MicroPython را روی بردهای ESP32 و ESP8266 فلش کنیم، محیط توسعه VSCode را با اکستنشن‌های قدرتمند Pymakr پیکربندی نماییم و سپس به هسته اصلی پروژه، یعنی کدنویسی برای اتصال به Wi-Fi با استفاده از ماژول network در MicroPython، پرداختیم. فراتر از اتصال ساده، به مدیریت اتصال پایدار، استراتژی‌های اتصال مجدد و رفع اشکالات رایج پرداخته شد که برای قابلیت اطمینان هر دستگاه IoT ضروری است.

در نهایت، با پیاده‌سازی یک پروژه نمونه ارسال داده به ThingSpeak، نشان دادیم که چگونه می‌توان از اتصال Wi-Fi برای کاربردهای عملی بهره برد. همچنین، نکات پیشرفته‌ای در مورد بهینه‌سازی مصرف انرژی با Deep Sleep، افزایش امنیت با HTTPS و پنهان‌سازی اعتبارنامه‌ها، و قابلیت به‌روزرسانی Over-the-Air (OTA) را مورد بررسی قرار دادیم. این موارد نه تنها کارایی پروژه‌های شما را افزایش می‌دهند، بلکه آن‌ها را برای استقرار در محیط‌های واقعی آماده می‌سازند.

MicroPython به دلیل سادگی سینتکس پایتون و کارایی بالای خود بر روی سخت‌افزارهای محدود، به یک ابزار بی‌نظیر برای توسعه سریع نمونه‌های اولیه و حتی محصولات نهایی IoT تبدیل شده است. ترکیب آن با قدرت بردهای ESP و امکانات گسترده VSCode، یک اکوسیستم توسعه قوی و انعطاف‌پذیر را فراهم می‌آورد.

این پایان راه نیست، بلکه آغاز مسیر شما در دنیای وسیع و هیجان‌انگیز اینترنت اشیاء است. با این دانش پایه، شما اکنون قادر خواهید بود سنسورهای مختلف را یکپارچه کرده، داده‌ها را به پلتفرم‌های ابری مختلف ارسال کنید، دستگاه‌های خود را از راه دور کنترل نمایید و ایده‌های نوآورانه خود را به واقعیت تبدیل کنید. ادامه یادگیری، آزمایش با سنسورها و پروتکل‌های جدید، و مشارکت در جامعه MicroPython، کلید موفقیت شما در این حوزه خواهد بود.

آینده MicroPython در IoT روشن است. با پیشرفت روزافزون سخت‌افزارها و توسعه جامعه متن‌باز، MicroPython به عنوان یک انتخاب اصلی برای توسعه‌دهندگان IoT باقی خواهد ماند. اکنون شما آماده‌اید تا گام‌های محکم‌تری در این مسیر بردارید و نقش خود را در شکل‌دهی به دنیای متصل آینده ایفا کنید.

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

"با شرکت در این دوره جامع و کاربردی، به راحتی مهارت‌های برنامه‌نویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر می‌سازد تا به سرعت الگوریتم‌های پیچیده را درک کرده و اپلیکیشن‌های هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفه‌ای و امکان دانلود و تماشای آنلاین."

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان