ESP32 Control AC Web Server

کاربرگرامی
آخرین بروز رسانی: 11 تیر 1403
بدون دیدگاه
3 دقیقه زمان مطالعه
ESP32 Control AC Web Server

ESP32 Relay Module

 

استفاده از رله با ESP32 یک راه عالی برای کنترل لوازم خانگی AC از راه دور است. این آموزش نحوه کنترل ماژول رله با ESP32 را توضیح می دهد. ما به نحوه کار یک ماژول رله، نحوه اتصال رله به ESP32 و ساخت یک وب سرور برای کنترل یک رله از راه دور (یا هر تعداد رله که می خواهید) نگاهی خواهیم انداخت.
کنترل یک ماژول رله با ESP32 (وب سرور)

 

معرفی رله ها

رله کلیدی است که با برق کار می کند و مانند هر کلید دیگری می توان آن را روشن یا خاموش کرد و اجازه داد جریان عبور کند یا خیر. می توان آن را با ولتاژهای پایین کنترل کرد، مانند 3.3 ولت ارائه شده توسط ESP32 GPIO و به ما امکان می دهد ولتاژهای بالا مانند 12 ولت، 24 ولت یا ولتاژ شبکه (230 ولت در اروپا و 120 ولت در ایالات متحده) را کنترل کنیم.

 

ماژول های رله 1، 2، 4، 8، 16 کانال

ماژول های رله مختلف با تعداد کانال های متفاوت وجود دارد. شما می توانید ماژول های رله را با یک، دو، چهار، هشت و حتی شانزده کانال پیدا کنید. تعداد کانال ها تعداد خروجی هایی را که می توانیم کنترل کنیم را تعیین می کند.

 

Relay-1-2-4-8-ch-channel-modules

ماژول های رله ای وجود دارند که آهنربای الکتریکی آنها با ولتاژ 5 ولت و 3.3 ولت تغذیه می شود. هر دو را می توان با ESP32 استفاده کرد – می توانید از پین VIN (که 5 ولت ارائه می دهد) یا پایه 3.3 ولت استفاده کنید.

علاوه بر این، برخی از آنها دارای کوپلر داخلی هستند که یک “لایه” حفاظتی اضافی اضافه می کند و ESP32 را از مدار رله ایزوله می کند.

 

Relay Pinout

بیایید نگاهی به پین ​​اوت یک ماژول رله 2 کانالی بیندازیم. استفاده از ماژول رله با تعداد کانال های متفاوت مشابه است.

Relay-pinout

در سمت چپ، دو مجموعه از سه سوکت برای اتصال ولتاژ بالا وجود دارد و پایه های سمت راست (کم ولتاژ) به GPIO های ESP32 متصل می شوند.

 

Mains Voltage Connections

ماژول رله نشان داده شده در عکس قبلی دارای دو کانکتور است که هر کدام دارای سه سوکت است: معمولی (COM)، معمولی بسته (NC) و معمولی باز (NO).

COM: جریانی را که می خواهید کنترل کنید (ولتاژ اصلی) وصل کنید.
NC (به طور معمول بسته): پیکربندی معمولاً بسته زمانی استفاده می شود که می خواهید رله به طور پیش فرض بسته شود. پین های NC هستند COM متصل هستند، به این معنی که جریان جریان دارد مگر اینکه سیگنالی از ESP32 به ماژول رله ارسال کنید تا مدار باز شود و جریان جریان متوقف شود.
NO (به طور معمول باز): پیکربندی معمولی باز برعکس عمل می کند: هیچ ارتباطی بین پایه های NO و COM وجود ندارد، بنابراین مدار خراب است مگر اینکه سیگنالی از ESP32 برای بستن مدار ارسال کنید.

 

Control Pins

 

Relay-2-ch-channel-module-with-optocoupler-top-view

سمت ولتاژ پایین دارای مجموعه ای از چهار پایه و مجموعه ای از سه پایه است. مجموعه اول شامل VCC و GND برای روشن کردن ماژول و ورودی 1 (IN1) و ورودی 2 (IN2) به ترتیب برای کنترل رله های پایین و بالایی است.

اگر ماژول رله شما فقط یک کانال دارد، فقط یک پین IN خواهید داشت. اگر چهار کانال دارید، چهار پین IN و غیره خواهید داشت.

سیگنالی که به پین ​​های IN ارسال می کنید، فعال بودن یا نبودن رله را مشخص می کند. رله زمانی فعال می شود که ورودی کمتر از 2 ولت باشد. این به این معنی است که شما سناریوهای زیر را خواهید داشت:

  • پیکربندی به طور معمول بسته (NC):
  • سیگنال بالا – جریان در حال جریان است
  • سیگنال LOW – جریان جریان ندارد
  • پیکربندی به طور معمول باز
  • (NO):
  • سیگنال بالا – جریان جریان ندارد
  • سیگنال LOW – جریان در حال جریان است

 

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

 

