0

I was recently working on a home automation project which has finally come to end and I am thinking to install it in my home. First of all, I would like to brief you with the basic architecture.

I am using a Raspberry Pi 3 as the central controller node which is running Node-Red and its Mosca palette. Currently, there are 5 ESP-01 in the project. Four of them are wired up with a relay and the remaining ESP is wired up with a DHT11 temperature sensor. Almost everything is running good but I am facing some stability issues, like, when I recycle the power the ESP-01 doesn't run the program. Serial monitor stays blank. However, when I disconnect the GPIO2 from the relay and then power up the ESP. The program begins. So, I have to pull out the GPIO2 then power up the ESP then connect the GPIO2 with the relay on every power recycle. Another problem which I am facing is sometimes the ESP crashes automatically. It sometimes prints out fatal exception(0) or soft wdt reset even though I have added a watchdog timer.

Here is the code for one of the client ESP:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "........";
const char* password = ".........";
const int led = 13;

const char* mqtt_server = "192.168.1.8";

WiFiClient espClient;
PubSubClient client(espClient);

const int ledGPIO2 = 2;

void setup_wifi() {
  int i;
  delay(10);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("WIFI BEGUN");
  while (WiFi.status() != WL_CONNECTED) {
    ESP.wdtFeed();
    delay(500);
    i++;
    if ((i&0x01)==0){
      digitalWrite(led, 0);
    } else {
      digitalWrite(led, 1);     // led should start blinking at .5 seconds
    }
    Serial.print(".");
    if (i>1000) break;     // get out after 50 seconds

    if (i==1000){

    }
    Serial.print(".");

    Serial.println("");
    Serial.print("WiFi connected - ESP IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void callback(String topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  if(topic=="Lamp1"){
      Serial.print("Changing GPIO 2 to ");
      if(messageTemp == "on"){
        digitalWrite(ledGPIO2, HIGH);
        Serial.print("On");
      }
  else if(messageTemp == "off"){
    digitalWrite(ledGPIO2, LOW);
    Serial.print("Off");
  }
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");  

      client.subscribe("Lamp1");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
  // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(ledGPIO2, OUTPUT);
  digitalWrite(ledGPIO2, true);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);    
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  if(!client.loop())
    client.connect("ESP8266Client");
}

Also, I have been thinking for an efficient power supply for ESP. Batteries cannot be reliable for long-term and powering up via an adapter would be unfeasible as the module is going to be mounted on the wall. Moreover, ac to dc converter was something which seems to be a decent way for power supply.

Vcc - 3.3V
CH_PD - 3.3V
Tx - Tx (Arduino)
Rx - Rx (Arduino)
GPIO0 - GND (while uploading the sketch)/ 3.3V
GND - GND

I am not using capacitors or resistors. I am getting a 5V supply from Arduino which is regulated to 3.3V using LD33V voltage regulator.

Any suggestions would be appreciated. Thank You!!

Rohit Mathur
  • 131
  • 2
  • 7
  • What's your circuit for connecting the realy to the ESP? What kind of driver stage do you use? Do you have flyback diodes in place? How do you handle EMI from the relay? Is the power supply stable enough? – JimmyB Oct 23 '17 at 14:57
  • GPIO2 is connected to the input pin of the relay. Vcc and Gnd of the relay is connected to Vcc and Gnd of the arduino. I am not using any capacitors or resistance or diodes. However, the voltage supply is stable. I checked it via multimeter. No clue about the EMI – Rohit Mathur Oct 23 '17 at 15:14
  • What makes you think that GPIO2 can safely directly drive the relay? A multimeter is of no use in verifying stability of supply voltage when even µs drops can cause trouble. – JimmyB Oct 27 '17 at 11:22

0 Answers0