Serielle Kommunikation mit WEMOS D1 mini

Ich habe einen Wemos D1 mini mit einem Programm geflasht, dass einen Messwert per MQTT ausgiebt und dann wieder in DeepSleep geht. Das ganze funktioniert auch prima. Nun wollte ich eine Änderung im Sketch durchführen, bekomme aber keinen Zugriff über die Schnittstelle. Die Schnittstelle wird erkann aber es wird keine Kommunikation aufgebaut. Die Meldung von Arduino ist:
A fatal esptool.py error occurred: Cannot configure port, something went wrong. Original message: PermissionError(13, 'Ein an das System angeschlossenes Ger�t funktioniert nicht.', None, 31)esptool.py v3.0
Serial port COM4
Ich hoffe es kann mir jemand weiter helfen.

Was zeigt dir den der Windows Gerätemanager an?

Hallo,
ich vermute jetzt mal du versuchst den neuen Sketch zu senden wenn sich der D1 im deep sleep befindet. Da hilft jetzt nur der reset Taster auf dem D1 drücken wenn das senden von der IDE gestartet wird.

Gruß Heinz

image

Sobald die Kommunikation aufgebaut werden soll, kommt die Fehlermeldung. Egal ob ich den Reset-Taster drücke oder nicht.

Dann zeig uns doch bitte den Sketch der drauf läuft.
Evtl. blockiert etwas darin den Upload.
Bitte in Code-Tags setzen.


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


String Ubatt = "";

// Update these with values suitable for your network.

const char* ssid ="abcdefg";
const char* password = "1234567";
const char* mqtt_server = "192.178.0.112";
const char* mqtt_user = "MQTTSERVER";
const char* mqtt_password = "Passwort";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
char msg[MSG_BUFFER_SIZE];
uint16_t value = 0.0;
const int SensorPin = 20;


void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

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

  randomSeed(micros());

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

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(BUILTIN_LED, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(BUILTIN_LED, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    //if (client.connect(clientId.c_str())) {    
    if (client.connect("Hallo Hans",mqtt_user, mqtt_password)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("MQTT_Test/outTopic", "Hallo Hans");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
      delay(200);
  client.publish("ESP-MQTT-Test/State_TXT", "aufgewacht" ); 
  client.publish("ESP-MQTT-Test/State", "on" ); 
  delay(1200); 
  }
}

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(17, OUTPUT);
  digitalWrite(17, HIGH);
  delay(10000);
}

void loop() {
   
  //Serial.print("VCC= ");
  uint16_t my_getVcc_Voltage_alt = analogRead(A0); //ESP.getVcc();
  //Serial.println(my_getVcc_Voltage);
  float_t my_Voltage_calculated = ((float)my_getVcc_Voltage_alt/307.0f);
  Ubatt = String(my_Voltage_calculated, 3);  
  Serial.println(Ubatt);
  if (!client.connected()) {
    reconnect();
  }
  client.loop();


  // Messwert auslesen 4x mit 250ms Pause dazwischen
    uint16_t my_getVcc_Voltage1 = analogRead(A0);
    delay(250);
    uint16_t my_getVcc_Voltage2 = analogRead(A0);
    delay(250);
    uint16_t my_getVcc_Voltage3 = analogRead(A0);
    delay(250);
    uint16_t my_getVcc_Voltage4 = analogRead(A0);
    delay(250);        
    uint16_t my_getVcc_Voltage = (my_getVcc_Voltage1 + my_getVcc_Voltage2 + my_getVcc_Voltage3 + my_getVcc_Voltage4)/4;

  // Messwert Werten
    my_Voltage_calculated = ((float)my_getVcc_Voltage/307.0f);

  // Messwert zur Ausgabe auf MQTT aufbereiten
  dtostrf (my_Voltage_calculated ,3, 4, msg); 
  // Messwert auf MQTT ausgeben   
  client.publish("ESP-MQTT-Test/VCC", msg );

  // Rohwert zur Ausgabe auf MQTT aufbereiten
  dtostrf (my_getVcc_Voltage ,3, 4, msg ); 
  client.publish("ESP-MQTT-Test/Rohwert", msg );

  delay(200);
  client.publish("ESP-MQTT-Test/State_TXT", "gehe schlafen" ); 
  client.publish("ESP-MQTT-Test/State", "off" ); 
  //digitalWrite(SensorPin, LOW);  
  delay(200);

  ESP.deepSleep(30e5); 
  

}