انتخاب منبع تغذیه

 

Relay-2-ch-channel-module-input-pins-pinout

مجموعه دوم پین ها از پایه های GND، VCC و JD-VCC تشکیل شده است. پین JD-VCC آهنربای الکتریکی رله را تغذیه می کند. توجه داشته باشید که ماژول دارای یک کلاهک جامپر است که پین ​​های VCC و JD-VCC را به هم متصل می کند. رنگی که در اینجا نشان داده شده زرد است، اما رنگ شما ممکن است رنگ دیگری داشته باشد.

با درپوش جامپر، پین های VCC و JD-VCC به هم متصل می شوند. این بدان معناست که آهنربای الکتریکی رله مستقیماً از پایه برق ESP32 تغذیه می شود، بنابراین ماژول رله و مدارهای ESP32 از نظر فیزیکی از یکدیگر جدا نیستند.

بدون درپوش جامپر، باید یک منبع تغذیه مستقل برای تغذیه آهنربای الکتریکی رله از طریق پین JD-VCC تهیه کنید. این پیکربندی به صورت فیزیکی رله ها را از ESP32 با اپتوکوپلر داخلی ماژول جدا می کند، که از آسیب دیدن ESP32 در صورت بروز میخ های الکتریکی جلوگیری می کند.

 

سیم کشی یک ماژول رله به ESP32

ماژول رله را همانطور که در نمودار زیر نشان داده شده است به ESP32 وصل کنید. این نمودار سیم کشی یک ماژول رله 2 کاناله را نشان می دهد، سیم کشی تعداد متفاوتی از کانال ها مشابه است.

 

هشدار: در این مثال، ما با ولتاژ شبکه سر و کار داریم. استفاده نادرست می تواند منجر به صدمات جدی شود. اگر با ولتاژ شبکه آشنا نیستید از کسی بخواهید که به شما کمک کند. هنگام برنامه ریزی ESP یا سیم کشی مدار خود مطمئن شوید که همه چیز از ولتاژ برق جدا شده است.

 

همچنین می‌توانید از منبع برق ۱۲ ولتی برای کنترل وسایل برقی ۱۲ ولتی استفاده کنید.

در این مثال، ما یک لامپ را کنترل می کنیم. ما فقط می خواهیم گاهی اوقات لامپ را روشن کنیم، بنابراین بهتر است از یک پیکربندی معمولی باز استفاده کنیم.

ما پین IN1 را به GPIO 26 وصل می کنیم، می توانید از هر GPIO مناسب دیگری استفاده کنید. راهنمای مرجع ESP32 GPIO را ببینید.

 

کنترل یک ماژول رله با ESP32 – Arduino Sketch

کد کنترل رله با ESP32 به سادگی کنترل یک LED یا هر خروجی دیگری است. در این مثال، از آنجایی که ما از یک پیکربندی معمولی باز استفاده می‌کنیم، باید یک سیگنال LOW برای عبور جریان و یک سیگنال HIGH برای توقف جریان ارسال کنیم.

ESP32-Relay-Module-Tutorial-project-example-off

کد زیر لامپ شما را به مدت 10 ثانیه روشن می کند و 10 ثانیه دیگر آن را خاموش می کند.

				
					const int relay = 26;

void setup() {
  Serial.begin(115200);
  pinMode(relay, OUTPUT);
}

void loop() {
  // Normally Open configuration, send LOW signal to let current flow
  // (if you're usong Normally Closed configuration send HIGH signal)
  digitalWrite(relay, LOW);
  Serial.println("Current Flowing");
  delay(5000); 
  
  // Normally Open configuration, send HIGH signal stop current flow
  // (if you're usong Normally Closed configuration send LOW signal)
  digitalWrite(relay, HIGH);
  Serial.println("Current not Flowing");
  delay(5000);
}
				
			

کد چگونه کار می کند

پایه ای را که پایه رله IN به آن وصل است را تعریف کنید.

				
					const int relay = 26;
				
			

در setup() رله را به عنوان خروجی تعریف کنید.

				
					pinMode(relay, OUTPUT);
				
			

در حلقه ()، یک سیگنال LOW ارسال کنید تا جریان جریان پیدا کند و لامپ روشن شود.

				
					digitalWrite(relay, LOW);
				
			

اگر از یک پیکربندی به طور معمول بسته استفاده می کنید، یک سیگنال HIGH برای روشن شدن لامپ ارسال کنید. سپس، 5 ثانیه صبر کنید.

				
					delay(5000);
				
			

با ارسال یک سیگنال HIGH به پایه رله، جریان جریان را متوقف کنید. اگر از یک پیکربندی به طور معمول بسته استفاده می کنید، یک سیگنال LOW برای متوقف کردن جریان فعلی ارسال کنید.

				
					digitalWrite(relay, HIGH);
				
			

چندین رله را با وب سرور ESP32 کنترل کنید

 

ESP32-web-serve-relays

در این بخش، ما یک نمونه وب سرور ایجاد کرده ایم که به شما امکان می دهد هر تعداد رله را که می خواهید از طریق وب سرور کنترل کنید، خواه به طور معمول باز شوند یا به طور معمول بسته شوند. شما فقط باید چند خط کد را تغییر دهید تا تعداد رله هایی را که می خواهید کنترل کنید و تخصیص پین را مشخص کنید.

برای ساخت این وب سرور، از کتابخانه ESPAsyncWebServer استفاده می کنیم.

پس از نصب کتابخانه های مورد نیاز، کد زیر را در آردوینو IDE خود کپی کنید.

				
					// Import required libraries
#include "WiFi.h"
#include "ESPAsyncWebServer.h"

// Set to true to define Relay as Normally Open (NO)
#define RELAY_NO    true

// Set number of relays
#define NUM_RELAYS  5

// Assign each GPIO to a relay
int relayGPIOs[NUM_RELAYS] = {2, 26, 27, 25, 33};

// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

const char* PARAM_INPUT_1 = "relay";  
const char* PARAM_INPUT_2 = "state";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1"><style>html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .switch {position: relative; display: inline-block; width: 120px; height: 68px} 
    .switch input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 34px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
    input:checked+.slider {background-color: #2196F3}
    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}</style> <script id="dragonizer-performance-js">!function(){function e(){const e=document.getElementById("dragonizer-performance-styles");e&&e.remove();const n=document.getElementById("dragonizer-performance-js");n&&n.remove()}const n=["click","touchstart","scroll","keydown","mousemove","wheel"];function o(){e(),n.forEach((e=>{document.removeEventListener(e,o,{passive:!0})}))}n.forEach((e=>{document.addEventListener(e,o,{passive:!0})})),setTimeout(e,5e3),window.elementorFrontend&&window.elementorFrontend.isEditMode()&&e()}();</script> </head>
<body>
  <h2>ESP Web Server</h2>
  %BUTTONPLACEHOLDER% <script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?relay="+element.id+"&state=1", true); }
  else { xhr.open("GET", "/update?relay="+element.id+"&state=0", true); }
  xhr.send();
}</script> </body>
</html>
)rawliteral";

// Replaces placeholder with button section in your web page
String processor(const String& var){
  //Serial.println(var);
  if(var == "BUTTONPLACEHOLDER"){
    String buttons ="";
    for(int i=1; i<=NUM_RELAYS; i++){
      String relayStateValue = relayState(i);
      buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i-1] + "</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"" + String(i) + "\" "+ relayStateValue +"><span class=\"slider\"></span></label>";
    }
    return buttons;
  }
  return String();
}

String relayState(int numRelay){
  if(RELAY_NO){
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "";
    }
    else {
      return "checked";
    }
  }
  else {
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "checked";
    }
    else {
      return "";
    }
  }
  return "";
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  // Set all relays to off when the program starts - if set to Normally Open (NO), the relay is off when you set the relay to HIGH
  for(int i=1; i<=NUM_RELAYS; i++){
    pinMode(relayGPIOs[i-1], OUTPUT);
    if(RELAY_NO){
      digitalWrite(relayGPIOs[i-1], HIGH);
    }
    else{
      digitalWrite(relayGPIOs[i-1], LOW);
    }
  }
  
  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Send a GET request to <ESP_IP>/update?relay=<inputMessage>&state=<inputMessage2>
  server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    String inputParam;
    String inputMessage2;
    String inputParam2;
    // GET input1 value on <ESP_IP>/update?relay=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1) & request->hasParam(PARAM_INPUT_2)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      inputParam = PARAM_INPUT_1;
      inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
      inputParam2 = PARAM_INPUT_2;
      if(RELAY_NO){
        Serial.print("NO ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], !inputMessage2.toInt());
      }
      else{
        Serial.print("NC ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], inputMessage2.toInt());
      }
    }
    else {
      inputMessage = "No message sent";
      inputParam = "none";
    }
    Serial.println(inputMessage + inputMessage2);
    request->send(200, "text/plain", "OK");
  });
  // Start server
  server.begin();
}
  
void loop() {

}
				
			

برای دیدن باقی آموزش‌های ماژول ESP32 میتوانید رو لینک بزنید.

 

امیدوارم این آموزش برای شما مفید بوده باشد.

بدون دیدگاه
اشتراک گذاری
اشتراک‌گذاری
با استفاده از روش‌های زیر می‌توانید این صفحه را با دوستان خود به اشتراک بگذارید.