Probleme beim Hochladen eines Programmes. ESP32

Hallo Zusammen,

Ich habe ein Projekt von der Uni aus mit einem ESP32 Board und habe hierfür folgendes Skript entwickelt:

// Einbinden der benötigten Bibliotheken
#include <SPI.h>
#include <ESP32Servo.h> 
#include <MFRC522.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <HCSR04.h>
#include <DS18B20_INT.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <UniversalTelegramBot.h>
#include <WiFiClientSecure.h>

const char* ssid = "OnePlus 7T Plus";
const char* password = "passwort";
// Definition der Pins für das Relais und den Feuchtesensor
const int RELAY_PIN = 33; // Pin, an dem das Relais angeschlossen ist
const int SENSOR_PIN = 34; // Pin, an dem der Feuchtesensor angeschlossen ist

// Mindestwert, bei dem das Relais ausgelöst wird (Wert kann je nach Sensor unterschiedlich sein)
const int MIN_VALUE = 500; 

// Definition der Pins für den MFRC522 RFID-Reader
#define RST_PIN     35
#define SS_PIN      21

// Definition der Pins für die LED-Anzeigen
#define ledRot 13
#define ledGruen 12

// Definition des Pins für den Temperatursensor DS18B20
#define sensorPin 14
OneWire oneWire(sensorPin);
DS18B20_INT sensor(&oneWire);

// Telegram-Zugangsdaten
#define BOT_TOKEN "5880563335:AAHyudoAXIIWdlK1R_MmGA2ppQfXRBrAWTM"
#define CHAT_ID "6208854057"

//Servo Pin festlegen
#define Servo_Pin 27

// Telegram Bot Objekt
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);

// Initialisierung des MLX90614 Infrarot-Temperatursensors
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

// Variable, um festzustellen, ob eine Tasse erkannt wurde
bool cupDetected = false;

// Definition der Anzahl der zulässigen RFID-IDs und der Array-Variable, die die zulässigen IDs enthält
const int NUM_RFIDS = 5;
String rfids[NUM_RFIDS] = {" C7 91 10 04"," DE 20 10 04"," B9 A4 0F 04"," FE F0 10 04"," 83 B9 4C 90"};
String newRfidId = "";


// Erstellung einer Objektinstanz für den MFRC522-Reader
MFRC522 mfrc522(SS_PIN, RST_PIN);

// Speichern der zuletzt gelesenen RFID-ID
String lastRfid = "";

// Initialisierung des HCSR04 Ultraschallsensors
HCSR04 hc(2, new int[5]{ 5, 25, 26, 16, 4}, 5); // (TRIG-Pin für alle gleich, Array der ECHO-Pins, Anzahl der Sensoren)

// Initialisierung des Servomotors
Servo myservo;

// Zeitintervall in Millisekunden für das Polling des Seriellen Monitors
const unsigned long POLL_INTERVAL_MS = 1000;

// Zeitintervall in Millisekunden für den Timer
const unsigned long TIMER_INTERVAL_MS = 1000;

// Zeichenkette, die den Timer startet
const char* START_STRING = "DE 20 10 04";

// Zeitintervall in Millisekunden für das Zurücksetzen des Timers
const unsigned long RESET_INTERVAL_MS = 7 * 24 * 60 * 60 * 1000;

// Zeitstempel, an dem der Timer zuletzt zurückgesetzt wurde
unsigned long lastResetTime = 0;

// Zeitstempel, an dem der Timer zuletzt gestartet wurde
unsigned long lastStartTime = 0;

// Flag, das angibt, ob der Timer läuft oder nicht
bool timerRunning = false;


