Projekt mit ESP32 Funktionen in verbindung mit Switch Case

Hallo Leute

Habe wider einmal ein Problem.

Ich programmiere gerade für meine Diplomarbeit. Es geht darum Trainingsdaten zu ermitteln und diese über ein LCD auszugeben.
Die Anmeldung am Trainingsgerät funktioniert über RFID.
Habe den RFID-TAgs einen Namen zugewiesen. Diese möchte ich mittels einer Funktion zurückgben lassen um den daraus enstehenden String im Case verwenden zu können. Des weiteren hab ich vor eine weitere Funktion zu schreiben für die Ausgabe mittels LCD.

die Funktion fürs einlesen des Tags:

String NameEinlesen(){
  
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
        //Serial.print("Gelesene UID:");
        
        Serial.print(timer);
        for (byte i = 0; i < mfrc522.uid.size; i++) {
         // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
          //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
          //Serial.print(mfrc522.uid.uidByte[i]);   
        } 
       //Serial.println(); 
       //lcd.clear();
       //lcd.backlight();
        //lcd.setCursor(0, 0);
        //lcd.print("Michael Eichberger");
       int cnt = 0;
       //String Name = "";
       
     
         for (byte i = 0; i < mfrc522.uid.size; i++){
           if(user[i] == mfrc522.uid.uidByte[i]){
           cnt++;
           
            Name = "Michael Eichberger";
            
           }
           if(user1[i] == mfrc522.uid.uidByte[i]){
            
           Name = "Thomas Gutschi";
           
          }
          }
          //Serial.println(cnt);
         //lcd.print(Name);
         


        // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
        mfrc522.PICC_HaltA();
        delay(1000);

        return (Name);
       
       }
}

habe hier vieles auskommentiert. Wenn ich nur das einlesen des Tags und das ausgeben des Namens versuche funktioniert es einwandfrei.

Nachfolgend ist mein gedanke zum Aufbau der Funktion NameAnzeigen und zur verwendung im Case.

