comparare stringa [SOLVED]

salve a tutti
mi sono incartato in questa funzione, non riesco a comparare la char timeString[9] ad un orario prefissato per eseguire le istruzioni nella if

void timer() {
  time_t t = now();
  char timeString[9];
  snprintf(timeString, sizeof(timeString), "%02d:%02d:%02d", hour(t), minute(t), second(t));
  
  if (timeString[9] == ("19:05:10")) {   
    printNextionCommand("dim=" + String(20));
    printNextionCommand("page 1");
  }
}

grazie per l’aiuto
Davide

ho provato anche questa, trovata sul forum, ma no funziona

void timer() {
  time_t t = now();
  char timeString[9];
  char timer1[9] = "19:51:30";
  //int timer1;
  snprintf(timeString, sizeof(timeString), "%02d:%02d:%02d", hour(t), minute(t), second(t));
  //int timer1;
  if (strncmp(timeString, timer1) ==0){   
    printNextionCommand("dim=" + String(20));
    printNextionCommand("page 1");
  }
}

Bisogna vedere che libreria usi, e se le funzioni si usano come fai nel codice “di solito ci vuole un oggetto.metodo”.

Comunque il secondo confronto va modificato…

strncpm() specifichi un numero di caratteri da confrontare, se vuoi confrontare tutta la stringa si usa strcmp().

if (strcmp(timeString, timer1) ==0){  // strcmp al posto di strncmp 
    printNextionCommand("dim=" + String(20));
    printNextionCommand("page 1");
  }
}

adesso funziona, grazie...mi vado a studiare la reference :)

Cencio: adesso funziona, grazie...mi vado a studiare la reference :)

Bene, ma levami una curiosità: perché usavi strncmp() e snprintf() ?

La dimensione di timeString la sai perché la imposti tu (9), in ogni caso il formato lo dai tu, sai già che sono 8 caratteri (più \0), a che serve? Ossia:

 // snprintf(timeString, sizeof(timeString), "%02d:%02d:%02d", hour(t), minute(t), second(t));
 sprintf(timeString, "%02d:%02d:%02d", hour(t), minute(t), second(t));

Per strncmp() poi tu scrivi: *if (strncmp(timeString, timer1) ==0){ * ma la strncmp, visto che deve confrontare solo un certo numero di caratteri, dovrebbe avere tre parametri, con il terzo corrispondente al numero di caratteri da confrontare. Per cui non capisco come facesse a compilartelo (ma compilava?), e comunque se vuoi confrontare TUTTI i caratteri basta usare la normalissima strcpy():

 if (strcmp(timeString, timer1) ==0){

Per cui non solo non capisco come facesse a compilare prima, ma non ho capito il tuo "adesso funziona": cosa altro hai cambiato per farlo funzionare?

docdoc: Bene, ma levami una curiosità: perché usavi strncmp() e snprintf() ?

lo avevo letto cercando su google

La dimensione di timeString la sai perché la imposti tu (9), in ogni caso il formato lo dai tu, sai già che sono 8 caratteri (più \0), a che serve? Ossia:

 // snprintf(timeString, sizeof(timeString), "%02d:%02d:%02d", hour(t), minute(t), second(t));
 sprintf(timeString, "%02d:%02d:%02d", hour(t), minute(t), second(t));

Per strncmp() poi tu scrivi: *if (strncmp(timeString, timer1) ==0){ * ma la strncmp, visto che deve confrontare solo un certo numero di caratteri, dovrebbe avere tre parametri, con il terzo corrispondente al numero di caratteri da confrontare. Per cui non capisco come facesse a compilartelo (ma compilava?), e comunque se vuoi confrontare TUTTI i caratteri basta usare la normalissima strcpy():

 if (strcmp(timeString, timer1) ==0){

Per cui non solo non capisco come facesse a compilare prima, ma non ho capito il tuo "adesso funziona": cosa altro hai cambiato per farlo funzionare?

Per cui non solo non capisco come facesse a compilare prima, ma non ho capito il tuo “adesso funziona”: cosa altro hai cambiato per farlo funzionare?
[/quote]

ho risolto cosi:

void timer_display() { // abbassa/alza luminosita' display ad orari prefissati
 string_orario = String (timeClient.getFormattedTime());
 string_displayOFF = String ("23:00:00");
 string_displayON = String ("07:00:00");
 //Serial.println(string_orario);
 if ( string_displayOFF. equals ( string_orario ) ) {
   myNextion.sendCommand("dims=10");
 }
 if ( string_displayON. equals ( string_orario ) ) {
   myNextion.sendCommand("dims=100");
 }
}

Per cui non solo non capisco come facesse a compilare prima, ma non ho capito il tuo "adesso funziona": cosa altro hai cambiato per farlo funzionare? [/quote]

ho risolto cosi:

void timer_display() { // abbassa/alza luminosita' display ad orari prefissati string_orario = String (timeClient.getFormattedTime()); string_displayOFF = String ("23:00:00"); string_displayON = String ("07:00:00"); //Serial.println(string_orario); if ( string_displayOFF. equals ( string_orario ) ) { myNextion.sendCommand("dims=10"); } if ( string_displayON. equals ( string_orario ) ) { myNextion.sendCommand("dims=100"); } }

Adesso pero’ ho un altro problema, il display Nextion si blocca in maniera random, mentre da OpenHab via MQTT tutto ok.
Alla pressione, si deve attendere una quindicina di secondi poi funziona di nuovo, credo dipenda dalla seriale ma non capisco come e perche’, allego lo sketch
grazie in anticipo per i suggerimenti

termostato.ino (29.5 KB)

termostato.ino (29.5 KB)