Problema con funzioni custom e main loop

Buongiorno a tutti,
sto realizzando una sveglia. Ho un problema con una funzione che ho scritto che dovrebbe occuparsi di accendere la luce del display alla pressione di un tasto.
La prima esecuzione va bene (premo il tasto, si accende la luce) alla seconda pressione, dovrebbe spegnersi ma per qualche motivo, debuggando col serial monitor, vedo che non sta più girando nel main loop.
Ecco lo script.
La funzione che invoco è switchDisplayBackground

//Include library for LCD
#include <LiquidCrystal.h>

//ARDUINO PINS
//Specify LCD pins
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
//snooze button pin
const int snoozeButtonPin = 6;
//pin in which connect the alarm set switch
const int alarmSwitchPin = 10;
//LCD background light pin
const int lcdBackgroundPin = 9;
//Alarm Buzzer pin
const int buzzerPin = 13;
//END OF ARDUINO PINS CONFIGURATION

int backGroundDisplayTimeOn;
String backgroundDisplayStatus = "off";

void setup() {
// for debug purposes activate serial monitor
Serial.begin (9600);
//set the LCD with 16 columns and 2 rows
lcd.begin (16,2);
// pin mode configuration
pinMode (snoozeButtonPin, INPUT);
pinMode (alarmSwitchPin, INPUT);
pinMode (lcdBackgroundPin, OUTPUT);
pinMode (buzzerPin, OUTPUT);

}

// CUSTOM FUNCTIONS //

//get current time
String getCurrentTime(){
  return ("10:30");
  }

//get the alarm time 
String getAlarmTime(){
  return ("10:33");
  }

//check if the snoozeButton is pressed reading the port status
bool getSnoozeButtonStatus(){
  if (digitalRead(snoozeButtonPin) == HIGH){
      return true;
    } else {
      return false;
      }
  }

// get the status of the alarm switch
bool getAlarmSwitchStatus(){
  if (digitalRead(alarmSwitchPin) == HIGH){
      return true;
    } else {
      return false;
      }
  }
  
String switchDisplayBackground(String newStatus){
  if (newStatus == "on"){
    digitalWrite(lcdBackgroundPin, HIGH);
    backgroundDisplayStatus = "on";
    } else if (newStatus == "off"){
    digitalWrite(lcdBackgroundPin, LOW);
    backgroundDisplayStatus = "off";
      }
  }

// END OF CUSTOM FUNCTIONS //


void loop() {
// Print time and alarm set
lcd.display();
lcd.setCursor(0,0);
lcd.print(getCurrentTime());
lcd.setCursor(10,0);
lcd.print(getAlarmTime());
if (getAlarmSwitchStatus() == true){
  lcd.setCursor(9,0);
  lcd.print(">");
  lcd.setCursor(15,0);
  lcd.print("<");
  }
// end of print time and alarm set

//if the snooze button is pressed, turn the LCD background on
if (getSnoozeButtonStatus() == true ){
  if (backgroundDisplayStatus == "on"){
      switchDisplayBackground("off");
    } 
   if (backgroundDisplayStatus == "off"){
      switchDisplayBackground("on");
   }
  }
Serial.println("looping");

  delay(200);
  lcd.clear();
}

Risolto. era il casting della funzione switchDisplayBackground prima dichiarato come "string" e ora come "unsigned".
Funziona. ma qualcuno sa dirmi perché?

In che senso? non ti stampa più "looping"?
Nel loop non vedo cose particolari che possano intrappolare l'esecuzione, poi verifico meglio.
Comunque, ad un certo punto scrivi:

if (backgroundDisplayStatus == "on"){
      switchDisplayBackground("off");
    }
   if (backgroundDisplayStatus == "off"){
      switchDisplayBackground("on");
   }

se il valore è "on", lo metti a "off" ma poi testi subito per "off" e lo rimetti a "on".

dovresti correggere in

if (backgroundDisplayStatus == "on"){
  switchDisplayBackground("off");
} else if (backgroundDisplayStatus == "off"){
  switchDisplayBackground("on");
}

in modo che questa parte non venga eseguita se viene eseguita quella precedente.

Maurizio

Edit: non sono riuscito a colorare la modifica per renderla evidente, comunque ho aggiunto "else" per avere else if
Non spiego ulteriormente perchè vedo che l'hai già usata altrove, quindi mi sa che è stata solo una svista.

Hai ragione!
Gli errori che hai evidenziato li ho trovati anche io e corretti. Eppure non stampava più "looping" alla seconda pressione del tasto.
Questo fino a quando non ho modificato il casting della funzione da "String" a "Unsigned".
Boh!

Strano, perchè dobrebbe mai uscire dal loop.
Comunque, senza vedere bene cosa accadeva difficile capire l'esatto motivo.
Comunque, se hai risolto, meglio così.
Un errore di cast è comunque un errore che va corretto, quindi anche se non si spiega alla perfezione il comportamento rilevato va comunque bene.

Ho visto che hai usato la classe String anche in altri posti, ti consiglierei di debellarla del tutto, sostituendola con array di char, cioè le stringhe del C classiche, perchè alla lunga può dare problemi di frammentazione della memoria e conseguente crash del programma.
Costa poco fare le stesse cose con gli array di char e si è sicuri di non avere questo tipo di problema.

Maurizio

maubarzi:
Ho visto che hai usato la classe String anche in altri posti, ti consiglierei di debellarla del tutto, sostituendola con array di char, cioè le stringhe del C classiche, perchè alla lunga può dare problemi di frammentazione della memoria e conseguente crash del programma.
Costa poco fare le stesse cose con gli array di char e si è sicuri di non avere questo tipo di problema.

Maurizio

ok grazie

return ("10:30");

Ma return puó rendere una stringa?

Ciao Uwe