Tenho uma ESP01 com Módulo Relé que quando ligados, a Esp dá um pulso ligando o relé. Para o meu projeto, isso não pode acontecer, já tentei de todas as formas mas ainda não consegui. O que posso fazer para resolver isso?
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>
#define R1 0
// prototypes
boolean connectWifi();
//callback functions
void firstLightChanged(uint8_t brightness);
// WiFi Credentials
const char* ssid = "ssid";
const char* password = "password";
// device names
String Device_1_Name = "Portao";
boolean wifiConnected = false;
Espalexa espalexa;
void setup()
{
Serial.begin(115200);
pinMode(R1, OUTPUT);
digitalWrite(R1, HIGH);
// Initialise wifi connection
wifiConnected = connectWifi();
if (wifiConnected)
{
espalexa.addDevice(Device_1_Name, firstLightChanged);
espalexa.begin();
}
else
{
while (1)
{
Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
delay(2500);
}
}
}
void loop()
{
espalexa.loop();
delay(1);
}
// Callback function
void firstLightChanged(uint8_t brightness)
{
if (brightness)
{
digitalWrite(R1, LOW); // Liga o relé (nível baixo)
Serial.println("Device1 ON");
delay(500); // Mantém o relé ligado por 1 segundo
digitalWrite(R1, HIGH); // Desliga o relé (nível alto)
Serial.println("Device1 OFF");
}
else
{
digitalWrite(R1, HIGH); // Certifica-se de que o relé está desligado
Serial.println("Device1 OFF");
}
}
// connect to wifi – returns true if successful or false if not
boolean connectWifi()
{
boolean state = true;
int i = 0;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
Serial.print("Connecting...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 20) {
state = false; break;
}
i++;
}
Serial.println("");
if (state) {
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else {
Serial.println("Connection failed.");
}
return state;
}
Pesquisando em outras threads sobre esse assunto, vi que há alguns relatos de pessoas reclamando do estado dos pinos do ESP-01 durante a inicialização.
O que me chamou a atenção é que as reclamações são no sentido contrário da sua. Ou seja, as pessoas reclamam que os pinos iniciam com status HIGH, enquanto no seu caso, o que liga o relé é o status LOW.
Talvez isso tenha a ver com você estar ligando a energia no terminal NO ou NC do relé. Eu gosto muito do canal Brincando com Ideias e o Professor que cuida do canal tem um vídeo usando exatamente essa configuração que você apresenta. Se você ainda não viu, talvez o ajude:
Bom, eu testei da mesma forma como ele fez no vídeo porém ainda não resolveu o problema. O relé ainda está sendo rapidamente ativado e desligado na inicialização. Me parece ser algo relacionado a Esp ou ao módulo e não ao algoritmo. Tenho duas Esp01 e as duas acontecem a mesma coisa. Tem alguma ideia?
Fiz uma pesquisa rápida e vi que existem dois modelos da ESP01 que são: a ESP01 e a ESP01S. Coincidentemente tenho uma de cada, por isso resolvi testar mais uma vez com a outra, modelo diferente do que eu estava usando inicialmente, mas infelizmente ainda obtive o mesmo resultado. De fato não sei o que pode estar acontecendo. Não sei se é questão da fabricante dessas ESPs ou do módulo relé. Pois quanto ao algoritmo está tudo ok. Esse rápido tick aparenta acontecer antes mesmo de rodar o algoritmo.
/*
* This is a basic example on how to use Espalexa and its device declaration methods.
*/
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>
// prototypes
boolean connectWifi();
//callback functions
void firstLightChanged(uint8_t brightness);
// Change this!!
const char* ssid = "ssid";
const char* password = "password";
boolean wifiConnected = false;
Espalexa espalexa;
EspalexaDevice* device3; //this is optional
void setup()
{
Serial.begin(115200);
// Initialise wifi connection
wifiConnected = connectWifi();
if(wifiConnected){
// Define your devices here.
espalexa.addDevice("Portao", firstLightChanged); //simplest definition, default state off
espalexa.begin();
} else
{
while (1) {
Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
delay(2500);
}
}
}
void loop()
{
espalexa.loop();
delay(1);
}
//our callback functions
void firstLightChanged(uint8_t brightness) {
Serial.print("Device 1 changed to ");
//do what you need to do here
//EXAMPLE
if (brightness) {
Serial.print("ON, brightness ");
Serial.println(brightness);
digitalWrite(0,HIGH);
}
else {
Serial.println("OFF");
digitalWrite(0,LOW);
}
}
// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
boolean state = true;
int i = 0;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
// Wait for connection
Serial.print("Connecting...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 20){
state = false; break;
}
i++;
}
Serial.println("");
if (state){
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else {
Serial.println("Connection failed.");
}
return state;
}
Encontrei o problema. De fato o problema está no módulo. A versão v4.0 desse módulo apresenta essa característica, que para alguns projetos, como o meu, pode causar problemas.
Dessa forma, eu troco esse módulo por outro (ainda não sei exatamente qual versão), ou então faço alguma modificação no hardware (também não sei se é possível).
ola, é conhecido que quando faz reset ele faz uma sequencia em alguns desses pines.
tu teria q implementar um "delay" com algum método (lógica ttl com algum capacitor) ou o velho 555 ou alguns transistores+capacitor) isso asumindo q nao tens pin livres. pois se tiveres pin livre pode fazer tipo um "enable" com 1 pino extra.
Bom dia.
É, o ESP01 tem essa característica. Não sei o porque fizeram isto, mas o ESP01 inicia com as portas digitais em HIGH. Nas placas que já usei até agora, para ligar (1) tem ser LOW e desligar (0) ter ser HIGH. No caso acima, quando liga a placa, o pino fica em alta (1). Mas no código é enviado o comando para ficar em baixa (0). Nesse tempo de processamento acontece o pulso rápido. Uma saída seria criar um filtro RC (Resistor e Capacitor) atuando como um temporizador entre o ESP01 e o relé.