چراغ وضعیت هوشمند با اتصال به تقویم گوگل
آیا تا به حال برات پیش اومده که وسط یک جلسه آنلاین یا یک کار با تمرکز بالا باشی و یک نفر ناگهان در اتاق رو باز کنه و رشته افکارت رو پاره کنه؟ توی محیطهای کاری مدرن یا حتی موقع دورکاری تو خونه، نشون دادن وضعیت آزاد یا مشغول بودن به بقیه یک چالش بزرگه. امروز در تیم آیسیمدار قراره یک گجت بینظیر برای حل این مشکل بسازیم: "چراغ وضعیت هوشمند"!
این پروژه از دو بخش مجزا تشکیل شده: یک مکعب روی میزت که سنسور ژیروسکوپ داره و با چرخوندنش به سمت بالا وضعیتت رو مشخص میکنی، و یک چراغ که بیرون در اتاقت نصب میشه. این دو تا گجت از طریق پروتکل بیسیم ESP-NOW (بدون نیاز به مودم وایفای) با هم در ارتباطن. یعنی وقتی مکعب رو روی حالت "مشغول" میذاری، چراغ بیرون در بلافاصله قرمز میشه.
اما جذابترین بخش ماجرا اینجاست که این گجت به تقویم گوگل (Google Calendar) متصل میشه! یعنی اگر یادت بره وضعیتت رو تغییر بدی، به محض این که زمان جلسهات برسه، چراغها به صورت خودکار تغییر رنگ میدن. با استفاده از بردهای خانواده ESP32، الایدیهای آدرسپذیر و پرینت سهبعدی، قراره یک محصول کاملا حرفهای و کاربردی بسازیم. آمادهای که محیط کارت رو هوشمندتر کنی؟
قطعات موردنیاز
- برد توسعه XIAO ESP32-C6 (یک عدد)
- برد توسعه ESP32-C3 Dev kit (یک عدد)
- باتری لیتیوم یون 3.7 ولت (دو عدد)
- ماژول شارژر باتری لیتیومی TP4056
- ماژول سنسور شتابسنج و ژیروسکوپ MPU6050
- نوار الایدی آدرسپذیر WS2812 (یک تکه)
- ماژول حلقهای 8 تایی الایدی WS2812
- سیمهای جامپر (برای اتصالات)
- تفنگ چسب حرارتی
- هویه و لوازم لحیمکاری
- قابهای پرینت سهبعدی شده (فایلها در ادامه موجود است)
اتصالات سختافزاری
گجت روی میز (Desk Node)
قطعات این بخش رو به این شکل متصل کن: پین GPIO 6 برد به پین SDA سنسور MPU6050 پین GPIO 7 برد به پین SCL سنسور MPU6050 پین GPIO 2 برد به پین دیتا (Data) ماژول الایدی WS2812 پین 3.3 ولت برد به پین VCC سنسور MPU6050 پین GND برد مشترک با گراند همه قطعات
گجت پشت در (Door Node)
برای برد XIAO ESP32-C6 اتصالات به این شکله: پین D0 برد به پین دیتا (Data) نوار الایدی WS2812 پین 5 ولت / VBAT برد برای تامین برق نوار الایدی پین GND مشترک چون برد XIAO روی خودش مدار شارژر باتری داره، فقط کافیه پایانههای BAT+ و BAT- باتری رو به پدهای مربوطه در پشت این برد متصل کنی.
پرینت سهبعدی قابها و محفظهها
برای این پروژه، دو قاب اختصاصی و مجزا طراحی شده.
قاب مکعبی روی میز (Desk Node)
- یک مکعب جمعوجور و شیک
- یک درپوش دیفیوزر (پخشکننده نور) مات در قسمت بالا که با فیلامنت PLA سفید پرینت شده.
- سنسور MPU6050 در داخل قاب کاملا تراز و صاف نصب شده
- حلقه الایدی دقیقا زیر دیفیوزر قرار گرفته
- شیاری برای دسترسی به پورت USB-C برای شارژ
قاب پشت در (Door Node)
- یک قاب باریک و عمودی
- دیفیوزر جلویی مات با فیلامنت PLA سفید.
- استفاده از 4 عدد الایدی WS2812 برای روشنایی بالا و دید بهتر
- قابلیت نصب با چسب دوطرفه قوی یا آهنربا
- دسترسی به پورت USB-C برای شارژ
استفاده از دیفیوزر تو این قابها باعث میشه یک نور ملایم، یکنواخت و بدون خیرگی تولید بشه که از اون سر دفتر کار هم به راحتی دیده میشه.
مونتاژ و سرهم کردن قطعات
بعد از این که تمام قطعات رو طبق نقشه سیمکشی لحیم کردی، باید اونها رو داخل قابهای پرینت سهبعدی شده خودشون مونتاژ کنی. از اونجا که طراحی قابها خیلی جمعوجوره، بهتره قطعات رو با یک ترتیب منطقی جایگذاری کنی تا مدیریت کابلها (Cable Management) راحتتر بشه و ظاهر نهایی کار تمیز دربیاد. سیمها رو مرتب داخل قاب بچین و درپوش دیفیوزر رو روش ببند.
حالا کافیه یک تکه چسب دوطرفه پشت قاب گجت پشت دری بچسبونی و اون رو کنار ورودی دفتر یا اتاقت نصب کنی.
کدنویسی و نحوه عملکرد سیستم
فرمور (Firmware) هر دو دستگاه روی محیط Arduino IDE نوشته شده، در نتیجه تغییر دادن یا ارتقا دادنش برای خودت خیلی راحت خواهد بود. این سیستم شامل دو فایل فرمور مجزاست: یکی برای گجت رومیزی (برد ESP32-C3) و یکی برای گجت پشت در (برد XIAO ESP32-C6).
این دو دستگاه با استفاده از پروتکل ESP-NOW به صورت مستقیم با هم ارتباط برقرار میکنن. این پروتکل یک ارتباط بیسیم پرسرعت و بدون تأخیر (Low-latency) فراهم میکنه که اصلا نیازی به مودم یا روتر وایفای نداره.
کتابخانههای مورد نیاز: این پروژه به چند تا از پرکاربردترین کتابخانههای آردوینو نیاز داره: Adafruit MPU6050 Adafruit NeoPixel ESP-NOW این کتابخونهها یک چارچوب سبک و مطمئن برای همگامسازی بلادرنگ (Real-time) وضعیتها در اختیارت قرار میدن. کدهای گجت روی میز (Desk Node): گجت رومیزی در واقع حکم کنترلر اصلی کل سیستم رو داره. وظایف اصلی این گجت به این شرح است:
- خواندن مداوم دادههای شتابسنج از سنسور MPU6050.
- تشخیص این که در حال حاضر کدام وجه مکعب به سمت بالاست.
- نسبت دادن هر وجه مکعب به یک وضعیت کاری از پیش تعریف شده.
- تغییر رنگ حلقه الایدی خودش متناسب با وضعیت فعلی.
- تشخیص حرکت لرزش (Shake) برای تغییر حالتهای کاری دستگاه.
- ارسال اطلاعات وضعیت جدید به گجت پشت در از طریق پروتکل ESP-NOW.
- همگامسازی خودکار با تقویم گوگل زمانی که حالت تقویم (Calendar Mode) فعال باشه.
نحوه تشخیص جهت مکعب: سنسور MPU6050 به صورت مداوم میزان شتاب رو تو سه محور X، Y و Z اندازه میگیره. به جای این که سیستم به هر حرکت کوچیکی واکنش نشون بده، فرمور صبر میکنه تا مکعب کاملا ثابت و بدون حرکت بشه و بعد وضعیت جدید رو اعلام میکنه. این ترفند نرمافزاری باعث میشه وقتی مکعب رو تو دستت میگیری تا بچرخونی، رنگها الکی و ناخواسته عوض نشن.
هر سمت این مکعب به یکی از وضعیتهای زیر اختصاص داده شده:
- 🟢 سبز — آزاد و در دسترس
- 🔴 قرمز — مشغول کار
- 🟡 زرد — الان برمیگردم
- 🔵 آبی — در حال برگزاری جلسه
اگر مکعب رو از وجه بالا یا پایین روی میز بذاری، تمام الایدیها خاموش میشن و دستگاه به حالت آمادهبهکار (Idle) میره. حالتهای دستی و تقویم: فرمور این دستگاه از دو حالت عملکردی پشتیبانی میکنه. حالت دستی (Manual Mode): در این حالت، وضعیت تو صرفا با چرخوندن مکعب مشخص میشه. هر بار که مکعب رو میچرخونی، گجت رومیزی این کارها رو میکنه:
- وجه جدیدی که بالا قرار گرفته رو تشخیص میده.
- رنگ حلقه الایدی خودش رو عوض میکنه.
- یک سیگنال برای تغییر وضعیت به گجت پشت در ارسال میکنه.
این یعنی به محض چرخوندن مکعب، رنگ چراغها تو هر دو دستگاه تغییر میکنه. حالت تقویم (Calendar Mode): وقتی این حالت فعال باشه، گجت رومیزی به تقویم گوگل تو متصل میشه و برنامه جلساتت رو میخونه.
وقتی زمان یک جلسه برسه، وضعیت دستگاه به صورت خودکار به حالت "در جلسه (آبی)" تغییر میکنه و گجت پشت در هم آپدیت میشه، بدون این که نیاز باشه دستی به مکعب دست بزنی! اینطوری دستگاه در تمام طول روز با برنامه کاریت سینک و هماهنگه. ارتباط بیسیم با ESP-NOW: پروتکل ESP-NOW برای برقراری ارتباط بیسیم مستقیم بین گجت روی میز و گجت پشت در استفاده شده.
برخلاف ارتباطات رایج وایفای، استفاده از این پروتکل نیازی به موارد زیر نداره:
- روتر وایفای
- اتصال به اینترنت
- سرورهای MQTT
- سرورهای ابری
هر زمان که گجت رومیزی یک تغییر وضعیت رو تشخیص بده، یک بسته دیتا (Packet) خیلی کوچک که شامل موارد زیر هست رو ارسال میکنه:
- وضعیت فعلی (رنگ)
- حالت عملکردی فعال (دستی یا تقویم)
گجت پشت در این بسته دیتا رو تو یک چشمبههمزدن دریافت میکنه و چراغهاش رو آپدیت میکنه، در نتیجه دو دستگاه به صورت بلادرنگ همگامسازی میشن. ما ESP-NOW رو انتخاب کردیم چون برای این کاربرد مزایای فوقالعادهای داره:
- ارتباط مستقیم و آنی دو دستگاه به هم (Peer-to-peer).
- مصرف انرژی بسیار پایین.
- بدون نیاز به هیچگونه تجهیزات جانبی و شبکه.
- ارتباط بسیار پایدار در محیطهای بسته و داخل ساختمان.
- برنامهنویسی خیلی ساده و سبک.
- همگامسازی تقریبا لحظهای بین دو دستگاه.
کدهای گجت پشت در (Door Node): این گجت فقط نقش یک گیرنده سبک رو بازی میکنه. وظایف اصلیش ایناست:
- گوش دادن به شبکه برای دریافت بستههای ESP-NOW.
- دیکد کردن وضعیت دریافتی.
- تغییر رنگ 4 عدد الایدی WS2812.
- حفظ همگامسازی با گجت رومیزی.
چون تمام تصمیمگیریهای هوشمند تو گجت رومیزی انجام میشه، کدهای گجت پشت دری خیلی ساده، سریع و بهینهتر از لحاظ مصرف انرژی هستن. جریان کلی عملکرد فرمور (Workflow): کدهای پروژه در نهایت این سناریو رو دنبال میکنن:
- راهاندازی اولیهی قطعات سختافزاری.
- پیکربندی ارتباط ESP-NOW.
- خواندن دیتای سنسور شتابسنج MPU6050.
- تشخیص این که مکعب در چه وضعیتی قرار گرفته.
- بررسی انجام حرکت لرزش (شیک کردن مکعب).
- مشخص کردن این که تو حالت دستی هستیم یا تقویم.
- تغییر رنگ چراغ الایدی مکعب روی میز.
- ارسال سیگنال وضعیت فعلی در محیط.
- دریافت سیگنال توسط گجت پشت در.
- تغییر رنگ چراغ پشت در متناسب با وضعیت جدید کاربر.
این روش مبتنی بر رویداد (Event-driven) باعث میشه برد در مواقع بیکاری پردازش اضافهای انجام نده و دستگاه سریعتر واکنش نشون بده. میتونی به کدهای آردوینو که ضمیمه شده مراجعه کنی و جزئیات رو ببینی.
اتصال دستگاه به تقویم گوگل (Google Calendar)
با این که چرخوندن دستی مکعب یک راه سریع و ملموس برای تغییر وضعیتت حساب میشه، اما خیلی وقتها ممکنه فراموش کنی قبل از شروع جلسه رنگ مکعب رو عوض کنی. برای حل این مشکل، تو این پروژه قابلیتی تعریف کردیم تا دستگاه به تقویم گوگل وصل بشه و برنامه روزانهات رو به طور خودکار نمایش بده.
وقتی حالت تقویم (Calendar Mode) فعال باشه، مکعب رومیزی به وایفای وصل میشه و تو بازههای زمانی مشخص، اکانت تقویم گوگل تو رو برای پیدا کردن رویدادها چک میکنه. اگر دستگاه متوجه بشه که تو یک جلسه فعال داری، بلافاصله وضعیت خودش رو روی حالت "در جلسه" قرار میده و این تغییر رو با همون پروتکل ESP-NOW به گجت پشت در میفرسته.
این اتوماسیون باعث میشه همکارانت همیشه بدونن که دقیقا کی سرت شلوغه، اون هم بدون این که نیاز باشه دست به سیاه و سفید بزنی! برای این کار، از یک اسکریپت در سرویس Google Apps Script استفاده میکنیم که تقویم شخصیت رو میخونه و اطلاعاتش رو به صورت یک متن خیلی ساده خروجی میده.
اسکریپتی که ضمیمه شده رو کپی کن و تو محیط آنلاین Google Script پیست کن. وقتی روی دکمه Deploy کلیک کنی، بهت یک لینک URL اختصاصی میده که باید اون رو تو کدهای آردوینو قرار بدی تا بتونه آپدیتهای تقویمت رو دریافت کنه. نمونه کد آردوینو برای خوندن دیتای تقویم گوگل هم ضمیمه شده است.
جمعبندی و نتیجهگیری
این پروژه به خوبی نشون میده که چطور با طراحی هوشمندانه یک سیستم امبدد (توکار)، میشه ارتباطات تو محیط کاری رو بهتر کرد و وضعیت دسترسی یک فرد رو هم روی میز خودش و هم بیرون اتاقش، در یک نگاه به همه نشون داد.
ترکیب مکعب ژیروسکوپدار، چراغ هوشمند پشت در، ارتباط بیسیم پرسرعت ESP-NOW و در نهایت اتصال به تقویم گوگل، سیستمی رو به وجود آورده که باعث کاهش مزاحمتهای بیمورد میشه. این سیستم بهت اجازه میده که بین حالت کنترل دستی و اتوماتیک به راحتی جابهجا بشی.
چون این گجتها بیسیم هستن و با باتری کار میکنن، نصبشون تو هر دفتری بینهایت آسونه و به هیچ زیرساخت یا سیمکشی اضافهای نیاز ندارن. همچنین ساختار ماژولار کدها باعث میشه در آینده بتونی امکاناتی مثل اتصال به Microsoft Teams، Outlook یا حتی اپلیکیشن موبایل رو هم بهش اضافه کنی.
در نهایت، این پروژه از آیسیمدار، یک راهکار کاربردی، ملموس و قابل ارتقا برای داشتن یک محیط کار بهرهورتر بهت میده؛ جایی که همکارات همیشه یاد میگیرن که قبل از در زدن، به وضعیت چراغ نگاه کنن!
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!