مفتاح ضوء واي فاي ذكي



يوم جيد عزيزي القارئ.

القليل من الكلمات في البداية. إن فكرة مفتاح الضوء "الذكي" ليست جديدة على الإطلاق ، وربما هذا هو أول ما يتبادر إلى الذهن لأولئك الذين بدأوا بالتعرف على منصة Arduino وعناصر إنترنت الأشياء. وأنا لست استثناء لهذا. بعد أن جربت عناصر الدوائر والمحركات ومصابيح LED ، أريد أن أفعل شيئًا أكثر تطبيقًا ، وهو مطلوب في الحياة اليومية ، والأهم من ذلك ، سيكون مناسبًا للاستخدام ، ولن يظل ضحية للتجربة من أجل الراحة.

في هذه المقالة ، سأخبرك كيف قمت بعمل مفتاح يعمل مثل المفتاح العادي (أي ، والذي يتم تثبيته عادة على الحائط) وفي نفس الوقت يسمح بالتحكم فيه عبر WiFi (أو عبر الإنترنت ، كما هو الحال في هذه الحالة).

لذا ، سنضع قائمة بما هو مطلوب لتنفيذ الخطة. يجب أن أقول على الفور أنني كنت أعتزم عدم التفاخر بشدة على المكونات واخترت المكونات بناءً على التعليقات على المنتديات والقيمة مقابل المال. لذلك ، قد تبدو بعض المكونات غير مناسبة هنا للهواة الكهربائيين ذوي الخبرة ، ولكن يرجى عدم الحكم بدقة ، لأنه أنا جديد فقط في علم الميكانيكا الكهربائية وسأكون ممتنًا جدًا للتعليقات الواردة من المتخصصين الأكثر خبرة.
لا.الاسمالوصفالسعر
1HLK-PM01220VAC إلى محول 5VDC4،02 يورو
2SSR-40DAتتابع الحالة الصلبة للتحكم الحالي في الدائرة3،35 €
3AMS1117-3.35 فولت إلى 3 فولت كابت الجهد1،29 €
4ESP8266-01متحكم مع واي فاي2،35 €
المجموع:11،01 €

أحتاج أيضًا: خادمًا يتم التحكم في المحول من خلاله عبر الإنترنت ، Arduino Uno ، حيث قمت ببرمجة ESP ، وجهاز توجيه ومستهلكات مثل الأسلاك ، والمحطات ، وما إلى ذلك ، كل هذا يمكن أن يختلف من الذوق ولن يؤثر على إلى النتيجة النهائية.

يتم أخذ الأسعار من Ebay ، حيث اشتريتها.

وإليك كيف تبدو العناصر من الجدول:



الآن يمكنك رسم مخطط اتصال:



كما لاحظت على الأرجح ، فإن المخطط بسيط للغاية. يتم تجميع كل شيء بسهولة وسرعة وبدون لحام. نوع من النموذج الأولي العامل ، الذي لا يحتاج إلى إزعاج لفترة طويلة. كل شيء متصل بأسلاك ومحطات. السلبية الوحيدة هي أن التتابع لم يتناسب مع مقبس المفتاح. نعم ، في البداية خططت لدفعها بالكامل إلى الحائط خلف المفتاح حتى تبدو جميلة من الناحية الجمالية. ولكن للأسف ، لم يكن هناك مساحة كافية في المقبس ولم يكن التتابع ببساطة مناسبًا لأي من الجانبين أو الجانب:



لذلك ، أخرجت التتابع مؤقتًا من المقبس حتى وجدت صندوق تبديل مناسبًا به مقبس لإخفاء الحديد بداخله. ولكن لا يوجد شيء أكثر من المؤقت ، أليس كذلك؟ لذلك ، يبدو كل هذا الآن مثل هذا:



الشريط العازل سيوفر من الصدمة الكهربائية ... آمل.

الآن دعونا نتحدث عن جزء البرنامج.

وقبل المضي في تحليل الكود والتفاصيل ، سأقدم رسمًا تخطيطيًا عامًا لتنفيذ التحكم في المصباح.



