سالها پیش، زمانی که من هنوز به شدت درگیر مسائل روزمره IT شرکت بودم، زمانی که سرورهای خود را در مرکز داده قرار میدهیم، باید مشترک سرویسی به نام «انگشت هوشمند» شویم. اساساً هدف این سرویس این است که به تکنسین مرکز داده اجازه میدهد تا به ما کمک کند تا دکمههای روشن/خاموش یا تنظیم مجدد سرورهایمان را فشار دهیم، بدون اینکه ما تمام راه را به سمت مرکز داده حرکت کنیم تا فقط یک دکمه را فشار دهیم. با این حال، هرازگاهی، مراجعه به تکنسینی که دکمه روی آن و در کجا قرار دارد، میتواند بسیار دردسرساز باشد، مخصوصاً زمانی که چند سرور از مدلهای مختلف در یک رک داریم. دو سال پیش قبل از اینکه کامپیوتر اداری خود را از PC به Mac تغییر دهم، کامپیوتر من هر روز صبح زمان زیادی طول می کشید تا راه اندازی شود. همه این مسائل مرا بر آن داشت تا به این فکر کنم که چقدر خوب است اگر یک ربات کوچک وجود داشته باشد که بتواند به من کمک کند تا هر زمان که می خواهم دکمه ای را از راه دور فشار دهم. سال گذشته، بالاخره یک دستگاه کوچک کوچک به نام Switch Bot در Kickstarter پیدا کردم که می تواند این کار را انجام دهد.
![](https://duino4projects.com/wp-content/uploads/2022/07/Simple-IoT-Remote-Switch-With-MQTT-and-ESP8266.jpg)
این روزها، از آنجایی که استراتژی فناوری اطلاعات شرکت ما تغییر کرده است و مک من در دفتر به خوبی کار می کند، من واقعاً به چنین ربات کوچک کوچکی نیاز ندارم. از طرف دیگر، پس از مدتی بازی با ESP8266 NodeMCU، می خواهم بدانم ساخت یک دستگاه کوچک کوچک برای انجام این کار چقدر پیچیده است. این صرفاً اثبات تمرین مفهومی است و هیچ چیز خیالی نیست.
مرحله 1: اجزاء
- یک ESP8266 NodeMCU
- یک سروو کوچک
- نوار دو طرفه
مرحله 2: برنامه نویسی ESP8266 NodeMCU
در این تمرین، فرض میکنم که میدانید چگونه از ESP8266 Arduino Core استفاده کنید. اگر آشنا نیستید، ممکن است بخواهید Instructable قبلی من را در https://www.instructables.com/id/Quick-Intro-a-Beg بررسی کنید…
من عمدتا از 3 کتابخانه در ESP8266 Arduino Core استفاده خواهم کرد:
- WiFiManager.h: این کتابخانه عالی اتصال ESP8266 را به یک شبکه WIFi بسیار ساده می کند.
- PubSubClient.h: این کتابخانه عملکردهایی را برای اتصال به یک کارگزار MQTT، اشتراک و انتشار در موضوعات ارائه می کند.
- Servo.h: به سادگی سرووی متصل به ESP8266 را کنترل کنید
طرح دارای اجزای کلیدی زیر است:
- راه اندازی WiFi با استفاده از WiFiManger: اساساً سعی می کند در هنگام روشن شدن به یک شبکه WiFi شناخته شده متصل شود. اگر نتواند یکی را پیدا کند، خود را به عنوان یک Access Point تنظیم می کند که به کاربر اجازه می دهد تنظیمات WiFi را از طریق یک رابط وب پیکربندی کند.
- اتصال به یک کارگزار MQTT با استفاده از PubSubClient: مشترک می شود و موضوعات از پیش تعریف شده را در iot.eclipse.org که یک کارگزار MQTT در دسترس عموم است، منتشر می کند. اگر اتصال به کارگزار شکست خورد، سیستم سعی می کند دوباره به کارگزار متصل شود.
- پیام دریافتی کارگزار MQTT را تجزیه کنید تا مشخص کنید چه کاری باید انجام دهد: در این مثال، من به سادگی بار ورودی MQTT را بررسی می کنم تا ببینم اولین کاراکتر "R" است یا "P". اگر "R" باشد، شبکه وای فای را بازنشانی می کند. اگر "P" باشد، یک عمل فشار دکمه را با مدت زمان فشار پیشفرض و زاویه فشار انجام میدهد. می توان مدت زمان مطبوعات را با Dxxx تغییر داد که در آن xxx زمان بر حسب ثانیه است. برای تغییر زاویه فشار، از Exxx استفاده کنید که xxx زاویه بر حسب درجه است. هنگامی که عمل انجام می شود، با یک تصدیق پاسخ می دهد.
مرحله 3: قرار دادن همه چیز با هم
![](https://duino4projects.com/wp-content/uploads/2022/07/Putting-Everything-Together.jpg)
بیایید یک طرح جدید شروع کنیم و کد زیر را وارد کنیم. مطمئن شوید که محیط Arduino IDE شما قبلاً آن 3 کتابخانه بالا را نصب کرده است. در غیر این صورت، باید از مدیر کتابخانه برای نصب آنها استفاده کنید.
از آنجایی که این آزمایش فقط یک اثبات مفهوم است، من کد را به صورت زیر ساده می کنم:
- من از یک کارگزار MQTT در دسترس عموم استفاده می کنم بدون اینکه نگران مسائل امنیتی باشم زیرا این ساده ترین کار است
- من پورت سروو را انتخاب می کنم که اتفاقاً به خوبی روی کابل سروو قرار می گیرد
- پینگ 2 ثانیه ای به کارگزار MQTT برای دریافت بازخورد است تا مطمئن شوید که اتصال همچنان فعال است. در برنامه واقعی، ممکن است نیاز به یافتن یک راه سازگار با پهنای باند بیشتر برای انجام این کار باشد
- فرمت بار پیام که امکان تغییر زاویه و مدت زمان را می دهد برای تنظیم دقیق نصب واقعی سروو در نظر گرفته شده است. هنگامی که نصب سروو برای عملکرد صحیح آزمایش شد، این دو پارامتر مورد نیاز نیستند. البته، اگر فردی نیاز به انجام یک عمل فشاری داشته باشد که بیش از یک ثانیه نگه داشته شود، مانند تنظیم مجدد در رایانه یا دکمه حساسیت متفاوتی داشته باشد، همچنان میتوان از آن پارامترها استفاده کرد.
- پیام «R» که تنظیمات وایفای را بازنشانی میکند، فقط برای آزمایش است
/* * Remote Button Press * * This app is using ESP8266 NodeMCU to control a servo which performs an action to press a button. * * Hardware Requirement: * - ESP8266 NodeMCU * - 90g servo & connecting wires * - power supply * - materials help to fix the servo next to the button * * Software coding is divided into the following parts: * - wifi setup * - connection to MQTT server and subscribe to a topic * - parse incoming message from the MQTT server * - activate the servo to perform a press action * - feedback to MQTT server when done * - Can use <a href="https://eclipse.org/paho/clients/js/utility/" rel="nofollow">https://eclipse.org/paho/clients/js/utility/</a> for testing * */ #include <ESP8266WiFi.h> #include <DNSServer.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> #include <PubSubClient.h> // for MQTT connection #include <Servo.h> // for servo movement const char* mqttServer = "iot.eclipse.org"; const char* inTopic = "esp8266_in"; const char* outTopic = "esp8266_out"; char msg[75]; long lastMsg = 0; int value = 0; int duration, posStart, posEnd; String dString = ""; WiFiClient espClient; PubSubClient client(espClient); Servo myservo; WiFiManager wifiManager; /* * control the servo to mimic a button press action * duration in seconds, posStart & posEnd in degrees */ void buttonPress(unsigned int duration, unsigned int posStart, unsigned int posEnd) { myservo.write(posStart); // make sure at starting position delay(100); // let servo stops properly // start the movement myservo.write(posEnd); // move to ending position delay(duration*1000); // stay there for a given duration myservo.write(posStart); // back to starting position delay(100); // let servo stops properly } /* * handle message arrived from MQTT and do the real actions depending on the command * payload format: start with a single character * P: button press, optionally follows by (in any order) * Dxxx: for xxx seconds duration, * Exxx: ending at xxx angle * R: reset wifi settings */ void mqttCallback(char* topic, byte* payload, unsigned int length) { // debugging message at serial monitor Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // parse the payload message duration = 1; posStart = 0; posEnd = 90; if ((char)payload[0] == 'R') { client.publish(outTopic, "Resetting wifi!"); Serial.println("Resetting wifi!"); // debug message wifiManager.resetSettings(); // reset all wifi settings, should back to AP mode } else if ((char)payload[0] == 'P') { if (length > 1) { for (int i = 1; i < length; i++) { dString = ""; if ((char)payload[i] == 'D') { // modify 'duration', default 1 second for (int j = 1; j < 4; j++) { dString += (char)payload[i+j]; } duration = dString.toInt(); } if ((char)payload[i] == 'E') { // modify 'ending position', default at 90 degress for (int j = 1; j < 4; j++) { dString += (char)payload[i+j]; } posEnd = dString.toInt(); } } } buttonPress(duration, posStart, posEnd); // perform servo press snprintf(msg, 75, "Button pressed for %d second(s) at %d degrees!", duration, posEnd); client.publish(outTopic, msg); Serial.println(msg); // debug message } else { //snprintf(msg, 75, "Unknown command: %s, do nothing!", (char)payload[0]); snprintf(msg, 75, "Unknown command: %c, do nothing!", (char)payload[0]); client.publish(outTopic, msg); Serial.println(msg); // debug message } } /* * connect to MQTT with a client ID, subscribe & publish to corresponding topics * if failed, reconnect in 5 seconds */ void reconnect() { // loop until reconnected while (!client.connected()) { Serial.print("Attempting to make MQTT connection..."); if (client.connect("ESP8266Client1")) { // ESP8266CLient1 is a client ID of this ESP8266 for MQTT Serial.println("connected"); client.publish(outTopic, "Hello world, I'm ESP8266Client1"); client.subscribe(inTopic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { pinMode(LED_BUILTIN, OUTPUT); // just for LED output Serial.begin(115200); // connect to serial mainly for debugging // prepare servo myservo.attach(2); // attach the servo at GIO2 at it is right next to 3.3V and GND pins myservo.write(0); // make sure start from 0 // use WiFiManger to manage wifi setup // if not auto connect, connect to 'myAP' wifi network, access 192.168.4.1 to do a local wifi setup wifiManager.autoConnect("myAP"); Serial.println("wifi connected!"); // prepare for MQTT connection client.setServer(mqttServer, 1883); client.setCallback(mqttCallback); } void loop() { // if not connected to mqtt server, keep trying to reconnect if (!client.connected()) { reconnect(); } client.loop(); // wait for message packet to come & periodically ping the server // to show that ESP8266 is alive, publish a message every 2 seconds to the MQTT broker long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf(msg, 75, "Hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish(outTopic, msg); } }
مرحله 4: اقدام!
برای تست تنظیمات، موارد زیر را انجام دهید:
آماده سازی:
- سروو را به ESP8266 وصل کنید و ESP8266 را روشن کنید.
- از راه دور تنظیمات وای فای ESP8266 را با اتصال رایانه یا تلفن دستی به شبکه وای فای «myAP» پیکربندی کنید. سپس به صفحه وب در 192.168.4.1 دسترسی پیدا کنید تا اتصال وای فای ESP8266 را تنظیم کنید. این مرحله مورد نیاز نیست مگر اینکه شبکه وای فای را با دستور "R" MQTT payload یا در یک محیط wifi جدید بازنشانی کنید.
- هنگامی که EPS8266 به شبکه وای فای متصل شد، در یک مرورگر به https://eclipse.org/paho/clients/js/utility/ بروید.
- به میزبان 'iot.eclipse.org' متصل شوید، در موضوع ' esp8266_out ' مشترک شوید و QoS را روی 0 نگه دارید. پس از چند ثانیه، می توانید پیام پینگ ESP8266 را در پایین صفحه وب مشاهده کنید. اگر نه، تنظیمات وای فای ESP8266 را بررسی کنید و مطمئن شوید که به اینترنت متصل است و هیچ قانون فایروال پورت 1883 را مسدود نمی کند.
- پیامی با یک حرف P در تاپیک esp8266_in منتشر کنید . سروو باید حرکت کند و پیام "دکمه برای 1 ثانیه در 90 درجه فشار داده شد!" نزدیک به پایین صفحه وب
- حرکت بوق سروو را مشاهده کنید و آن را مطابق با فشار دکمه مورد نیاز تنظیم کنید.
آزمایش کردن:
در این آزمایش، من به سادگی سعی می کنم با فشار دادن دکمه پاور، لپ تاپ ویندوز 10 را از حالت خواب بیدار کنم.
- سروو را در کنار دکمه پاور لپ تاپ ویندوز 10 قرار دهید و با استفاده از نوار چسب دو طرفه آن را محکم کنید.
- هنگامی که ESP8266 به کارگزار MQTT همانطور که از پیام پینگ مشاهده می شود وصل شد، پیام P را به موضوع esp8266_in صادر کنید . در صورت لزوم، مدت زمان و زاویه را با استفاده از پارامترهای Dxxx و Exxx در محموله انتشار، به عنوان مثال PD002E120 برای فشار دادن 2 ثانیه در 120 درجه تنظیم کنید. در این مورد خاص، با آزمون و خطا، متوجه شدم که استفاده از 75 درجه برای 1 ثانیه کارساز خواهد بود. بنابراین، من به سادگی یک پیام PE075 را در موضوع esp8266_in منتشر می کنم تا کامپیوتر را از حالت خواب بیدار کنم.
ایده های بهبود: