ESP8266 Fahrrelais und Lesetaste

Ich möchte einen ESP8266 (ESP-01S) haben, der nur GPIO0 und GPIO2 freigelegt hat, ein Relais ansteuern (über einen NPN-Transistor auf GPIO2) und eine Taste lesen (GPIO0).

Der Schaltplan ist wie folgt:Geben Sie hier die Bildbeschreibung ein

Das Problem ist, sobald ich die rote Leitung anschließe, sieht es so aus, als würde das Netzteil nicht genug Strom liefern.

Auch ohne das Relais sieht es so aus, als ob der LM1117-3,3 nach ein paar Minuten in die thermische Abschaltung geht.

Das Problem mit dem ESP8266 ist, dass GPIO0 HIGH und GPIO2 HIGH sein muss, wenn es eingeschaltet wird, damit es erfolgreich booten kann. Es funktioniert jedoch perfekt für die ersten paar Minuten, also weiß ich, dass der Code gut funktioniert.

Was mache ich falsch? Sollte ich den Widerstand von dem 3K3, den ich jetzt habe, auf 10K erhöhen?

Für alle Fälle hier der Quellcode:

// Relay control using the ESP8266 WiFi chip

// Import required libraries
#include <ESP8266WiFi.h>

// WiFi parameters
const char* ssid = "SSID";
const char* password = "Password";

//Room Name
const String RoomName = "Room 1";

//Response from Client
String request = "";

// The port to listen for incoming TCP connections 
#define LISTEN_PORT           80

// set pin numbers:
const int buttonPin = 0;    // the number of the pushbutton pin
const int relayPin = 2;      // the number of the LED pin

int relayState = LOW;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output     flickers

// Create an instance of the server
WiFiServer server(LISTEN_PORT);
WiFiClient client;

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

   pinMode(buttonPin, INPUT);
   pinMode(relayPin, OUTPUT);

   // set initial LED state
   digitalWrite(relayPin, relayState);
  
   // Connect to WiFi
   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");
  
   Serial.println("You can connect to this Switch at this URL:");
   Serial.print("http://");
   // Print the IP address
   Serial.print(WiFi.localIP());
   Serial.println("/");
  
}

