Stazione Meteo: possibile che il programma sia diventato troppo grande?

Salve a tutti,
nello sviluppo di un programma per il controllo di una stazione meteo forse mi sono allargato troppo.
Sto usando un 328P Arduino ProMini e alla fine della compilazione la situazione è la seguente:


Program StazMeteo_002 size: 27.148 bytes (used 84% of a 32.256 byte maximum) (5,55 secs)
Minimum Memory Usage: 1384 bytes (68% of a 2048 byte maximum)


Durante un normalissimo ciclo for per il controllo di un array si blocca.
Queste sono le librerie che utilizzo:

#include <RH_RF95.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <Wire.h>
#include <EEPROM.h>
#include <Adafruit_BMP280.h>
#include <SHT1x.h>
#include <SparkFun_SCD30_Arduino_Library.h>

Come posso verificare se effettivamente ho superato le possibilità del microcontrollore?

Grazie a tutti

Ti faccio la solita domanda ... fai uso della classe String nel tuo programma?

Guglielmo

Verifica di non aver sforato con i dati di qualche array rispetto alle dimensioni dichiarate. Considera che il primo elemento ha indice 0, perciò int pippo[10] va da pippo[0] a pippo[9].

Ciao Guglielmo, ti devo dire che non ho utilizzato nessuna variabile String(), solo array di char.
Questa volta per preparare una stringa Json contenente delle variabili float ho utilizzato la funzione dtostrf() che non avevo mai utilizzato, dovendo utilizzare tutti quei piccoli array str1, str2, ...
Forse dovrei mettere i dati numerici localmente nelle varie function che li creano e globalmente le stringhe di char che poi unisco nella function CreaJson() in questo modo i piccoli array str1, str2, ... vengono creati e cancellati all'interno di ogni funzione.

void CreaJson() {
    uint8_t LenNew = 0;
    char str1[10]{}, str2[10]{}, str3[10]{}, str4[10]{}, str5[10]{}, str6[10]{}, str7[10]{}, str8[10]{}, str9[10]{};
    char LocTrasm[MaxDati] = { 0 };
    char DataStrut[] = "\"RSI\":%i,\"ID\":%u,\"N\":%u,\"BT\":%s,\"TA\":%s,\"TC2\":%s,\"UM\":%s,\"RS\":%s,\"PA\":%s,\"VEL\":%s,\"DIR\":%s,\"MP\":%s,\"CO\":%d}}";
    sprintf(LocTrasm, DataStrut, RssiRilev, StruCli.CodCli, StruNodo.Nodino, dtostrf(BatteRilev, 4, 2, str1), 
            dtostrf(Temp3Rilev, 7, 2, str2), dtostrf(Temp2Rilev, 7, 2, str3), dtostrf(UmiRilev, 7, 2, str4), 
            dtostrf(IrragRilev, 7, 2, str5), dtostrf(PressRilev, 7, 2, str6), dtostrf(VeloRilev, 7, 2, str7), 
            dtostrf(DirezRilev, 7, 2, str8), dtostrf(PioggiaRilev, 7, 2, str9), CO2Rilev);
    LenNew = strlen(LocTrasm);
    Serial.print(LocTrasm);
    Serial.println(LenNew);
 
    int j = 0;
    for (j = 0; j < MaxDati; j++) DatiTras[j] = '\0';
    j = 0;
    for (int i = 0; i < LenNew; i++) {
        if (LocTrasm[i] != ' ') {
            DatiTras[j++] = LocTrasm[i];
 //           Serial.println(i);
        }
    }
    
    Serial.println(strlen(DatiTras));
    delay(200);
}

Così com'è si blocca mentre la Serial.println(i) mi informa a che punto è senza neppure concludere il valore numerico.
Grazie a tutti

Carissime/i.
Dato che la funzione sprintf() su Arduino non gestisce i float, ho modificato la funzione incriminata, quella che dopo tutti i rilievi dei vari sensori, crea la stringa Json da trasmettere.
Adesso ogni funzione di rilevamento invece di mettere a disposizione il valore numerico rilevato, trasforma il valore in una char sDatoRilev[10] globale.
Quindi la funzione si è molto alleggerita

void CreaJson() {
    uint8_t LenNew = 0;
    char sPioggiaRilev[10] = { 0 };
    char LocTrasm[MaxDati] = { 0 };
    char DataStrut[] = "\"RSI\":%i,\"ID\":%u,\"N\":%u,\"BT\":%s,\"TA\":%s,\"TC2\":%s,\"UM\":%s,\"RS\":%s,\"PA\":%s,\"VEL\":%s,\"DIR\":%s,\"MP\":%s,\"CO\":%d}}";
    dtostrf(PioggiaRilev, 7, 2, sPioggiaRilev);

    sprintf(LocTrasm, DataStrut, RssiRilev, StruCli.CodCli, StruNodo.Nodino, sBatteRilev, sTemp3Rilev, 
        sTemp2Rilev, sUmiRilev, sIrragRilev, sPressRilev, sVeloRilev, sDirezRilev, sPioggiaRilev, CO2Rilev);
    LenNew = strlen(LocTrasm);
    Serial.print(LocTrasm);
    Serial.println(LenNew);

    int j = 0;
    for (int i = 0; i < LenNew; i++) {
        if (LocTrasm[i] == '\0'){
            DatiTras[j++] = '\0';
            break;
        }
        if (LocTrasm[i] != ' ') {
            DatiTras[j++] = LocTrasm[i];
            Serial.print(LocTrasm[i]);                            // <--- Si blocca qui
        }
    }

    Serial.println(strlen(DatiTras));                            // quì non ci arriva mai
}

che da' come output di controllo su seriale due stringhe, la prima con i caratteri spazio e la seconda è la stessa privata dei caratteri spazio:

"RSI":0,"ID":123,"N":255,"BT": 6.52,"TA": -40.00,"TC2":-127.00,"UM":  -4.65,"RS": 716.18,"PA":-127.00,"VEL":  39.86,"DIR": 406.33,"MP":   0.00,"CO":-127}}154
"RSI":0,"ID":123,"N":255,"BT":6.52,"TA":-40.00,"TC2":-127.00,"UM":-4.65,"RS":716.18,"

putroppo si blocca in questo loop e non capisco perché.

Qualunque aiuto è ben accetto
Grazie mille
Claudio

crc57:
putroppo si blocca in questo loop e non capisco perché.

.....

il che non è nemmeno detto, potrebbe benissimo bloccarsi dopo, ma comunque "prima" che la seriale faccia effettivamente la trasmissione, visto che è "asincrona"

metti un Serial.flush() subito dopo la Serial.print(LocTrasm[ i ])
(notare come ho abilmente evitato il problema del cambio di polizza)

Avevi raggione Standardoil, completa tutto il ciclo for correttamente e completa anche la funzione.

"RSI":0,"ID":123,"N":255,"BT": 6.52,"TA": -40.00,"TC2":-127.00,"UM":  -4.65,"RS": 713.41,"PA":-127.00,"VEL":  39.67,"DIR": 404.92,"MP":   0.00,"CO":-127}}154
"RSI":0,"ID":123,"N":255,"BT":6.52,"TA":-40.00,"TC2":-127.00,"UM":-4.65,"RS":713.41,"PA":-127.00,"VEL":39.67,"DIR":404.92,"MP":0.00,"CO":-127}}143

adesso vado oltre, alla ricerca del baco nascosto.
Ho imparato comunque che non bisogna fidarsi ciecamente della funzione Serial.print()

Grazie

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.