Как заставить 5-вольтовое реле работать с NodeMCU
Я подключил 2-канальные 5-вольтовые реле с помощью NodeMCU v1.0, как показано на рисунке ниже.
Реле питается от источника питания, отличного от источника питания 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
.
Но ни одно из реле не включается. Пожалуйста, помогите.
@Ciasto piekarz, 👍6
Обсуждение5 ответов
Лучший ответ:
У меня есть несколько таких модулей. У них есть опциональный встроенный оптоизолятор, но для его использования необходимо снять перемычку.
- Подключите триггер GPIO так, как он у вас есть.
- Подключите контакты реле
Vcc
иGnd
к MCU, а не к разъему питания. - подключите +5 В вилки питания к крайнему левому контакту, где когда-то стояла перемычка:
JDVcc
- подключите заземление вилки питания к MCU или разомкнутому общему проводу
Gnd
в левой группе контактов.
Теперь катушка(и) вашего реле будет питаться от вилки 5 В, но логика и управление реле будут обрабатываться микроконтроллером.
Не могли бы вы уточнить последнее соединение в своем ответе, а также, возможно, поделиться диаграммой fritzing?, @Birla
диаграмма займет у меня некоторое время, я завален на работе, но в этом последнем соединении есть точка соприкосновения: если черный провод OP подключается либо к GND на реле, либо к GND на MCU, все в порядке., @dandavis
Просто для подтверждения, земля от источника питания 5 В может быть подключена либо ко второй земле (рядом с JD-VCC) на реле, либо к контакту заземления на MCU. Правильный?, @Birla
правильно, GND на модуле реле (и MCU) имеют непрерывность, поэтому эти варианты ведут себя одинаково., @dandavis
У реле нет информации о напряжении от NodeMCU. Так как источники питания двух устройств изолированы (друг от друга; сам ноутбук может быть не изолирован, но батарея, безусловно, должна быть), вы можете (и фактически должны) соединить земли релейная плата и NodeMCU вместе. Если ни один из источников питания не изолирован или вы не уверены, что они изолированы, вам следует использовать оптоизолятор, чтобы предотвратить возможные проблемы с питанием.
Я полагаю, что проблема может заключаться в том, что реле имеет напряжение 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
Этот релейный модуль работает по-другому. Он включен, когда сигнал НИЗКИЙ, и выключается, когда сигнал ВЫСОКИЙ (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
Как вы питаете свой ESP-12E? В вашей схеме этого нет. Я успешно использовал контакт VU (выход 5 В) при питании от Micro-USB. Затем вы должны подключить VCC к VU, GND к GND и Signal к вашему GPIO4. Если вы подключаете свой ESP-12E от источника питания 5 В непосредственно к контакту VIN, то я бы запитал реле от того же источника питания 5 В. вы должны подключить + от источника питания к VIN (ESP) и VCC (реле), все заземления связаны вместе, а затем GPIO4 к сигналу.
- NodeMCU продолжает отключаться
- Ультразвуковой датчик (HC-SR04), регистрирующий случайное расстояние
- Разница между этими двумя реле (экран мини-реле D1 и одиночное реле 5 В)
- 4-канальное реле 5 В, 10 А на 2 лампы 15 Вт, последовательно соединенные с источником питания 220 В переменного тока.
- Помощь с интеллектуальным коммутатором на базе NodeMCU
- NodeMCU 1.0 - Порт D3, реле и насос не загружаются
- Может ли Vin из ESP работать со многими датчиками напряжения и реле?
- ESP8266 не подключается к Wi-Fi
Я не уверен, но похоже, что это не замкнутая цепь, 5 вольт. Интересно, можно ли разделить землю от 5-вольтовой розетки, одну для NodeMCU и одну для реле. Тогда у вас будет замкнутая цепь между реле и NodeMCU., @Sigma
все, что вам нужно сделать, это подключить g на реле к g на esp8266 и battary, @ehab
Просто подключите Vcc реле к 3V NodeMCU. У меня это работает., @Vikram Rayavarapu