Как заставить 5-вольтовое реле работать с NodeMCU

Я подключил 2-канальные 5-вольтовые реле с помощью NodeMCU v1.0, как показано на рисунке ниже.

Реле питается от источника питания, отличного от источника питания NodeMCU Реле питается от источника питания, отличного от источника питания NodeMCU.

На данный момент я питаю NodeMCU от своего ноутбука, а релейную плату — от 5-вольтовой батареи.

Ниже приведен код, который я написал:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "said.";
const char* password = "secret";
ESP8266WebServer server ( 80 );
const int led = 13;
const int outputLed = 12;

void turnOnRelayOne(){
  digitalWrite (outputLed, 1);
  digitalWrite (5, HIGH); //GPIO 5 // Реле 1
  server.send (200, "text/html", "Relay 1 turned on.");
  digitalWrite (outputLed, 0);
}

void turnOnRelayTwo(){
  digitalWrite (outputLed, 1);
  digitalWrite (4, HIGH); //GPIO 4 // Реле 2
  server.send (200, "text/html", "Relay 2 turned on.");
  digitalWrite (outputLed, 0);
}

void handleRoot() {
  digitalWrite ( led, 1 );

  char temp[400];
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  snprintf ( temp, 400,

             "<html>\
  <head>\
    <meta http-equiv='refresh' content='5'/>\
    <title>NodeMCU hooked to Relay Board</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
  <h1>Hello from NodeMCU!</h1>\
    <p>Uptime: %02d:%02d:%02d</p>\
  </body>\
</html>",

          hr, min % 60, sec % 60
           );
  server.send ( 200, "text/html", temp );
  digitalWrite ( led, 0 );
}

void handleNotFound() {
  digitalWrite ( led, 1 );
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";

  for ( uint8_t i = 0; i < server.args(); i++ ) {
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
  }

  server.send ( 404, "text/plain", message );
  digitalWrite ( led, 0 );
}

void setup ( void ) {
  pinMode ( led, OUTPUT );
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(outputLed, OUTPUT);
  digitalWrite ( led, 0 );
  Serial.begin ( 9600 );
  WiFi.begin ( ssid, password );
  Serial.println ( "" );

  // Ждем подключения
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  Serial.println ( "" );
  Serial.print ( "Connected to " );
  Serial.println ( ssid );
  Serial.print ( "IP address: " );
  Serial.println ( WiFi.localIP() );

  if ( MDNS.begin ( "esp8266" ) ) {
    Serial.println ( "MDNS responder started" );
  }

  server.on ( "/", handleRoot );

  server.on ( "/inline", []() {
    server.send ( 200, "text/plain", "this works as well" );
  } );

  server.on("/relay1", turnOnRelayOne);
  server.on("/relay2", turnOnRelayTwo);
  server.onNotFound ( handleNotFound );
  server.begin();
  Serial.println ( "HTTP server started" );
}

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

Когда я запускаю URL-адрес: 192.168.1.8/relay1, индикатор outputLed мигает в соответствии с логикой в turnOnRelayOne.

Но ни одно из реле не включается. Пожалуйста, помогите.

, 👍6

Обсуждение

Я не уверен, но похоже, что это не замкнутая цепь, 5 вольт. Интересно, можно ли разделить землю от 5-вольтовой розетки, одну для NodeMCU и одну для реле. Тогда у вас будет замкнутая цепь между реле и NodeMCU., @Sigma

все, что вам нужно сделать, это подключить g на реле к g на esp8266 и battary, @ehab

Просто подключите Vcc реле к 3V NodeMCU. У меня это работает., @Vikram Rayavarapu


5 ответов


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

8

У меня есть несколько таких модулей. У них есть опциональный встроенный оптоизолятор, но для его использования необходимо снять перемычку.

  • Подключите триггер GPIO так, как он у вас есть.
  • Подключите контакты реле Vcc и Gnd к MCU, а не к разъему питания.
  • подключите +5 В вилки питания к крайнему левому контакту, где когда-то стояла перемычка: JDVcc
  • подключите заземление вилки питания к MCU или разомкнутому общему проводу Gnd в левой группе контактов.

Теперь катушка(и) вашего реле будет питаться от вилки 5 В, но логика и управление реле будут обрабатываться микроконтроллером.

,

Не могли бы вы уточнить последнее соединение в своем ответе, а также, возможно, поделиться диаграммой fritzing?, @Birla

диаграмма займет у меня некоторое время, я завален на работе, но в этом последнем соединении есть точка соприкосновения: если черный провод OP подключается либо к GND на реле, либо к GND на MCU, все в порядке., @dandavis

Просто для подтверждения, земля от источника питания 5 В может быть подключена либо ко второй земле (рядом с JD-VCC) на реле, либо к контакту заземления на MCU. Правильный?, @Birla

правильно, GND на модуле реле (и MCU) имеют непрерывность, поэтому эти варианты ведут себя одинаково., @dandavis


