
یک کاربر با استفاده از چند برد قدیمی ESP32 که در کشوی وسایلش بلااستفاده مانده بودند، بهجای خرید یک روتر مش جدید، شبکهای اختصاصی برای خانه هوشمند خود ساخت. هدف او رفع مشکل پوشش Wi-Fi برای سنسورهایی بود که در برخی نقاط خانه بهسختی به شبکه متصل میشدند.
مشکل پوشش Wi-Fi از روتر نبود
او از روتر ASUS RT-AX88U استفاده میکند که یک روتر Wi-Fi 6 ضعیف نیست؛ بنابراین مشکل از سختافزار نبود. مسئله اصلی جایگذاری روتر در اتاق خواب و کنار میز کار بود که باعث میشد اتاق نشیمن و اتاق خواب دیگر پوشش لکهدار داشته باشند. برخی لامپهای مبتنی بر Zigbee همچنان خوب متصل میماندند، اما سنسورهای وابسته به Wi-Fi برای آنلاین ماندن تقلا میکردند.
راهاندازی یک شبکه مش Wi-Fi حدود ۱۵۰ دلار هزینه داشت که بیش از بودجه مورد نظر او بود. جابهجایی روتر هم به دلیل نیاز به کابل Ethernet و پریز برق جدید عملی نبود. روتر قدیمی ASUS RT-AC66U هم بهعنوان اکسسپوینت بدون اتصال سیمی به روتر اصلی و بدون backhaul مناسب کارساز نبود. استفاده از رنج اکستندر ارزانترین گزینه بود، اما سرعت کمتر شبکه گستردهشده برای سنسورهایی که پهنای باند کمی نیاز دارند ارزش نداشت.
ESP-NOW بدون Wi-Fi کار میکند
ESP-NOW پروتکلی داخلی در ESP32 است که به بردها اجازه میدهد بدون نیاز به اتصال Wi-Fi مستقیماً با یکدیگر ارتباط برقرار کنند؛ بدون رمز عبور، روتر یا شبکهای برای پیوستن. هر پیام ردوبدلشده بین بردها میتواند حدود ۲۵۰ بایت باشد که برای دادههای سنسور کافی است.
محدودیت این است که ESP-NOW فقط بردهای داخل محدوده رادیویی را پوشش میدهد و بهطور خودکار پیام را در کل خانه رله نمیکند. به همین دلیل کاربر یک پروتکل رله کوچک روی آن نوشت. هر پیامی که خطاب به یک برد نیست، بررسی میشود که آیا همان شناسه (ID) را قبلاً دیده است یا نه. اگر ندیده باشد و شمارنده پرش (hop counter) به سقف خود نرسیده باشد، شمارنده را افزایش میدهد و پیام را برای برد بعدی بازپخش میکند. کل منطق مش همین است: بازپخش یکباره پیام، نادیده گرفتن تکراریها و محدود کردن تعداد پرشها تا پیامها برای همیشه در خانه دور نزنند.
- استفاده از چهار برد مختلف: ESP32 DevKit، NodeMCU-32S، ESP32-S3 و ESP32-C6
- ساخت یک پروژه واحد در PlatformIO IDE در VS Code و تعریف بیلد جداگانه برای هر نوع برد با یک شماره ID
- فلش کردن کد یکسان روی چهار برد بدون تغییر اسکچ اصلی
- تست بردها با Serial Monitor پیش از اتصال سنسورها
- افزودن تأخیر چند میلیثانیهای پیش از هر بازپخش تا بردهایی که پیام را همزمان میشنوند، همزمان پاسخ ندهند
یک برد بهعنوان گیتوی به Home Assistant وصل میشود
تنها یک برد به شبکه خانگی متصل میشود. این برد مانند بقیه به مش گوش میدهد، اما وقتی پیامی میرسد، آن را از طریق MQTT به بروکر (broker) که از قبل در Home Assistant اجرا میشود، میفرستد. MQTT یک پروتکل پیامرسانی سبک است که Home Assistant از قبل آن را میفهمد؛ بنابراین هر پیام با یک ورودی تنظیمات کوتاه به یک موجودیت قابل خواندن تبدیل میشود.
از آنجا که این برد گیتوی از کانال Wi-Fi روتر پیروی میکند، همه بردهای دیگر باید با آن هماهنگ باشند وگرنه یکدیگر را نمیشنوند. کاربر باند ۲.۴ گیگاهرتز روتر را روی کانال ۶ تنظیم کرده و همه بردها را با آن هماهنگ کرده است. سایر بردها کاملاً خارج از Wi-Fi میمانند تا کدشان کوتاه و ساده بماند.
قطع شدن یک برد شبکه مش را از کار نمیاندازد
هر برد بخشی از شبکه مش است و هر کدام پیام را از هر مسیری که در دسترس باشد بازپخش میکند. اگر یک برد آفلاین شود، برد همسایه در محدوده همچنان پیام را جلو میبرد. کاربر برای آزمایش، ESP32-C6 را بیرون کشید و پیام همچنان فوروارد شد.
یکی از چیزهایی که او جای خالیاش را حس میکند، رسید تحویل (delivery receipt) است. گاهی یک پیام گم میشود، چون پخشهای ESP-NOW تحویل را تأیید نمیکنند. اما چون بردها بهطور منظم داده تازه گزارش میدهند، پیام ازدسترفته در گزارش بعدی جبران میشود و سیستم متوقف نمیشود.
او فعلاً خرید دستگاه هوشمند دیگری را به تعویق انداخته است. اگر نقطه کور جدیدی در خانه پیدا کند، یک برد یدکی دیگر را با ID بعدی فلش میکند و در جای مناسب قرار میدهد. بردهایی که در کشو بیاستفاده بودند اکنون کار واقعی انجام میدهند و تنها هزینه این پروژه، زمان صرفشده برای عیبیابی و ساخت آن بوده است.