void NameAnzeigen(String NAME){
  
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(Name);
}
case STATE_Wilkommenmodus:{

        String NAME;
        NAME = NameEinlesen();
        
        if (NAME == "Michael Eichberger"){
          NameAnzeign(NAME);
          timer = 1000;
        }
        timer --;
        if (timer = 0){
          state1 = STATE_Gewicht_auflegen;
        }
        
        
    
         
    
       break;

folgende libraries sind in verwendung:

#include <SPI.h>  
#include <MFRC522.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <HX711_ADC.h>
#if defined(ESP8266)|| defined(ESP32) || defined(AVR)
#include <EEPROM.h>
#endif

die Verwendete Variable welche als Rückgabewert dient ist noch vor dem void.setup definiert worden. Es sollte so sein das wen ich den RFID Tag zum RFID Reader halte sollte der Name der auf dem Tag hinterlegt ist am LCD zu sehen sein. Nach ablauf der Zeit sollte der Case gewechselt werden.

Bei mir ist es so das immer zyklisch eine Fehlermeldung im seriellen Monitor erscheint und der Name der ausgegeben wird immer nur ganz kurz am LCD aufscheint und sofort wider verschwindet.

Fehlercode

Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x4000c3f0 PS : 0x00060530 A0 : 0x800d3e6b A1 : 0x3ffb1f00
A2 : 0x3ffb1f74 A3 : 0x00004e20 A4 : 0x00000001 A5 : 0x3ffc0088
A6 : 0x00000000 A7 : 0x3ffb0060 A8 : 0x00000000 A9 : 0x00004e20
A10 : 0x00000003 A11 : 0x00000026 A12 : 0x3ffb1f1e A13 : 0x3ffb1f1d
A14 : 0x00000020 A15 : 0x3ffb0060 SAR : 0x0000001e EXCCAUSE: 0x0000001c
EXCVADDR: 0x00004e20 LBEG : 0x40002390 LEND : 0x4000239f LCOUNT : 0x00000000

ELF file SHA256: 0000000000000000

Backtrace: 0x4000c3f0:0x3ffb1f00 0x400d3e68:0x3ffb1f20 0x400d3f4e:0x3ffb1f40 0x400d1085:0x3ffb1f60 0x400d4099:0x3ffb1fb0 0x400869bd:0x3ffb1fd0

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

rst:0xc (SW_CPU_RESET),boot:0x17 (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:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4

Hoffe das mir hier geholfen wird. Und ich entschuldige mich schonmal für Rechtschreibfehler .
sitz schon ne weile am PC und bin nicht mehr so kozentriert.
viel dank im vorraus für eure hilfe.

Neu:
if (timer == 0){

In der Arduino Entwicklungsumgebung:
DATEI - VOREINSTELLUNGEN - Ausführliche Ausgabe während [x] Kompilierung.
Darunter Compiler-Warnungen: [ALLE]

Versuche es mal mit dem ESP Exception Decoder.

Kurze Anmerkung:
Dein Titel passt nicht zum Beitrag. Ich finde in deinem Sketch keine Verwendung von "Switch-Case". Nur ein case.

ich habe auch nicht alle Cases in dem Beitrag drin.

jetzt bekomm ich Probleme mit Teile des Codes die eigentlich funktioniert haben

zum Beispiel

byte user[] = {28,65,244,1400}; 
byte user1[] = {50,112,108,6700};

fertig_Diplomarbeit:21:30: error: narrowing conversion of '1400' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]
byte user[] = {28,65,244,1400};
^
fertig_Diplomarbeit:22:32: error: narrowing conversion of '6700' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]
byte user1[] = {50,112,108,6700};

Setze es bitte komplett in Code-Tags. Schaltfläche </> . So ist es nicht lesbar.

des weiteren bekomme ich diese Fehler

C:\Users\Acer\Desktop\fertig_Diplomarbeit\fertig_Diplomarbeit.ino: In function 'void loop()':
fertig_Diplomarbeit:134:27: error: 'NameAnzeign' was not declared in this scope
           NameAnzeign(NAME);
                           ^
C:\Users\Acer\Desktop\fertig_Diplomarbeit\fertig_Diplomarbeit.ino:118:7: warning: unused variable 'i_total' [-Wunused-variable]
   int i_total;
       ^
C:\Users\Acer\Desktop\fertig_Diplomarbeit\fertig_Diplomarbeit.ino:119:7: warning: unused variable 'aktTastenZustand' [-Wunused-variable]
   int aktTastenZustand = digitalRead(13); 
       ^
C:\Users\Acer\Desktop\fertig_Diplomarbeit\fertig_Diplomarbeit.ino: In function 'String NameEinlesen()':
fertig_Diplomarbeit:268:1: error: control reaches end of non-void function [-Werror=return-type]
 }
 ^
C:\Users\Acer\Desktop\fertig_Diplomarbeit\fertig_Diplomarbeit.ino: In function 'float gewichtMessen()':
fertig_Diplomarbeit:311:1: error: control reaches end of non-void function [-Werror=return-type]
 }

fertig_Diplomarbeit:21:30: error: narrowing conversion of '1400' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]
 byte user[] = {28,65,244,1400}; 
                              ^
fertig_Diplomarbeit:22:32: error: narrowing conversion of '6700' from 'int' to 'byte {aka unsigned char}' inside { } [-Wnarrowing]
 byte user1[] = {50,112,108,6700};

Ja,
die Ausgabe ist dann eine Folge daraus.
Da ist also weiter noch was kaputt.

Ohne vollständigen Code wird das schwer - mit jeder neuen Warnung/Fehlermeldung wirst Du wieder von vorn anfangen müssen.
Aber auch jeder der hier mit liest und sich deinem Problem annimmt.

Dann jetzt:
kompletten Code...

Tippe auf Tippfehler.

hier der Code
bin kein Profi und dementsprechend schaut auch der Code wild aus.
Formatierung ist quasi nicht vorhanden

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711_ADC.h>
#if defined(ESP8266)|| defined(ESP32) || defined(AVR)
#include <EEPROM.h>
#endif

//----------------------LCD--------------------//

LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 4 line display



//-----------------RFID-------------------------------//
#define RST_PIN   4     // SPI Reset Pin
#define SS_PIN    2    // SPI Slave Select Pin

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Instanz des MFRC522 erzeugen
uint16_t user[] = {28, 65, 244, 1400};
uint16_t user1[] = {50, 112, 108, 6700};
//byte
//----------------Weagezelle------------------//

int state = 1;
float i_right = 0;
float i_left = 0;
String Name = "";