آمل أن أعيد كتابة كل شيء يومًا ما وسيرتكز الاتصال على بروتوكول أسرع من بروتوكول HTTP ، ولكن كبداية سوف يتم ذلك. عن بعد ، يغير المصباح حالته في حوالي 1-1.5 ثانية ، ومن المفتاح على الفور ، كما يليق بمفتاح لائق.

برمجة ESP8266-01


أسهل طريقة للقيام بذلك هي مع Arduino. يمكنك تنزيل المكتبات الضرورية لـ Arduino IDE من GitHub . هناك كل تعليمات التثبيت والتكوين.

بعد ذلك ، نحتاج إلى توصيل ESP بالكمبيوتر ، لذلك نحتاج إما إلى USB إلى محول تسلسلي (مثل FTDi أو CH340 أو FT232RL ) أو أي منصة Arduino (كان لدي Arduino Uno) مع مخرجات RX و TX.

من الجدير بالذكر أن ESP8266-01 يعمل بقوة 3.3 فولت ، مما يعني أنه لا تقم بتوصيله بأي حال من الأحوال بـ Arduino ، والذي (غالبًا) يعمل بالطاقة بجهد 5 فولت ، وإلا فسيذهب كل شيء إلى الجحيم. يمكنك استخدام مخفض الجهد ، كما هو موضح في الجدول أعلاه.

مخطط الاتصال بسيط: نربط TX ،RX و GND ESP إلى RX و TX و GND محول / Arduino على التوالي. بعد ذلك ، في الواقع ، الاتصال جاهز للاستخدام. يمكن برمجة وحدة التحكم الدقيقة باستخدام Arduino IDE.

بعض الفروق الدقيقة عند استخدام Arduino Uno:
  • لدى Uno ناتج لـ 3.3V ، لكنه لم يكن كافيًا. عند توصيل ESP به ، يبدو أن كل شيء يعمل ، والمؤشرات قيد التشغيل ، ولكن يتم فقد الاتصال بمنفذ COM. لذا استخدمت مصدر طاقة 3.3 فولت مختلف لـ ESP.
  • بالإضافة إلى ذلك ، لم يكن لدى UNO أي مشاكل في الاتصال بـ ESP ، نظرًا لأن UNO كان يعمل بواسطة 5V و ESP من 3V.

بعد عدة تجارب مع ESP8266-01 ، اتضح أن ESPs حساسة للجهد المتصل بـ GPIO0 و GPIO2. في وقت الإطلاق ، يجب ألا يتم تأريضها بأي حال من الأحوال إذا كنت تنوي تشغيلها في الوضع العادي. مزيد من التفاصيل حول بداية وحدة التحكم الدقيقة هنا . لم أكن أعرف هذا واضطررت إلى تغيير الدائرة قليلاً ، لأنه في إصدار ESP-01 ، لا يوجد سوى هذين الدبابيس ويتم استخدام كليهما في دائرتي.

وإليك برنامج ESP نفسه:

أظهر الكود
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPClient.h>
extern "C" { //         initVariant
  #include "user_interface.h"
}

const char* ssid = "WIFISSID"; //  WiFi
const char* password = "***************"; //  WiFi
const String self_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //     
const String serv_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //     
const String name = "IOT_lamp"; //  ,  
const String serverIP = "192.168.1.111"; //  IP WEB  
bool lamp_on =  false;
bool can_toggle = false;
int button_state;

ESP8266WebServer server(80); //  
HTTPClient http; //  

const int lamp = 2; //    GPIO2
const int button = 0; // ""   GPIO0

//    
void handleRoot() { 
  server.send(200, "text/plain", "Hello! I am " + name);
}

//    
void handleNotFound(){
  String message = "not found";
  server.send(404, "text/plain", message);
}

//   
void turnOnLamp(){
  digitalWrite(lamp, LOW);
  lamp_on = true;
}

//   
void turnOffLamp(){
  digitalWrite(lamp, HIGH);
  lamp_on = false;
}

