Von Bool 0/1 zu String"ein/aus"

guten Tag Gemeinde nach längerer suche ohne Erfolg.
Frage Ich hier.

Ich bekomme ein Bool 0 oder eins von einer Funktion
und möchte Serial "ein" oder "aus" ausgeben.
mit der if funktion kein problem

Jedoch sind es fast 40 Einträge mit jeweils if elses wird das echt lang

geht das auch einfacher das ich im serielen print 0 71 durch Ein Aus ersetzen kann .

result = 0;
  result = wpBergfeld.readCoils(22, 1);
  if (result == wpBergfeld.ku8MBSuccess) {
    Serial.print("Tank Heizung Status: ");
    bool weather_Depend = wpBergfeld.getResponseBuffer(0);
    if (weather_Depend) {
      Serial.println("Eingeschaltet");
    } else {
      Serial.println("Ausgeschaltet");
    }
  } else {
    Serial.print("Error Reading Bit 22");
    Serial.println(result);

kann ich
#define 0 ="Aus";
#define 1 ="Ein";

Serial.print("Tank Heizung Status: ");
Serial.println(weather_Depend);
so dass das bool eine string ausgibt !
oder brauch ich da eine funktion die mir Ein aus zurückgibt ?

String getEA(bool retbit){
if (retbit){ return "ein"}
else{ return "aus"
}

DANKE

Eine Funktion kannst Du flexibler verwenden. Ich würde aber nicht die Klasse String benutzen, sondern besser char *.


char * getEA(bool in) {
  constexpr char* E {"Ein"};
  constexpr char* A {"Aus"};

  if (in) return E;
  return A; 
}

void setup() {
  Serial.begin(115200);
  Serial.println("\nStart");
  Serial.println(getEA(0));
  Serial.println(getEA(1));
}
void loop() {}

Gruß Tommy

1 Like

Welcher µC?

Bei einem AVR eventuell PROGMEM verwenden.

const char * getEA(bool in) {

Gegebenenfalls können Sie auch inline und F() hinzufügen.

inline const __FlashStringHelper* getEA(bool in) {
  return in ? F("Ein") : F("Aus");
}
1 Like

Hallo,
die Lösung von Tommy ist doch super. Wenn du die noch zu ende denkst könnte das bei Dir so aussehen.

    bool weather_Depend = wpBergfeld.getResponseBuffer(0);`
    Serial.println(getEA(weather_Depend));

Die von @J-M-L ist noch einen Tick superer ;-)
falls im Sketch noch andere PROGMEM-Texte vorkommen.

Die Lösung von @J-M-L mit dem F-Makro gefällt mir auch sehr gut.

Gruß Tommy

Ich würde nochmal 2 Schritte zurück treten und mir überlegen ob man das auch generischer lösen kann. Eventuell dann auch mit Arrays und Schleifen.

Wo kommen die Daten her?
Was für Daten hast du da?

Hallo,
stimmt schon. Der T0 scheint Anfänger zu sein , da ging es mir darum zu zeigen das er die bool Variable direkt an die function übergeben kann

Gruß Heinz

Danke

#define ist häßlich, und wurde in C gebraucht, als es noch kein C++ gab.

Aber du könntest es auch mit #define einigermaßen realisieren:

#define A "Aus"
#define E "Ein"
#define EA(x) x?(E):(A)
void setup() {
  bool weather_Depend = true;
  Serial.begin(9600);
  Serial.println(EA(weather_Depend));
}

In C++ wurde der Hinweis inline erfunden, um dem Compiler den Tip zu geben, dass es zwar wie eine Funktion aussieht, es aber evtl. besser ist, das ohne Funktionsaufruf zu realisieren.

Mit dem #define sieht es übrigens auch wie eine Funktion aus.

wie es die gezeigten Vorschläge schon gezeigt haben, solltest du auf kleinen AVR Microcontrollern für die Serielle Ausgabe von Fixtexten das F-Makro verwenden.

  Serial.print(F("Error Reading Bit 22"));

abgesehen davon, dass es sehr wahrscheinlich nicht Bit 22 ist, sondern die Adresse/Register.

wenn du dir das Ergebnis in HEX ausgibst, dann hast du genau den Fehler in der Darstellung, wie es auch in der ModbusMaster lLibrary definiert ist, und z.B. echte massive Fehler scheinen dann als E0, E1, E2 auf ...

Serial.println(result, HEX);