//pins:
const int HX711_dout_right = 33; //mcu > HX711 dout pin
const int HX711_sck_right = 32; //mcu > HX711 sck pin
const int HX711_dout_left = 26; //mcu > HX711 dout pin
const int HX711_sck_left = 25; //mcu > HX711 sck pin

//HX711 constructor:
HX711_ADC LoadCell_right(HX711_dout_right, HX711_sck_right);
HX711_ADC LoadCell_left(HX711_dout_left, HX711_sck_left);

const int calVal_eepromAdress = 0;

unsigned long t = 0;


//-----------------Zeahler------------------------//
#define STATE_Wilkommenmodus 0
#define STATE_Gewicht_auflegen 1
#define STATE_Widerholungen 2
#define STATE_Satzzahl 3

int state1 = 0;        // state = Variable
int Timer;
int timer;              //timer für case
int Widerholungen = 0;
int lastTastenZustand = LOW;
int Satzzahl = 0;


unsigned long lastmillis = 0;
unsigned long letzteWiederholung = 0;
//----------------------------------------//

void setup()
{
  pinMode(13, INPUT);
  Serial.begin(115200);  // Serielle Kommunikation mit dem PC initialisieren
  SPI.begin();         // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();  // Initialisiere MFRC522 Lesemodul
  lcd.init();           //LDC initialisieren
  LoadCell_right.begin(); //Weagezelle rechts
  LoadCell_left.begin(); //Weagezelle links

  //---------------------Wägezelle-----------------------------//

  float calibrationValue_right;// calibration value (see example file "Calibration.ino")
  float calibrationValue_left;
  calibrationValue_right = -22.73; // uncomment this if you want to set the calibration value in the sketch
  calibrationValue_left = -21.57;
#if defined(ESP8266)|| defined(ESP32)
  //EEPROM.begin(512); // uncomment this if you use ESP8266/ESP32 and want to fetch the calibration value from eeprom
#endif
  //EEPROM.get(calVal_eepromAdress, calibrationValue); // uncomment this if you want to fetch the calibration value from eeprom

  unsigned long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
  boolean _tare = true; //set this to false if you don't want tare to be performed in the next step
  //  LoadCell.start(stabilizingtime, _tare);
  byte loadcell_right_rdy = 0;
  byte loadcell_left_rdy = 0;
  while ((loadcell_right_rdy + loadcell_left_rdy) < 2) { //run startup, stabilization and tare, both modules simultaniously
    if (!loadcell_right_rdy) loadcell_right_rdy = LoadCell_right.startMultiple(stabilizingtime, _tare);
    if (!loadcell_left_rdy) loadcell_left_rdy = LoadCell_left.startMultiple(stabilizingtime, _tare);
  }
  if (LoadCell_right.getTareTimeoutFlag()) {
    //Serial.println("Timeout, check MCU>HX711 no.1 wiring and pin designations");
  }
  if (LoadCell_left.getTareTimeoutFlag()) {
    // Serial.println("Timeout, check MCU>HX711 no.2 wiring and pin designations");
  }
  LoadCell_right.setCalFactor(calibrationValue_right); // user set calibration value (float)
  LoadCell_left.setCalFactor(calibrationValue_left); // user set calibration value (float)
  //Serial.println("Startup is complete");





  //lcd.clear();
  //lcd.backlight();


}


void loop() {

  int i_total;
  int aktTastenZustand = digitalRead(13);
  //String Name = "";



  //--------------------Switch_Case-------------//

  switch (state1) {

    case STATE_Wilkommenmodus: {

        String NAME;
        NAME = NameEinlesen();

        if (NAME == "Michael Eichberger") {
          NameAnzeigen(NAME);
          timer = 1000;
        }
        timer --;
        if (timer == 0) {
          state1 = STATE_Gewicht_auflegen;
        }





        break;
      }

    case STATE_Gewicht_auflegen:

      float gewicht;
      gewicht = gewichtMessen();
      gewichtAnzeigen(gewicht);
      if (gewicht > 25) {
        state = STATE_Widerholungen;
      }
      break;

    case STATE_Widerholungen: {

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("training...");

        int aktTastenZustand = digitalRead(13);

        if (aktTastenZustand == HIGH && lastTastenZustand == LOW) // bei bet�tigen des Tasters -> Z�hler +1
        {
          if (millis() - letzteWiederholung > 1000) {
            letzteWiederholung = millis();
            Widerholungen = Widerholungen + 1;
          }

        }

        if (millis() - lastmillis > 100) {
          lastmillis = millis();
          lcd.clear();
          lcd.backlight();
          lcd.setCursor(0, 0);
          lcd.print(Widerholungen);
          //Serial.print(Widerholungen);

        }


        lastTastenZustand = aktTastenZustand;



        break;
      }
  }
  delay(1);

}