void setup() {
  delay(100);
  // Initialisierung der seriellen Schnittstelle
  Serial.begin(115200);
  delay(2000);
  myservo.attach(Servo_Pin); // Pin 27 als Servo-Pin festlegen

  
  // Festlegen des Ausgangs-Pins für das Relais und des Eingangs-Pins für den Feuchtesensor
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(SENSOR_PIN, INPUT);
  
  WiFi.begin(ssid, password);
  delay(500);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Verbindung zum WLAN herstellen...");
  }

  Serial.println("Erfolgreich mit dem WLAN verbunden!");
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
    
  mlx.begin(); // Initialisiert den MLX90614 Sensor
  pinMode(ledRot, OUTPUT);
  pinMode(ledGruen, OUTPUT);

  // Timer-Intervall setzen
  timerAlarmWrite(0, TIMER_INTERVAL_MS * 1000, true);

  // Timer starten
  timerAlarmEnable(0);
  Serial.println("Setup abgeschlossen.");
  delay(200);
  //begin der SPI Kommunikation
  SPI.begin();
  delay(100);
  //initialisieren der Kommunikation mit dem RFID Modul
  mfrc522.PCD_Init();
}

void loop() {
  TempSens();
  myservo.write(0);
  DistanceInfrarot();
  RFID();
  TelegramMessage();
  printDistances();
  Pumpe();
}