//     ./.
void sendServer(bool state){
  http.begin("http://"+serverIP+"/iapi/setstate");
  String post = "token="+self_token+"&state="+(state?"on":"off"); //         
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpCode = http.POST(post);
  http.end();  
}

//   
void toggleLamp(){
  if(lamp_on == true) {
    turnOffLamp();
    sendServer(false);
  } else {
    turnOnLamp();
    sendServer(true);
  }
}

//     
void handleOn(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOnLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}

//     
void handleOff(){
  String token = server.arg("token");
  if(serv_token != token) {
    String message = "access denied";
    server.send(401, "text/plain", message);
    return;
  }
  turnOffLamp();
  String message = "success";
  server.send(200, "text/plain", message);
}

//  MAC    IP
void initVariant() {
  uint8_t mac[6] = {0x00, 0xA3, 0xA0, 0x1C, 0x8C, 0x45};
  wifi_set_macaddr(STATION_IF, &mac[0]);
}

void setup(void){
  pinMode(lamp, OUTPUT);
  pinMode(button, INPUT_PULLUP); //   INPUT_PULLUP
  turnOffLamp();
  WiFi.hostname(name);
  WiFi.begin(ssid, password);

  //     WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  //    
  server.on("/", handleRoot);
  server.on("/on",  HTTP_POST, handleOn);
  server.on("/off", HTTP_POST, handleOff);
  server.onNotFound(handleNotFound);

  //  
  server.begin();
}

void loop(void){
  server.handleClient();

  //   
  button_state = digitalRead(button);
  if (button_state == HIGH && can_toggle) {
    toggleLamp();
    can_toggle = false;
    delay(500);
  } else if(button_state == LOW){
    can_toggle = true;
  }
}


زوجان من التعليقات على الرمز:
  • من المهم جدًا تعريف دبوس GPIO0 على أنه pinMode (زر INPUT_PULLUP ) ، لأن في الدائرة ، لا نستخدم المقاوم لهذا الزر. ولدى ESP "مخيط" خاص بها لهذه الأغراض بالذات.
  • .

WEB


هنا يمكنك منح تنفيس عن خيالك واستخدام أي وسيلة متاحة لإنشاء خدمة ستعالج الطلبات المرسلة بواسطة التبديل وإرسال طلبات التشغيل / الإيقاف.

لقد استخدمت Yii لهذا الغرض . لقد اخترت هذا الإطار لعدة أسباب ، وكنت بحاجة إلى إذن (نظرًا لأن البوابة متاحة على الإنترنت) وإدارة الأدوار (للتجارب المستقبلية) ، وأحبها تمامًا. والآن تبدو بوابة الإدارة الخاصة بي كما يلي:



للتحكم في المصباح الكهربائي في منطقة الوصول إلى الشبكة ، سيكون الخادم نفسه على ESP كافيًا. ولكنك تريد حقًا الحصول على سجلات ومنطق وأجهزة أخرى في المستقبل ، لذا من الأفضل استخدام خادم منفصل للإدارة.

هذا كل شيء عن البوابة ، أعتقد أنه لا معنى لكتابة المزيد عنها ، ولكن إذا كانت لديك أسئلة ، فسأجيب عليها بكل سرور في التعليقات.

بدلا من الاستنتاج


شكرا لك إذا قرأت المقالة حتى النهاية ، وربما وجدت شيئا مفيدا لنفسك فيه. سأكون سعيدا بالنصيحة والنقد. بشكل عام ، لا يزال يبدو لي أن الاختناق في الدائرة هو محول 5V وسأكون سعيدًا إذا شاركت تجربتك في حل هذه المشاكل. أما بالنسبة إلى ESP8266-01 ، فلم تثر حتى الآن أية شكاوى مني باستثناء الاستخدام الخاص لدبابيس GPIO. لقد كان يعمل بثبات للأسبوع الثاني. النجاح في المشاريع.

Source: https://habr.com/ru/post/ar393497/


All Articles