ESP01 + Módulo Relé | Problemas na Inicialização

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;
}

Olá! Bem vindo ao Forum.

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?

Sim, é algo relacionado ao ESP01.

Infelizmente, não.

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.

Consegui resolver o problema através do tutorial desse site:
https://starter-kit.nettigo.eu/2022/change-gpio-used-by-esp01-relay-module/

Obrigado,

Obrigado,

Para quem tiver este mesmo problema, aí está a solução que me ajudou!

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é.

1 Like