void RFID() {
  //Wenn keine neue Karte vorgehalten wurde oder die serielle Kommunikation
  //nicht gegeben ist, dann...
  if ( !mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("!PICC_IsNewCardPresent");
    return;
  }
  if (!mfrc522.PICC_ReadCardSerial()) {
    //Serial.println("!PICC_ReadCardSerial");
    return;
  }
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    newRfidId.concat(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    newRfidId.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  //alle Buchstaben in Großbuchstaben umwandeln
  newRfidId.toUpperCase();

  //Wenn die neue gelesene RFID-ID ungleich der bereits zuvor gelesenen ist,
  //dann soll diese auf der seriellen Schnittstelle ausgegeben werden.
  if (!newRfidId.equals(lastRfid)) {
    //überschreiben der alten ID mit der neuen
    lastRfid = newRfidId;
  }
  bool verified = false;

  //prüfen ob die gelesene RFID-ID im Array mit bereits gespeicherten IDs vorhanden ist
  for (int i = 0; i < NUM_RFIDS; i++) {
    //wenn die ID an der Stelle "i" im Array "rfids" mit dem gelesenen übereinstimmt, dann
    if (rfids[i].equals(newRfidId)) {
      verified = true;
      //Schleife verlassen
      break;
    }
  }
  //Wenn die Variable "verified" auf True ist, dann...
  if (verified && hc.dist(5) < 4) {
    TempInfraRot();
    digitalWrite(ledGruen, HIGH);
    delay(1000);
    digitalWrite(ledGruen, LOW);
    Serial.println("RFID-ID [" + newRfidId + "] verifiziert");
    myservo.write(45); // Drehe Servomotor um 45 Grad
    delay(2000);
    verified = false;
    RfidDB();
  }
  else {
    //Wenn nicht dann...
    //LED aktivieren
    digitalWrite(ledRot, HIGH);
    //eine Pause von 125 ms.
    delay(700);
    digitalWrite(ledRot, LOW);
    Serial.println("RFID-ID [" + newRfidId + "] fehlgeschlagen");
  }
  Serial.println();
}
void DistanceInfrarot() {
    Serial.println( hc.dist(1) );
    if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
      HTTPClient http;    //Declare object of class HTTPClient
      http.begin("http://202.61.207.122:8000/Sensordaten");  //Specify request destination
      http.addHeader("Content-Type", "application/json");  //Specify content-type header
      String Anwesenheitsdetektion = "{\"Wert\":\"" + String(hc.dist(5)) + "\",\"SensorID\":\"5\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
      int httpCode = http.POST(Anwesenheitsdetektion);//Send the request
      Serial.println(httpCode);//Print HTTP return code
      //Serial.println(payload); //Print request response payload
      http.end();  //Close connection
    }
  delay(60);
}
void TempInfraRot(){
  if (hc.dist(1) < 10 && (WiFi.status() == WL_CONNECTED)) { // Wenn ein Objekt (z.B. eine Tasse) in der Nähe ist //Check WiFi connection status
  float temp = mlx.readObjectTempC(); // Liest die Temperatur des Objekts
  Serial.print("Tasse erkannt!");
  Serial.print("Temperatur der Tasse: "); // Gibt einen Text aus
  Serial.print(temp); // Gibt die gemessene Temperatur aus
  Serial.println("°C"); // Gibt ein Gradzeichen aus
  HTTPClient http;    //Declare object of class HTTPClient
  http.begin("http://202.61.207.122:8000/Sensordaten");      //Specify request destination
  http.addHeader("Content-Type", "application/json");  //Specify content-type header
  String TempTasse = "{\"Wert\":\"" + String(temp) + "\",\"SensorID\":\"9\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";  //Get the response payload
  int httpCode = http.POST(TempTasse);   //Send the request
  Serial.println(httpCode);   //Print HTTP return code
  //Serial.println(payload);    //Print request response payload
  http.end();  //Close connection
  }
}
void printDistances() {
    Serial.println( hc.dist(1) );
    Serial.println( hc.dist(2) );
    Serial.println( hc.dist(3) );
    Serial.println( hc.dist(4) );
    if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
      HTTPClient http;    //Declare object of class HTTPClient
      http.begin("http://202.61.207.122:8000/Sensordaten");  //Specify request destination
      http.addHeader("Content-Type", "application/json");  //Specify content-type header
      String Cappuccino = "{\"Wert\":\"" + String(hc.dist(1)) + "\",\"SensorID\":\"1\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
      int httpCode1 = http.POST(Cappuccino);//Send the request
      Serial.println(httpCode1);//Print HTTP return code
      String CafeCrema = "{\"Wert\":\"" + String(hc.dist(2)) + "\",\"SensorID\":\"2\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
      int httpCode2 = http.POST(CafeCrema);//Send the request
      Serial.println(httpCode2);//Print HTTP return code
      String Espresso = "{\"Wert\":\"" + String(hc.dist(3)) + "\",\"SensorID\":\"3\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
      int httpCode3 = http.POST(Espresso);//Send the request
      Serial.println(httpCode3);//Print HTTP return code
      String Cafe2 = "{\"Wert\":\"" + String(hc.dist(4)) + "\",\"SensorID\":\"4\",\"EinheitenID\":\"3\",\"SessionID\":\"0\"}";//Get the response payload
      int httpCode4 = http.POST(Cafe2);//Send the request
      Serial.println(httpCode4);//Print HTTP return code
      //Serial.println(payload); //Print request response payload
      http.end();  //Close connection
    }
  delay(60);
}
void TempSens() {
  sensor.requestTemperatures();
  int tempC = sensor.getTempC();
  Serial.print("Temperatur ");
  Serial.print(String(tempC));
  Serial.print("°C");
  Serial.println();
  delay(2500);
  if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
    HTTPClient http;    //Declare object of class HTTPClient
    http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
    http.addHeader("Content-Type", "application/json"); //Specify content-type header
    String payload = "{\"Wert\":\"" + String(tempC) + "\",\"SensorID\":\"4\",\"EinheitenID\":\"3\",\"SessionID\":\"2\"}";//Get the response payload
    int httpCode = http.POST(payload); //Send the request
    Serial.println(httpCode); //Print HTTP return code
    //Serial.println(payload); //Print request response payload
    http.end();  //Close connection
  }
}
void Pumpe() {
  int sensorFeuchte = analogRead(SENSOR_PIN); // Liest den Feuchtesensor-Wert

  if (sensorFeuchte < MIN_VALUE) { // Wenn der Feuchtesensor-Wert unter dem Mindestwert liegt
    Serial.println("Feuchtigkeit: ");
    Serial.println(sensorFeuchte);
    digitalWrite(RELAY_PIN, HIGH); // Schaltet das Relais ein
    delay(2000); // Wartet 5 Sekunden
    digitalWrite(RELAY_PIN, LOW); // Schaltet das Relais aus
  }
  else{
    digitalWrite(RELAY_PIN, LOW);
    Serial.println("Feuchtigkeit: ");
    Serial.println(sensorFeuchte);
  }
    if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
    HTTPClient http;   //Declare object of class HTTPClient
    http.begin("http://202.61.207.122:8000/Sensordaten");  //Specify request destination
    http.addHeader("Content-Type", "application/json");  //Specify content-type header
    String Feuchtigkeit = "{\"Wert\":\"" + String(sensorFeuchte) + "\",\"SensorID\":\"7\",\"EinheitenID\":\"4\",\"SessionID\":\"0\"}";//Get the response payload
    int httpCode = http.POST(Feuchtigkeit);   //Send the request
    Serial.println(httpCode);  //Print HTTP return code
    //Serial.println(payload);  //Print request response payload
    http.end();  //Close connection
  }
  
  delay(500); //Verzögerung, um die Messfrequenz zu reduzieren
}
void RfidDB(){
    HTTPClient http;    //Declare object of class HTTPClient
    http.begin("http://202.61.207.122:8000/Sensordaten"); //Specify request destination
    http.addHeader("Content-Type", "application/json"); //Specify content-type header
    if (newRfidId.equals("C7 91 10 04")) {
      // Code für Option 1
        String verified = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"1\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
        int httpCodev1 = http.POST(verified); //Send the request
        Serial.println(httpCodev1); //Print HTTP return code
        //Serial.println(payload); //Print request response payload
        http.end();  //Close connection
    } else if (newRfidId.equals("DE 20 10 04")) {
        String verified1 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"2\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
        int httpCodev2 = http.POST(verified1); //Send the request
        Serial.println(httpCodev2); //Print HTTP return code
        //Serial.println(payload); //Print request response payload
        http.end();  //Close connection
      Serial.println("Option 2 ausgewählt");
    } else if (newRfidId.equals("B9 A4 0F 04")) {
        String verified2 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"3\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
        int httpCodev3 = http.POST(verified2); //Send the request
        Serial.println(httpCodev3); //Print HTTP return code
        //Serial.println(payload); //Print request response payload
        http.end();  //Close connection      
    } else if (newRfidId.equals("FE F0 10 04")) {
        String verified3 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"4\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
        int httpCodev4 = http.POST(verified3); //Send the request
        Serial.println(httpCodev4); //Print HTTP return code
        //Serial.println(payload); //Print request response payload
        http.end();  //Close connection
    } else if (newRfidId.equals("83 B9 4C 90")) {
        String verified4 = "{\"Wert\":\"" + String(newRfidId) + "\",\"SensorID\":\"6\",\"EinheitenID\":\"3\",\"SessionID\":\"5\"}";//Get the response payload //Einheiten? // Wie in der Datenbank ablegen?
        int httpCodev5 = http.POST(verified4); //Send the request
        Serial.println(httpCodev5); //Print HTTP return code
        http.end();  //Close connection
    } 
}