void loop() {
  request = "";
  
  // Handle REST calls
  WiFiClient client = server.available();
  if (client) {
     Serial.println("User connected.");
     while(!client.available()){
          delay(1);
     }
     Serial.print("Request Received:");
     request = client.readStringUntil('\r\n');
     Serial.println(request);
     client.flush();
  }

    //process the request
    if (request.indexOf("/LED=ON") != -1) {
       relayState = HIGH;
    }
    if (request.indexOf("/LED=OFF") != -1) {
       relayState = LOW;
    }

   // read the state of the switch into a local variable:
   int reading = digitalRead(buttonPin);

   // If the switch changed, due to noise or pressing:
   if (reading != lastButtonState) {
     // reset the debouncing timer
     lastDebounceTime = millis();
   }

   if ((millis() - lastDebounceTime) > debounceDelay) {
     // whatever the reading is at, it's been there for longer
     // than the debounce delay, so take it as the actual current state:

     // if the button state has changed:
     if (reading != buttonState) {
       buttonState = reading;

       // only toggle the LED if the new button state is HIGH
       if (buttonState == HIGH) {
         relayState = !relayState;
       }
     }
   }

   digitalWrite(relayPin, relayState);

   // save the reading.  Next time through the loop,
   // it'll be the lastButtonState:
   lastButtonState = reading;

  if (client) {
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html; charset=UTF-8");
      client.println("");
      client.print("<html><head><title>");
      client.print(RoomName);
      client.print(": Gineer.Home.SmartSwicth</title><style>body
{background-color: black;color: white;text-align: center;}#switchSlider     {display: inline-block;left: 28px;position: relative;border: 4px solid     gray;width: 40px;height: 120px;vertical-align: central;}#switchToggle {display:     inline-block;left: -30px;position: relative;border: 4px solid     gray;width: 60px;height: 20px;vertical-align: central;}#switchSlider.off     {background-color: silver;}#switchToggle.off {top: -20px;background-color:     silver;}#switchSlider.on {background-color: yellow;}#switchToggle.on {top:     -80px;background-color: yellow;}</style></head><body><h1>");
      client.print(RoomName);
      client.print("</h1><a href=\"/LED=");
      if(relayState == HIGH)
      {
         client.print("OFF");
      }
      else
      {
         client.print("ON");
      }
      client.print("\" border=\"0\"><div class=\"");
      if(relayState == HIGH)
      {
         client.print("on");
      }
      else
      {
         client.print("Off");
      }
      client.print("\" id=\"switchSlider\"></div><div class=\"");
      if(relayState == HIGH)
      {
         client.print("on");
      }
      else
      {
         client.print("Off");
      }
      client.println("\" id=\"switchToggle\"></div></a><br /><br />Brought to you by <a     href=\"http://www.gineer.co.za/\">Gineer R&D</a></body></html>");
      Serial.println("htmlsent");
   }
}

Update
Okay, die folgende Schaltung löst das Bootproblem, aber der LM1117-3,3 überhitzt und schaltet sich ab.Geben Sie hier die Bildbeschreibung ein

Update
Ich habe 3K3-Widerstände inline mit den chip_enable- und Reset-Leitungen hinzugefügt. Es scheint jetzt für ein paar Minuten gut zu funktionieren, dann scheint der ESP8266 herunterzufahren und dann scheint nur der LM1117-3,3 ziemlich schnell sehr heiß zu werden. Ist das eine Art Schlafmodus/Sollte ich meiner Schleife mehr Verzögerungen hinzufügen, damit sie langsamer läuft? Sicher nicht?

Versuchen Sie, einen 3k3-Widerstand am GPIO2-Ausgang anzubringen.
Das Hinzufügen von 3K3 zwischen Basis und GPIO2 führt dazu, dass der ESP8266 nicht erfolgreich startet

Antworten (2)

Es scheint, dass die Schaltung in meinem ersten Update die richtige Version war. Die einzigen zusätzlichen Bits, die ich in meiner Schaltung über das obige Diagramm hinaus habe, sind die 2 zusätzlichen 3K3-Widerstände zwischen Vcc und Reset und Chip Enable.

Das Überhitzungsproblem scheint darin bestanden zu haben, dass der Ausgangskondensator des LM1117-3,3 falsch herum war.

Dank des ganzen Inputs hat es mich aber in die richtige Richtung denken lassen.

Hier ist die endgültige Arbeitsversion:Geben Sie hier die Bildbeschreibung ein

Etwas, das ich hier hinzufügen sollte, ist, dass diese Schaltung im ausgeschalteten Zustand etwas instabil zu sein scheint (dh wenn das Licht ausgeschaltet ist, was in meinem Fall der Fall ist, wenn das Relais erregt ist, sodass die LED eingeschaltet ist). Ich ging davon aus, dass die Bypass-Diode für die induktive Last ausreichen würde, aber in zukünftigen Versionen würde ich anstelle des Transistors einen Optokoppler hinzufügen. (Habe es aber noch nicht probiert)
Die Instabilität wurde hier dadurch beobachtet, dass das Gerät nach einiger Zeit nicht mehr reagierte. Die Lösung dafür lag nicht in einem elektrischen Fehler, sondern in meinem Quellcode. Dieses Gerät funktioniert nun seit einigen Monaten einwandfrei.

Entfernen Sie 3k3 von V+

Ersetzen Sie die Verbindung GPIO2 zur Basis durch 470Ω bis 1kΩ.

GPIO hat einen Treiber mit niedriger Impedanz (~25Ω), also (3,3-0,7)/25 = bis zu 100mA! in die Basis! ng Aus diesem Grund wird eine Reihe R von etwa dem 10-fachen des Widerstands der Relaisspule verwendet.

Schließen Sie den Emitter der roten Linie an Masse an.

Das hatte ich ursprünglich. Ich habe es erneut versucht, aber der ESP8266 bootet nicht, es sei denn, GPIO2 ist beim Einschalten hoch.