//-----------------------Funktion Gewicht anzeigen-------------------------//

void gewichtAnzeigen(float gewicht) {

  lcd.clear();
  lcd.print("total: ");
  lcd.setCursor(10, 2);
  lcd.print((i_left / 1000) + (i_right / 1000));
  lcd.print(" kg");


}

//----------------------Funktion Name anzeigen----------------//


void NameAnzeigen(String NAME) {


  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(Name);
}

//--------------------------Funktion Name einlesen------------------------------//

String NameEinlesen() {

  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
    //Serial.print("Gelesene UID:");

    Serial.print(timer);
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      // Abstand zwischen HEX-Zahlen und führende Null bei Byte < 16
      //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      //Serial.print(mfrc522.uid.uidByte[i]);
    }
    //Serial.println();
    //lcd.clear();
    //lcd.backlight();
    //lcd.setCursor(0, 0);
    //lcd.print("Michael Eichberger");
    int cnt = 0;
    //String Name = "";


    for (byte i = 0; i < mfrc522.uid.size; i++) {
      if (user[i] == mfrc522.uid.uidByte[i]) {
        cnt++;

        Name = "Michael Eichberger";

      }
      if (user1[i] == mfrc522.uid.uidByte[i]) {

        Name = "Thomas Gutschi";

      }
    }
    //Serial.println(cnt);
    //lcd.print(Name);



    // Versetzt die gelesene Karte in einen Ruhemodus, um nach anderen Karten suchen zu können.
    mfrc522.PICC_HaltA();
    delay(1000);

    //return (Name);

  }
  return (Name);
}

//-------------------Funktion Gewicht messen----------------------------//

float gewichtMessen() {

  static boolean newDataReady = 0;
  const int serialPrintInterval = 1000; //increase value to slow down serial print activity

  // check for new data/start next conversion:
  if (LoadCell_right.update()) newDataReady = true;
  LoadCell_left.update();

  // get smoothed value from the dataset:
  if (newDataReady) {
    if (millis() > (t + serialPrintInterval)) {
      i_right = LoadCell_right.getData();
      i_left = LoadCell_left.getData();
      //Serial.print("Load_cell output val: ");
      //Serial.println(i_left);
      /*   lcd.clear();
         lcd.setCursor(0, 0);
         lcd.print("right: ");
         lcd.setCursor(10, 0);
         lcd.print(i_right/1000);
         lcd.print(" kg");
         lcd.setCursor(0,1);
         lcd.print("left: ");
         lcd.setCursor(10, 1);
         lcd.print(i_left/1000);
         lcd.print(" kg");
         lcd.setCursor(0,2);
         lcd.print("total: ");
         lcd.setCursor(10, 2);
         lcd.print((i_left/1000)+(i_right/1000));
         lcd.print(" kg");   */
      newDataReady = 0;
      t = millis();

      //return (i_left / 1000) + (i_right / 1000);
    }
  }
  return (i_left / 1000) + (i_right / 1000);
}

Das hier ist - vermutlich - ein Klammerfehler.
STRG-T! drücken

Hier passt der Datentyp nicht!

Siehe Post #11

hab ich gesehen den Tippfehler Danke

versteh nicht warum der Datentyp nicht passt. Versuch ich nur diesen Teil des Codes funktioniert es einwandfrei

Wie groß kann ein byte sein?
Vertipper? Soll das 140 sein?
Und Vorsicht:
Das zieht dann weiter:

0 bis 255

denke nicht das das ein Tipfehler ist. Das sind die ID`s von einem RFID Tag und einer RFID Karte

ich les die Tags nochmal aus um zu sehen ob das ein Tipfehler ist

Wenn es sich dabei um einen TAG handelt, der kann nicht negativ werden.
Der Rest auch nicht, dann solltest aus dem byte ein uint16_t machen.