void TelegramMessage() {
  //RFID auslesen
  String input = newRfidId;

  // Timer zurücksetzen, wenn die ID 'DE 20 10 04' erkannt wird
  if (input == START_STRING) {
    //Reset Timer
    lastResetTime = millis();
    timerRunning = false;
    //Start Timer
    lastStartTime = millis();
    timerRunning = true;
  }

  // Timer auslösen, wenn er abgelaufen ist
  if (timerRunning && timerAlarmEnabled(0)) {
    if (millis() - lastStartTime >= RESET_INTERVAL_MS) {
      Serial.println("Timer abgelaufen!");
      //Reset Timer
      lastResetTime = millis();
      timerRunning = false;
      Serial.println("7 Tage sind vergangen!");
      // Telegram Nachricht senden
      String message = "Hol' dir einen Kaffe, bevor du einschläfst Peppe!";
      bot.sendMessage(CHAT_ID, message, "");
    }
  }
  // Polling-Intervall warten
  delay(POLL_INTERVAL_MS);
}

Er lässt sich kompilieren aber nicht auf den ESP32 hochladen.

Die Sensoren und Aktoren werden extern mit Spannung Versorgt.
Die Spannung wird von einem 24V DC 3A Netzteil auf jeweils 12V/5V/3,3V mit 3xLM2596S geregelt.

