Управлять реле 5V с ESP-01

Я пытаюсь управлять реле 5 В с 3,3 В ESP-01 со схемой ниже. Я запрограммировал ESP на запуск портала, через который я могу получить ретранслятор, запустив GPIO-0 и GPIO-2. Однако, когда я включаю питание цепи, я сталкиваюсь со следующими сценариями:

  1. ЕСЛИ провод подключен к GPIO-2
  • ESP синий светодиод горит вечно
  • Реле начало жужжать звуком целую вечность
  • Никакая сеть WI FI не появляется таким образом не работает
  1. ЕСЛИ провод подключен к GPIO-0
  • Никакая сеть WI FI не появляется таким образом не работает
  1. ЕСЛИ я подключу провод только после включения питания, то он будет работать просто отлично, как и предполагалось.

Не могли бы вы объяснить, что происходит и как это исправить

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>

const byte DNS_PORT = 53;
IPAddress apIP(172, 217, 28, 1);
DNSServer dnsServer;
ESP8266WebServer webServer(80);

//int ledPin = 2; 
#define ledPin0 0
#define ledPin2 2

int ledStatus0;
int ledStatus2;

void setup() {
//  Serial.begin(9600);         // Start the Serial communication to send messages to the computer
//  delay(10);
//  Serial.println('\n');

  pinMode(ledPin0, OUTPUT);  ledStatus0 = digitalRead(ledPin0);  digitalWrite(ledPin0, HIGH); ledStatus0 = 1;
  pinMode(ledPin2, OUTPUT);  ledStatus2 = digitalRead(ledPin2);  digitalWrite(ledPin2, HIGH); ledStatus2 = 1;

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP("Toggle Portal");

  // if DNSServer is started with "*" for domain name, it will reply with
  // provided IP to all DNS request
  dnsServer.start(DNS_PORT, "*", apIP);

  // replay to all requests with same HTML
  webServer.onNotFound([]() {
 
    if (webServer.hasArg("led0")) {
      String status = webServer.arg("led0");
      if (status == "off") { digitalWrite(ledPin0, LOW); ledStatus0 = 1;  switchRelayOff(); }
      else if (status == "on") { digitalWrite(ledPin0, HIGH); ledStatus0 = 0; switchRelayOn(); }
    }
    if (webServer.hasArg("led2")) {
      String status = webServer.arg("led2");
      if (status == "off") { digitalWrite(ledPin2, LOW); ledStatus2 = 1;  switchRelayOff(); }
      else if (status == "on") { digitalWrite(ledPin2, HIGH); ledStatus2 = 0; switchRelayOn(); }
    }
  
    String content = "<!DOCTYPE HTML>";
    content += "<html>";
    content += "<head>";
    content += "  <title>ESP Web Server</title>";
    content += "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
    content += "  <link rel=\"icon\" href=\"data:,\">";
    content += "  <style>";
    content += "    html {font-family: Arial; display: inline-block; text-align: center;}";
    content += "    h2 {font-size: 3.0rem;}";
    content += "    p {font-size: 3.0rem;}";
    content += "    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}";
    content += "    .switch {position: relative; display: inline-block; width: 120px; height: 68px} ";
    content += "    .switch input {display: none}";
    content += "    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 6px}";
    content += "    .slider:before {position: absolute; content: \"\"; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 3px}";
    content += "    input:checked+.slider {background-color: #1f9f1b}";
    content += "    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}";
    content += "  </style>";
    content += "</head>";
    content += "<body>";
    content += "  <h2>ESP Web Server</h2>";
    
    content += "  <h4>Output - GPIO 0</h4>";
    if ( ledStatus0 == 0 ) {      content += "  <label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"0\" ><span class=\"slider\"></span></label>";
    } else {      content += "  <label class=\"switch\"><input type=\"checkbox\" checked onchange=\"toggleCheckbox(this)\" id=\"0\" ><span class=\"slider\"></span></label>";    }

    content += "  <h4>Output - GPIO 2</h4>";
    if ( ledStatus2 == 0 ) {      content += "  <label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox2(this)\" id=\"2\" ><span class=\"slider\"></span></label>";
    } else {      content += "  <label class=\"switch\"><input type=\"checkbox\" checked onchange=\"toggleCheckbox2(this)\" id=\"2\" ><span class=\"slider\"></span></label>";    }
    
    content += "<script>function toggleCheckbox(element) {";
    content += "  var xhr = new XMLHttpRequest();";
    content += "  if(element.checked){ xhr.open(\"GET\", \"?led0=on\", true); }";
    content += "  else { xhr.open(\"GET\", \"?led0=off\", true); }";
    content += "  xhr.send();";
    content += "}";
    
    content += "function toggleCheckbox2(element) {";
    content += "  var xhr = new XMLHttpRequest();";
    content += "  if(element.checked){ xhr.open(\"GET\", \"?led2=on\", true); }";
    content += "  else { xhr.open(\"GET\", \"?led2=off\", true); }";
    content += "  xhr.send();";
    content += "}";
    
    content += "</script>";
    content += "</body>";
    content += "</html>";
    webServer.send(200, "text/html", content);
  });
  webServer.begin();
}

void loop() {
  dnsServer.processNextRequest();
  webServer.handleClient();
}

, 👍1

Обсуждение

GPIO 0 и 2 имеют специальное назначение (https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/), я считаю, что можно использовать хотя бы один из них в качестве выходных данных. В релейный модуль уже включен транзистор, поэтому 2N2222 может не потребоваться (у вас есть схема данных для модуля?)..., @Sim Son

@SimSon это вопрос, как их использовать? прикреплять их только после включения питания нецелесообразно., @ASH


1 ответ


Лучший ответ:

1

"Загрузка завершается неудачно, если уровень загрузки НИЗКИЙ" - это относится как к GPIO 0, так и к GPIO 2. 2N2222 тянет GPIO вниз до одного падения диода (0,7 В) выше GND, что на самом деле очень МАЛО. Вместо того чтобы использовать BJT, вам нужно управлять релейным модулем с помощью МОП-транзистора. Его высокое сопротивление затвора будет иметь незначительный эффект по сравнению с внутренним импульсным резистором.

Скорее всего, транзистор на самом релейном модуле является МОП-транзистором. Если это так, и если этот МОП-транзистор работает с 3,3 В, вы можете избавиться от 2N2222 вообще. В общем, использование двух транзисторов для этой задачи не имеет большого смысла, но в вашем случае BJT на GPIO не работает.

Вы можете заметить, что встроенный светодиодный индикатор подключен к GPIO 2, который высок при загрузке. Поэтому, если вы каким - то образом потянете GPIO 0, загрузка завершится неудачей, и GPIO 2 будет вытягиваться ВЫСОКО (ref) - загорается встроенный светодиод.

"вопрос, как их использовать?"- после того, как ESP загрузится в ваш скетч, вы должны быть в порядке, чтобы использовать GPIO, как вы обычно это делаете.

,