0
\$\begingroup\$

I'm using an ESP8266 board to control a relay via a transistor like this:

schematic

simulate this circuit – Schematic created using CircuitLab

However, when I boot the ESP8266 with the GPIO0 pin connected as shown, the blue LED is on constantly, as if in a constant reset or a flash mode. If I connect the GPIO once the boot has finished, it works fine. Does anyone know a way around this issue?

I am using the Arduino IDE to program the board with this code:

#include <ESP8266WiFi.h>

const char* ssid = "SSID";
const char* password = "PWORD";

int ledPin = 2; // GPIO2 of ESP8266
WiFiServer server(80);//Service Port

void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  // Match the request

  int value = LOW;
  if (request.indexOf("/LED=ON") != -1) {
    digitalWrite(ledPin, HIGH);
    value = HIGH;
  } 
  if (request.indexOf("/LED=OFF") != -1){
    digitalWrite(ledPin, LOW);
    value = LOW;
  }

  //Set ledPin according to the request
  //digitalWrite(ledPin, value);

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.print("Led pin is now: ");

  if(value == HIGH) {
    client.print("On");  
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("Click <a href=\"/LED=ON\">here</a> turn the LED on pin 2 ON<br>");
  client.println("Click <a href=\"/LED=OFF\">here turn the LED on pin 2 OFF<br>");
  client.println("</html>");

  delay(1);
  Serial.println("Client disconnected");
  Serial.println("");
}

Thanks.

\$\endgroup\$
  • \$\begingroup\$ Several GPIO states are required on boot, including that GPIO0 be high. This has been covered several times before, expect the question to be closed as a duplicate. \$\endgroup\$ – Chris Stratton Jul 7 '17 at 20:52
  • \$\begingroup\$ use GPIO 1 or 2 instead. \$\endgroup\$ – dandavis Jul 7 '17 at 21:02
2
\$\begingroup\$

Read this.

Your 3k resistor is enough to pull GPIO0 low during powerup and the ESP8266 is likely going into serial load mode.

Use a FET to drive your relay if you want to use GPIO0 .....and put a diode across the coil.

\$\endgroup\$
  • \$\begingroup\$ This means the relay will be on at boot - which may or may not be acceptable. \$\endgroup\$ – Chris Stratton Jul 7 '17 at 21:20
  • \$\begingroup\$ Correct. If that does not suit the OP then he could use a P-Chan FET. \$\endgroup\$ – Jack Creasey Jul 7 '17 at 21:41
0
\$\begingroup\$

First thing i see is you turn ON the built in led on setup()

pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); <--- This turns LED on.

Also, not shown in diagram, but you should pull GPIO0 high, with a pull-up resistor, possibly 20 kOhm. I would not choose something smaller as it would turn on the transistor on boot up (unless that's not a problem for you).

Hope this helps!

\$\endgroup\$
  • 2
    \$\begingroup\$ 20K won't accomplish anything. Because the transistor base sinks current, the pullup resistor will have to be on the same order as the base resistor (preferably less than a third of its value), or it won't make the pin actually high as needed. This will indeed mean turning on the relay during boot. \$\endgroup\$ – Chris Stratton Jul 7 '17 at 21:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.