ESP8266 PIN funktioniert nach einer Weile nicht mehr

Hallo zusammen,

ich habe ein kleines Projekt gebastelt, was mich aber langsam in den Wahnsinn triebt.
Und zwar versuche ich einen Glade Raumduftsprüher mit einem ESP8266-12 WLan gesteuert zu betreiben.

Ich habe dazu die Batterieversorgung (2x AA) des Sprühers auf den ESP gelegt, dabei habe ich 2 Varianten probiert.

  1. mit Transistor 2N2222 die Masse auf den Sprüher geschalten, ESP an PIN D3 als Schaltpin für den Transistor. Plus an 3,3V des ESP.

  2. mit einem 3,3V Pulldown mit ein/ausschalt PIN, diesen habe ich ebenfalls auf D3 gelegt und den Pulldown auf den 5V PIN am ESP, Masse auf Masse.

Ich habe also einmal Masse und einmal Plus geschalten. Außerdem habe ich beide Schaltungen auch an PIN D7 am ESP versucht. Ergebnis ist immer das gleiche.

Der Spüher funktioniert eine Weile, sprüht ein paar mal und irgendwann geht es nicht mehr. Der ESP selber und das Programm laufen, aber der PIN lässt sich einfach nicht mehr schalten, also er wird nicht mehr HIGH.

Hier noch mein Programm dazu:

ADC_MODE(ADC_VCC);

#include <ESP8266WiFi.h>      //ESP library from http://github.com/esp8266/Arduino
#include <PubSubClient.h>      // MQTT library from http://github.com/Imroy/pubsubclient

extern "C" {
  #include "user_interface.h"
}

// ESP1 = Kinderzimmer
// ESP2 = Schlafzimmer
// ESP3 = Filament Box 2
// ESP4 = Filament Box 3
// ESP5 = Filament Box 1
// ESP6 = Filament Box 4
// ESP7 = Duft Wohnzimmer (NodeMCU)
// ESP8 = Schlafzimmer (NodeMCU)
// ESP9 = Küche (NodeMCU)
// ESP10 = Duft Bad (NodeMCU)

int esp_id = 7;

const char *ssid =   "XXX";      // cannot be longer than 32 characters!
const char *password =   "XXX";      //
const char* mqtt_server = "192.168.1.10";

#define SERV1 D7 // Pin connected to the Servomotor

// Strings zusammen bauen
String esp = "ESP-" + String(esp_id);
char *esp_name = &esp[0u];

//const char* mqtt_airfresh_topic = "airfresh_bad";
String air_topic = "esp" + String(esp_id) + "/airfresh";
const char* mqtt_airfresh_topic = &air_topic[0u];

WiFiClient espClient;
PubSubClient client(espClient);

char msg[50];

void setup() {
  // start the serial connection
  Serial.begin(115200);

  pinMode(SERV1, OUTPUT);
  digitalWrite(SERV1, LOW);
  delay(10);

  Serial.println("Connecting to MQTT");
  client.setServer(mqtt_server, 1883);
  Serial.println("Connected to MQTT");
  setup_wifi();
  client.setCallback(callback);
  client.subscribe(mqtt_airfresh_topic);
  Serial.println("MQTT Topic: " + String(mqtt_airfresh_topic));
}

void setup_wifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  //wifi_set_phy_mode(PHY_MODE_11G);
  //system_phy_set_max_tpw(50);
  wifi_station_set_hostname(esp_name);
  delay(10);
  
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  //WiFi.config(IPAddress(192,168,1,20), IPAddress(192,168,1,1), IPAddress(255,255,255,0), IPAddress(192,168,1,1));
  //Serial.println(WiFi.status());

 // wait for a connection
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
    
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  reconnect();
}

void loop() {
  // Check WLan
  if (WiFi.status() != WL_CONNECTED || !client.connected()) {
    if (WiFi.status() != WL_CONNECTED) Serial.println("Wifi disconnected");
    if (!client.connected()) Serial.println("MQTT disconnected");
    reconnect();
  }

  delay(100);
  client.loop();
}

// this function is called whenever a message
// is received from Adafruit IO. it was attached to
// the feed in the setup() function above.
void callback(char* topic, byte* payload, unsigned int length) {
  // Zähler
   int i = 0;
   // Hilfsvariablen für die Convertierung der Nachricht in ein String
   char message_buff[100];
   
   Serial.println("Message arrived: topic: " + String(topic));
   Serial.println("Length: " + String(length,DEC));
   
   // Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
   for(i=0; i<length; i++) {
     message_buff[i] = payload[i];
   }
   message_buff[i] = '\0';
   
   // Konvertierung der nachricht in ein String
   String msgString = String(message_buff);
   Serial.println("Payload: " + msgString);
  
  // if virtual push button was pressed
  if (msgString.equalsIgnoreCase("button")){
    Serial.println("Virtual push button");
    // set high for x sek
    Serial.println("Spray on");
    digitalWrite(SERV1, HIGH);
    delay(7000);
    Serial.println("Spray off");
    digitalWrite(SERV1, LOW);
  }
} 