Folgender Error erscheint und das Projekt muss morgen Abend (16.05.2023) abgegeben werden.

Leider kenne ich mich gut genug aus, um mögliche Fehler zu lösen.

Vielen Dank im Voraus.

? Welcher?

Oh, Entschuldigung.
Hier der Fehler:
Sketch uses 942725 bytes (71%) of program storage space. Maximum is 1310720 bytes.
Global variables use 47508 bytes (14%) of dynamic memory, leaving 280172 bytes for local variables. Maximum is 327680 bytes.
esptool.py v4.5.1
Serial port /dev/cu.usbserial-0001
Connecting......................................

A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x1a)! The chip needs to be in download mode.
For troubleshooting steps visit: Troubleshooting - ESP32 - — esptool.py latest documentation
Failed uploading: uploading error: exit status 2

Dann mache das doch auch einfach

Nach Connecting Boot Taste betätigen

funktioniert auch nicht, ohne Bauteile funktioniert das Hochladen ganz normal...

OK dann Datenblatt in die Hand und schauen nach dienen Pis ob die müssen Low, oder High sein bei Upload.
Das selbe gilt auch für ESP8266, bei dem sind auch Pins was müssen bestimmten Level haben.
Schau mall hier

Dann Bauteil für Bauteil weglassen um festzustellen, welches Bauteil Probleme macht.

Habe den Fehler gefunden, es lag an einer Pinbelegung von TRIGGERN der Ultraschallsensoren!
Nun habe ich dieses Problem...

ets Jun@X�k�,�<P$aCs��Verbindung zum WLAN herstellen...
Erfolgreich mit dem WLAN verbunden!
IP-Adresse: 172.20.10.8
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x400dfc9b PS : 0x00060d30 A0 : 0x800d2fbd A1 : 0x3ffb2230
A2 : 0x00000000 A3 : 0x00000003 A4 : 0x000f4240 A5 : 0x00000000
A6 : 0x00000001 A7 : 0x00000001 A8 : 0x800deb21 A9 : 0x3ffb21f0
A10 : 0x00000000 A11 : 0x00000028 A12 : 0x00000000 A13 : 0x00001000
A14 : 0x00000028 A15 : 0x00000000 SAR : 0x00000007 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000001 LBEG : 0x40089d54 LEND : 0x40089d6a LCOUNT : 0xffffffff

Backtrace: 0x400dfc98:0x3ffb2230 0x400d2fba:0x3ffb2250 0x400e061e:0x3ffb2290

ELF file SHA256: 3a7429799bc27689

Rebooting...
ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1184
load:0x40078000,len:13220
ho 0 tail 12 room 4
load:0x40080400,len:3028
entry 0x400805e4

Installiere Dir den Exceptiondecoder in die IDE, um mehr Infos zu bekommen.

Gruß Tommy

Geht das auch für die neuste IDE?

Das kann ich Dir nicht sagen, ich verwende diese nicht.
Probiere es einfach aus.

Gruß Tommy

Das wird nun angezeigt, weitere Tipps?

Was steht denn in Zeile 131 bei Dir?

Gruß Tommy

Ich hab' meinen Notepad++ mal zählen lassen :wink:

  mfrc522.PCD_Init();

Du kannst in der IDE auch die Zeilennummern anzeigen lassen

Dan beißt sich der Reader mit dem ESP :wink:
Habe was gefunden, versuch mal den so anschließen wie dort gezeigt

Nicht jeder nutzt die IDE :wink:

Ich wurde, nach der Reiche den Sketch erweitern, nicht alles auf einmal, gerade bei ESP32 wo man auf Dies und Das achten muss, ist man öfters schneller als lästige Fehlersuche.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.