Mini proiect (32) - Controlarea unui releu de 5V cu ESP32 prin intermediul unui convertor de nivel logic bidirectional

Controlarea unui releu de 5V cu ESP32 prin intermediul unui convertor de nivel logic bidirecțional

Azi am la teste un convertor de nivele logice cu două canale împreună cu un releu de 5V. Placa ESP32 are ieșiri de 3.3V, și controlul unui releu care se activează doar pentru voltaje de peste 4.5 - 5V ar fi imposibil dacă nu s-ar folosi un convertor de nivel logic. 

Practic pe parte LV o să avem doar voltaje de 3.3V, iar pe partea de HV o să avem 5V. 

Intrarea TXI (LV1) de care se conectează la pinul GPIO-23 o să fie alimentată la 3.3V atunci când se activează cu HIGH acest pin. 

Ieșirea din convertor TXO (HV1) se conectează la pinul IN de la releu. 

Convertorul o să seteze 5 V atunci când se aplică 3.3V pe TXI, ceea ce va activa releul. 

În principiu dacă te aștepți să se convertească voltajul de 3.3v la 5V fără să alimentezi cu 5V HV-ul nu o să se întâmple nimic, pentru că acest convertor este destul de simplu, și anume este de fapt compus dintr-un tranzistor MOSFET și două rezistențe de pull-up (vezi schema mai jos).


Controlarea unui releu de 5V cu ESP32 prin intermediul unui convertor de nivel logic bidirectional

La ieșirea releului am ales conectare NC, la care o să pot conecta orice dispozitiv electric. Probabil acest dispozitiv o să-l montez în interiorul unui prelungitor. 

Configurație normal închisă (NC): 

  • Semnal HIGH– curentul circulă
  • Semnal LOW – curentul nu circulă  

Configurație normal deschisă (NO): 

  • Semnal HIGH – curentul nu circulă  
  • Semnal LOW – curentul circulă

Apoi am încercat să controlez acest releu prin intermediul unui webserver, direct de pe telefonul mobil (sau din orice browser). Pentru asta am folosit codul din tutorialul de pe pagina randomnerdtutorials.com , în care se explică pas cu pas cum se poate programa un server web folosind un ESP32.

Am importat librăria ESPAsyncWebServer și am inclus heade-ul ESPAsyncWebServer.h.

Apoi am creat funcțiile de inițializare și control pentru webserver, precum se poate observa în codul atașat mai jos.

Toate bune și frumoase ... funcționează brici. 

Componente:


Schema electronica/sistem:

Controlarea unui releu de 5V cu ESP32 prin intermediul unui convertor de nivel logic bidirectional 
 
Mai jos se observa conexiunile la convertorul logic și la releu:

Iar mai jos conexiunile la ESP32:


 

Source code :
/*
Florin Simedru
Complete project details at https://automatic-house.blogspot.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <Arduino.h>
// Import required libraries
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
String relayState(int numRelay);
// Set to true to define Relay as Normally Open (NO)
#define RELAY_NO true
// Set number of relays
#define NUM_RELAYS 1
// Assign each GPIO to a relay
int relayGPIOs[NUM_RELAYS] = {23};
// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "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: #00D765}
input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
</style>
</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=0; i<NUM_RELAYS; i++){
String relayStateValue = relayState(i);
buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i] + "</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])){
return "";
}
else {
return "checked";
}
}
else {
if(digitalRead(relayGPIOs[numRelay])){
return "checked";
}
else {
return "";
}
}
}
void setup() {
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=0; i<NUM_RELAYS; i++){
pinMode(relayGPIOs[i], OUTPUT);
if(RELAY_NO){
digitalWrite(relayGPIOs[i], HIGH);
}
else{
digitalWrite(relayGPIOs[i], 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()], !inputMessage2.toInt());
}
else{
Serial.print("NC ");
digitalWrite(relayGPIOs[inputMessage.toInt()], 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() {
/*Nothing to do*/
}

 

 Documentatie proiect:

Pentru întrebari și/sau consultanță tehnică vă stau la dispozitie pe blog sau pe email simedruflorin@automatic-house.ro. O seară/zi plăcută tuturor !

Etichete

Afișați mai multe

Arhiva

Afișați mai multe