3

У реле нет информации о напряжении от NodeMCU. Так как источники питания двух устройств изолированы (друг от друга; сам ноутбук может быть не изолирован, но батарея, безусловно, должна быть), вы можете (и фактически должны) соединить земли релейная плата и NodeMCU вместе. Если ни один из источников питания не изолирован или вы не уверены, что они изолированы, вам следует использовать оптоизолятор, чтобы предотвратить возможные проблемы с питанием.

,

2

Я полагаю, что проблема может заключаться в том, что реле имеет напряжение 5 В, а сигнал, поступающий от NodeMCU, – 3,3 В. Например, вам может понадобиться сделать что-то вроде увеличения сигнала до 5 В или реализовать сдвиг логического уровня.

Вот похожий пост: https: //electronics.stackexchange.com/questions/213051/how-do-i-use-a-5v-relay-with-a-3-3v-arduino-pro-mini

,

Это не так, ИМО. Выход NodeMcu управляет не реле, а транзистором/полевым транзистором/оптопарой. Во всех случаях для включения вполне достаточно 3,3 В. @Ingacio прав, заземление должно быть подключено. Теперь только один провод является соединением между NodeMcu и реле. «Напряжение» определяется как разница между _двумя_ потенциалами, поэтому одного провода недостаточно., @Gee Bee


-1

Этот релейный модуль работает по-другому. Он включен, когда сигнал НИЗКИЙ, и выключается, когда сигнал ВЫСОКИЙ (3v3V на NodeMCU) Таким образом, вам нужно только изменить код в двух функциях, чтобы он был НИЗКИМ, а не ВЫСОКИМ. Также убедитесь, что NodeMCU и модуль реле имеют общую землю.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "said.";
const char* password = "secret";
ESP8266WebServer server ( 80 );
const int led = 13;
const int outputLed = 12;

void turnOnRelayOne(){
  digitalWrite (outputLed, 1);
  digitalWrite (5, LOW); //GPIO 5 // Реле 1
  server.send (200, "text/html", "Relay 1 turned on.");
  digitalWrite (outputLed, 0);
}

void turnOnRelayTwo(){
  digitalWrite (outputLed, 1);
  digitalWrite (4, LOW); //GPIO 4 // Реле 2
  server.send (200, "text/html", "Relay 2 turned on.");
  digitalWrite (outputLed, 0);
}

void handleRoot() {
  digitalWrite ( led, 1 );

  char temp[400];
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  snprintf ( temp, 400,

             "<html>\
  <head>\
    <meta http-equiv='refresh' content='5'/>\
    <title>NodeMCU hooked to Relay Board</title>\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
  <h1>Hello from NodeMCU!</h1>\
    <p>Uptime: %02d:%02d:%02d</p>\
  </body>\
</html>",

          hr, min % 60, sec % 60
           );
  server.send ( 200, "text/html", temp );
  digitalWrite ( led, 0 );
}

void handleNotFound() {
  digitalWrite ( led, 1 );
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";

  for ( uint8_t i = 0; i < server.args(); i++ ) {
    message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
  }

  server.send ( 404, "text/plain", message );
  digitalWrite ( led, 0 );
}

void setup ( void ) {
  pinMode ( led, OUTPUT );
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(outputLed, OUTPUT);
  digitalWrite ( led, 0 );
  Serial.begin ( 9600 );
  WiFi.begin ( ssid, password );
  Serial.println ( "" );

  // Ждем подключения
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  Serial.println ( "" );
  Serial.print ( "Connected to " );
  Serial.println ( ssid );
  Serial.print ( "IP address: " );
  Serial.println ( WiFi.localIP() );

  if ( MDNS.begin ( "esp8266" ) ) {
    Serial.println ( "MDNS responder started" );
  }

  server.on ( "/", handleRoot );

  server.on ( "/inline", []() {
    server.send ( 200, "text/plain", "this works as well" );
  } );

  server.on("/relay1", turnOnRelayOne);
  server.on("/relay2", turnOnRelayTwo);
  server.onNotFound ( handleNotFound );
  server.begin();
  Serial.println ( "HTTP server started" );
}

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

Хм, можете ли вы сделать вывод из этого рисунка о фактическом типе релейного модуля? Многие модули работают с положительной логикой, т.е. установка высокого уровня на входе включает реле., @Gee Bee


0

Как вы питаете свой ESP-12E? В вашей схеме этого нет. Я успешно использовал контакт VU (выход 5 В) при питании от Micro-USB. Затем вы должны подключить VCC к VU, GND к GND и Signal к вашему GPIO4. Если вы подключаете свой ESP-12E от источника питания 5 В непосредственно к контакту VIN, то я бы запитал реле от того же источника питания 5 В. вы должны подключить + от источника питания к VIN (ESP) и VCC (реле), все заземления связаны вместе, а затем GPIO4 к сигналу.

,