Problemi compilazione

Buon Pomeriggio a tutti, vi spiego brevemente il mio programma. Il mio obiettivo e quello di andare a leggere tramite l’RS485 il Real Time Clock del mio impianto. Ho scritto il programma e secondo il mio ragionamento dovrebbe funzionare, ho dei problemi con la dichiarazione del mese, io uso un CHAR solo che quando vado a compilare mi dice che ho inserito troppi valori ( sono solo i 12 mesi), ho pensato di usare una String ma dopo non e’ piu compatibile col mio programma, qualcuno può aiutarmi? Non riesco a capire dove sbaglio, vi lascio il programma cosi chiunque abbia voglia può dargli un’occhiata:

#include <ModbusMaster.h>

ModbusMaster node;

void setup() {

  Serial.begin(19200);
  node.begin(1, Serial);


}

void loop() {
  uint8_t resultMain;
  uint16_t data[3];
  uint8_t j, result;
  String Mois[]={"Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"};
  char * pMois;
  resultMain = node.readHoldingRegisters(0x13, 3);
  if(resultMain == node.ku8MBSuccess)
  {
    for (j = 0; j < 3; j++)
    {
      data[j] = node.getResponseBuffer(j);
    }
    Serial.println("Valeurs brutes: 0x%h,0x%h, 0x%h",data[0],data[1],data[2]);
    pMois = Mois[data[2]&0xff];
    

    Serial.println("=================================");
    Serial.println("Real time clock ");
    
    Serial.println("%d %s 20%d, %d:%d:%d",data[1]>>8,pMois,data[2]>>8,data[1]&0xff,data[0]>>8,data[0]&0xff);
  }
  delay(10000);
}

Facendo cosi posso utilizzare l’orario per far accendere e spegnere il mio impianto…
Buona serata a tutti, in attesa di qualche aiuto… :slight_smile:

Facci vedere anche la versione con i char (che ti dà errore), così ti possiamo dire meglio

Allora questo e il codice:

#include <ModbusMaster.h>

ModbusMaster node;

void setup() {

  Serial.begin(19200);
  node.begin(1, Serial);


}

void loop() {
  uint8_t resultMain;
  uint16_t data[3];
  uint8_t j, result;
  char Mois[]={"Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"};
  char * pMois;
  resultMain = node.readHoldingRegisters(0x13, 3);
  if(resultMain == node.ku8MBSuccess)
  {
    for (j = 0; j < 3; j++)
    {
      data[j] = node.getResponseBuffer(j);
    }
    pMois = Mois[data[2]&0xff];
    

    Serial.println("=================================");
    Serial.println("Real time clock ");
    
    Serial.println("%d %s 20%d, %d:%d:%d",data[1]>>8,pMois,data[2]>>8,data[1]&0xff,data[0]>>8,data[0]&0xff);
  }
  delay(10000);
}

E questi sono gli errori che escono, penso che se provi a compilarlo anche te ti esce la stessa cosa:

String Mois[]={"Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"};

too many initializers for ‘char ’ , se sostituisco char con string funziona ma poi ho altri errori tipo:
cannot convert ‘String’ to ‘char*’ in assignment dove ho scritto pMois

metto le doppie barre(//) per saltare quel passaggio e mi esce:

Serial.println("%d %s 20%d, %d:%d:%d",data[1]>>8,pMois,data[2]>>8,data[1]&0xff,data[0]>>8,data[0]&0xff);

no matching function for call to ‘HardwareSerial::println(const char [21], uint16_t, char*&, uint16_t, uint16_t, uint16_t, uint16_t)’

Non capisco in teoria dovrebbero essere giusti i formati… hai visto qualche problema?

Spero di essere stato chiaro, in ogni caso posso rispondere ad eventuali domande…

char *Mois[]={"Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"};

Ho solo aggiunto un asterisco, prova.

Ciao.

Grazie mille Maurotec per l'interessamento, ho aggiunto l'asterisco e il problema del char sembra risolto ora ho questo messaggio di errore a questa riga:

Serial.println("%d %s 20%d, %d:%d:%d",data[1]>>8,pMois,data[2]>>8,data[1]&0xff,data[0]>>8,data[0]&0xff);

errore:

no matching function for call to 'HardwareSerial::println(const char [21], uint16_t, char*&, uint16_t, uint16_t, uint16_t, uint16_t)'

Sembra che non gli piaccia il formato che uso, io non so... notate qualcosa di sbagliato?

Ciao e buona serata

Non mi risulta che la println() possa formattare i dati come con printf.
Devi stampare con print() che a fine stampa non inserisce ritorno carrello, se vuoi un ritorno carrello usa println() senza argomento.

https://www.arduino.cc/en/Serial/Println

Ciao.

Mozzini97:
Grazie mille Maurotec per l'interessamento, ho aggiunto l'asterisco e il problema del char sembra risolto

Volevo anche spiegarti perché. Se tu definisci:

char Mois

è equivalente a:

char *Mois;

ossia stai definendo un array di char (formalmente un puntatore a char, "char *") ossia UNA stringa, non un array di stringhe. Per definire un array di stringhe devi fare come ti ha indicato Maurotec:

char *Mois

ossia Mois è così un array (le quadre) di puntatori a char (char *). Poiché tu vuoi definire 12 stringhe, io al posto tuo avrei scritto così (come vedi sono due quadre, un array bidimensionale ossia 12 puntatori a stringa):

char Mois[][12] ={"Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"};

(che equivale a "char *Mois[12]").

ora ho questo messaggio di errore a questa riga:

Serial.println("%d %s 20%d, %d:%d:%d",data[1]>>8,pMois,data[2]>>8,data[1]&0xff,data[0]>>8,data[0]&0xff);

Quando ci sono cose di questo tipo, dovresti sempre per prima cosa consultare il reference della funzione che stai usando, vedresti che la println() non prevede formattazioni ma solamente un valore oppure valore e formato (inteso però come base del numero, es. print(16,HEX) stampa 16 in esadecimale quindi "10").

Devi prima formattare con sprintf() scrivendo dentro ad una variabile di appoggio di tipo stringa ("char") e poi con println() (o print) stampi il risultato sulla seriale.