Ich vermute mal, die vielen delays in deinem Sketch blockieren den richtigen Zeitablauf.
Evtl. musst du länger Reset drücken.
Drücke mal so lange bist der Upload im seriellen Monitor startet.

Hallo,
normal versucht die IDE ja auch 2-3 mal eine Verbindung aufzubauen. Zu dem Zeitpunkt sollte der D1 schon nicht mehr im deep sleep sein.
Die Laufzeit von Deinem Sketch ist ja wesentlich größer als 10s , da sollte es ja auf jeden Fall möglich sein das während der Zeit der Download startet.
Wenn die Fehlermeldung direkt kommt dann hast Du eventuell ein ganz anderes Problem. Hast Du nicht noch einen zweiten D1 den Du mal mit einem Blink Sketch testest. PC neu booten hast Du sicher schon gemacht.

Gruß Heinz
Nachtrag
Du kannst mit dem reset Taster den D1 ja auch zu jeder Zeit neu starten umd musst nicht warten bis der Deep sleep abgelaufen ist. Den taster statisch gedrückt halten geht aber auch nicht dann startet er nicht.

Auch mit dem lange drücken der Resettaste habe ich keine Verbindung hin bekommen.
Mit dem NodeMCU Firmware Programmer habe ich auch versucht mal den Speicher zu löschen. Aber ohne erfolg. Die Schnittstelle wird erkannt aber keine Verbindung aufgebaut.

Werde wie von "Rentner" vorgeschlagen einen zweiten D1 mit Blinki bespielen und schauen ob überhaupt eine Übertragung zu stande kommt.

Ok. Zweiten D1 konnte ich mit Blinki bespielen. Also grundsätzlich ist mein system i.o.
Muss wohl davon ausgehen das mein D1 nicht mehr zu retten ist. :frowning:

Warum die Leute immer gleich versuchen mit der Axt zu hantieren , da hast Du vermutlich Glück gehabt das das nicht geklappt hat.
Wenn der D1 läuft , egal wie , dann sollte man mit der IDE Ihn auch in den Programm-Modus bekommen.

Hast D mal mit dem Monitor kontrolliert ob der Sketch noch normal abläuft , ein paar serielle Ausgaben sind ja drin und die sollten ja auch angezeigt werden.

Heinz

Nein. Kommt nix an.

d.h. er startet und läuft nicht mehr ?

ich denke auch Du solltest deinen loop in dem Sketch noch mal überdenken und nur dann in den esp.deepSleep() laufen wenn Du das wirklich willst. Du musst dem Ding schon die Möglichleit lassen für einige Zeit normal den loop zu bearbeiten. Und dann wenn Du Deine Messung beendet hast und alles versendet hast dann rufst Du eine Funktion auf schlafen gehen . Darin die Verbindung beenden , Wifi ausschalten , ESP.deepSleep() und als letztets noch ein delay(1)

bei mir sieht das so aus.

//----------------- ESP sleep
void ESP_sleep(int sl) { // sl in sekunden
  delay(300);// noch warten sonst fehlen Telegramme

  Serial.printf("Korr. Sleepwert %u Laufzeit war %lums\n", sl, millis());
  WiFi.disconnect(true);
  delay(1);
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin ();
  delay(1);
  ESP.deepSleep(sl * 1000000ULL, WAKE_NO_RFCAL);
  delay(1);
}

Hallo
nach Deinem post #15 lässt sich ja Com4 nicht öffnen , das kann aber meiner Meinung nach nur am PC liegen. Versuchen da eventuell zwei Programme / Instanzen auf den selben com Port zuzugreifen ?

Doch der D1 läuft und sendet braf seine Daten an MQTT. Nur kann ich halt keine Änderungen am Sketch einbringen.

Hallo,
aber dann müsstest Du doch auch die seriellen Ausgaben auf dem Monitor sehen. Wenn sich allerdings die com4 nicht öffnen lässt wird das nix.

Hast Du da eventuell was zerschossen weil Du mit einer externen Stromversorgung am 5V pin und über den PC am USB gleichzeitig angeschlossen warst. dann könnte eventuell der Uart auf de D1 tot sein. Auf Rx und TX hast Du ja nix angeschlossen ?

Heinz

Habe den Wemos jetzt an ein FTDI Adapter angeschlossen. Bekomme Info dass Wifi verbunden ist und auch einen Analogwert. Dann geht er wieder schlafen. Ich kann ihn aber nicht in den Bootmodus bringen. Denke Der UArt ist hinüber und verhindert den Empfang von Befehlen/Daten. Werde den kleinen jetzt beerdigen.... Danke für Eure Unterstützung.