void reconnect() {
  // Loop until we're reconnected
  if (WiFi.status() != WL_CONNECTED) {
    setup_wifi();
  }
  
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(esp_name)) {
      Serial.println("connected");
      client.subscribe(mqtt_airfresh_topic);
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");     
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Ich hoffe mir kann hier jemand auf die Sprünge damit helfen.
Danke schon mal :slight_smile:

   for(i=0; i<length; i++) {

message_buff = payload;
  }
  message_buff = ‘\0’;

Das sieht sehr komisch aus.
Das tut doch, recht sicher, ganz was anderes, als das was du erreichen möchtest.
Ich finde, man sollte erheblich vorsichtiger sein, bei der Manipulation von Zeigern.

Nebenbei:
Verwende bitte die Code Tags und nicht Quote.

Woran erkennst du, dass der ESP und der Sketch noch funktionieren ?

Ich vermute, du hast einen Schaltungsfehler. Poste doch mal ein Schaltbild.

Und setze deinen Sketch bitte in Code-Tags, dann können wir auch den Sketch richtig lesen. Auch an Mobilgeräten.

a) Nutzt Du direkt den ESP, oder ein Board wie NodeMCU? b) Wozu die ganze Zeit die serielle Schnittstelle nutzen, hast Du ein Display oder einen Monitor daran? Ungenutzte serielle Schnittstellen können auch zum Programmabbruch führen. c) Die Versorgung über 2x 1,5V Batterien scheint recht mager, WiFi ist stromhungrig.

Der ESP selber und das Programm laufen

-->Warum bist Du Dir hier so sicher?

Ein Schaltplan würde auch gut weiterhelfen...

combie: Das sieht sehr komisch aus. Das tut doch, recht sicher, ganz was anderes, als das was du erreichen möchtest. Ich finde, man sollte erheblich vorsichtiger sein, bei der Manipulation von Zeigern.

Nebenbei: Verwende bitte die Code Tags und nicht Quote.

Der Code für den callback ist aus einem Tutorial.

HotSystems: Woran erkennst du, dass der ESP und der Sketch noch funktionieren ?

Habe den ESP am Rechner und überwache ihn seriell. Daran sehe ich das er weiterhin alles ausführt. Ein Messgerät am Pin sagt jedoch das er ihn nicht High schaltet.

Außerdem habe ich ein zweites Gerät mit DHT und PIR zusätzlich dran und die Daten werden weiterhin geliefert, auch wenn die Aktivierung des Sprühers nicht mehr geht.

Ich nutze ein NodeMCU Board und habe es per 5V USB angeschlossen.

Hier noch der Schaltplan dazu.

PS: ich habe anstelle des Widerstandes auch schon einen Diode versucht.

ManuelW77: Hier noch der Schaltplan dazu.

PS: ich habe anstelle des Widerstandes auch schon einen Diode versucht.

Mich wundert, dass diese Schaltung überhaupt funktioniert. Du verwendest einen falschen Transistor bzw. der ist falsch angeschlossen.

Was genau ist das für ein Motor ? Zumindest fehlt da eine Freilaufdiode.

Der Transistor ist ein 2N2222, also ein NPN Transistor. Wieso ist der falsch angeschlossen?

Zum Motor, der ist da nur Symbolisch so eingezeichnet. in diesem Glade Duftsprüher ist ne eigene Schaltung drin, die Zeitgesteuert alle X Minuten auslöst. Diese hat aber die Eigenschaft, dass sie 1 mal auslöst wenn man Strom anlegt. Im Normalfalle wären das 2x AA Batterien, ich gebe die 3V eben durch die Schaltung drauf.

Wie gesagt, die Schaltung funktioniert ne Weile und dann plötzlich nicht mehr.

ManuelW77: Der Transistor ist ein 2N2222, also ein NPN Transistor. Wieso ist der falsch angeschlossen?

Zum Motor, der ist da nur Symbolisch so eingezeichnet. in diesem Glade Duftsprüher ist ne eigene Schaltung drin, die Zeitgesteuert alle X Minuten auslöst. Diese hat aber die Eigenschaft, dass sie 1 mal auslöst wenn man Strom anlegt. Im Normalfalle wären das 2x AA Batterien, ich gebe die 3V eben durch die Schaltung drauf.

Wie gesagt, die Schaltung funktioniert ne Weile und dann plötzlich nicht mehr.

Weil der Emitter an GND gehört.

Und wenn du nicht sicher bist, ob in deinem symbolischen Teil, eine Freilaufdiode drin ist, dann mach die rein, das kann der Fehler sein. Und du solltest auch genauer beschreiben, was das symbolische sein soll. Daher ist ein Hyperlink zum Teil sehr wichtig.

Ach sorry, ja Fritzing hat einen Falschen Transistor in der Darstellung :-/ Ich habe natürlich den Emitter an GND.

Ich bauen grad mal noch eine Freilaufdiode ein und schaue, ob sich da etwas ändert.

ManuelW77: Ach sorry, ja Fritzing hat einen Falschen Transistor in der Darstellung :-/

Wieso Fritzing, der Transistor ist richtig, nur falsch angeschlossen.

Weil der im Steckbrettmodus die Pins anders hat als meiner

ManuelW77: Weil der im Steckbrettmodus die Pins anders hat als meiner

?? :disappointed_relieved:

Also ich baue eine Schaltung nach Datenblatt und Schaltbild auf, da ist mir ein Steckbrett oder Fritzing völlig wurscht. Das Schaltbild ist ausschlaggebend und sollte schon richtig sein. Egal ob gelötet oder gesteckt.

Daher kann ich deine obige Erklärung absolut nicht nachvollziehen, geschweige denn überhaupt verstehen.

Schreib doch einfach, du hast dich in der Beschaltung des Transistors geirrt.

Edit: Hast du dir im Datenblatt deines ESP mal angesehen, wieviel Strom der am 3,3Volt-Pin liefern kann ? Evtl. ist das ja schon zu viel für das Teil.

Leider lieferst du auch hier keine Informationen. Sollen wir alles erraten ?

Der Code für den callback ist aus einem Tutorial.

Das sieht jetzt viel besser aus! Deine vorherige Quote Formatierung hat die [ i ] unterschlagen. Das siehst du auch in meinem vorherigen Zitat.