richiesta aiuto su matrice

Salve ragazzi..

ho un problema che non riesco a risolvere.
ho delle matrici di dati di questo tipo:

int gradi2[ 12 ]  = {90, 83, 75, 67, 61, 54, 47, 42, 36, 31, 26, 23 };
int gradi3[ 12 ]  = {90, 83, 76, 69, 63, 56, 49, 44, 39, 34, 29, 26 };

e con una sonda di temperatura leggo la stessa e devo concatenare "gradi" con la temperatura rilevata, con un'altra sonda e vari calcoli riesco ad estrapolare il valore dell'indice della tabella da leggere,
per esempio devo leggere in gradi3 la quinta cifra per poi riportarla su un display lcd.

le ho provate tutte, sia con sprintf che con il concatenamento stringhe.

riporto di seguito una procedura:

int t0=24;
String titti="gradi";
String sommastringa= titti+t0;



for (int difftemp=0 ;difftemp<12;difftemp ++)
{  
 
int umrelativa= sommastringa[difftemp];
delay (1000);


lcd.setCursor(5,0);
lcd.print(umrelativa);  
lcd.setCursor(5,1);
lcd.print(sommastringa);  
lcd.setCursor(5,2);
lcd.print(difftemp); 
lcd.setCursor(5,3);

sul display leggo:
alla prima riga leggo il valore di umrelativa ,ma è sballato ,mi da 103,114,974,100,105,505,525,025,025,025,025,025
sulla seconda linea leggo gradi24

se nella riga int umrelativa= sommastringa[difftemp]; sostituisco sommastringa con gradi2 mi da i valori
corretti della matrice punto per punto.

qualcuno puo' aiutarmi.
ringrazio in anticipo.

Buongiorno,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,

Guglielmo

mi scuso di non essermi presentato, e di non aver editato il messaggio in modo corretto.
sono nuovo del forum, imparerò .

buona giornata

Stai facendo uno psicrometro, vero?

Posta tutto il codice

Comunque non serve passare per un oggetto stringa

Una matrice 2 dimensioni, temperatura a bulbo umido una dimensione
Differenza di temperatura l'altra

Ma dato che ci sei, hai pensato a usate le formule invece che tabelle?

microtek:
mi scuso di non essermi presentato, e di non aver editato il messaggio in modo corretto.

... nessun problema, però ...

  1. edita il messaggio come ti ho spiegato nella seconda parte del mio post #1

  2. prova a spiegare meglio cosa devi fare, perché, a parte concatenare la parola "gradi" con il valore numerico dei gradi, della seconda parte ... non è che io abbia capito molto cosa vorresti ottenere ... ::slight_smile:

Guglielmo

in effetti lo psicrometro c'è, l'ho costruito con materiali di fortuna trovati in officina,ma in realtà il progetto è fare un deumidificatore con sola macchina esterna 12000 btu e tre split recuperati.

la parte hardware è estremamente semplice ed l'ho già montata.

uso le tabelle psicrometriche perchè se dovessi fare calcoli, avrei bisogno di sonde di pressione.
dovrei tararle con punti di riferimento abbastanza difficili da reperire ed interpretare.
dovrei calcolare la massa di aria secca nell'ambiente sotto esame, massa di aria che cambia a seconda della pressione e di tutti gli oggetti che vengono immessi o tolti dall'ambiente,
la miscelazione adiabatica, e qualche altro parametro.
molto più semplice usare le tabelle psicrometriche che sono affidabili al 100x100.
per quanto riguarda tutto il listato del programma ,ho intenzione di pubblicarlo insieme agli schemi elettrici quando il lavoro sarà terminato. adesso è in fase di sviluppo e non è attendibile ,almeno non prima di aver provato il tutto e di aver verificato i valori ottenuti dagli strumenti in relazione ai dati di soglia inseriti.

per questo ho scelto le tabelle psicrometriche,sono molto piu' facili e sono estremamente attendibili.

comunque il mio problema lo posso risolvere con swich case oppure con if.....else ma questi procedimenti sono molto lunghi e vorrei farlo in modo diverso.

Mi spiace sempre dover diventare antipatico :confused: , ma ...

... o editi il tuo primo post come ti ho scritto nel mio #1 (secondo capoverso) ed impari ad usare i tag CODE, o, al prossimo tuo post mi vedo costretto a chiudere il thread per violazione del regolamento.

Guglielmo

Perché secondo te le tabelle non sono calcolate dalle formule, adottando valori medi per le grandezze che citi tu,?

Se ci credi credici

Comunque senza codice è difficile darti consigli

Unica cosa che posso dirti tela ho già detta:

Usa una matrice a 2 dimensioni e non usare oggetti stringa, ma solo numeri

Ok, alla terza o quarta rilettura del tuo codice (quello che ho fatto ieri non contano)
ho capito cosa tenti di fare

tu hai una serie di array chiamati da gradi2 a gradi40

e due temperature

dalla temperatura a bulbo umido vuoi ottenere la parte intera

concatenare la stringa gradi alla parte intera della temperatura

usare la stringa così ottenuta come nome dell'array da leggere

mi sembra involuto
non so nemmeno se esiste una possibilità del genere
usare contenuto di una Stringa come nome di variabile

comunque Stringa[ I ] non restituisce lo Iesimo elemento dello array che ha il nome uguale al contenuto di Stringa
restituisce lo Iesimo elemento della Stringa stessa,

se vuoi ti posso aiutare a scrivere la soluzione con un array bidimensionale, di più....

docsavage ti ringrazio per il tuo aiuto,mi farebbe piacere avere un tuo aiuto in merito.

In effetti, dopo avere affrontato questo piccolo problema , si potrebbe scrivere una libreria, cosi da poter aiutare anche altre persone.

io comunque ho risolto con il metodo if.....else.

in questo modo:

int gradi2[ colonna ]  = {90, 83, 75, 67, 61, 54, 47, 42, 36, 31, 26, 23 };
int gradi3[ colonna ]  = {90, 83, 76, 69, 63, 56, 49, 44, 39, 34, 29, 26 };
int gradi4[ colonna ]  = {91, 84, 77, 70, 64, 57, 51, 46, 41, 36, 32, 28 };
int gradi5[ colonna ]  = {91, 85, 78, 71, 65, 59, 54, 48, 43, 39, 34, 30 };
int gradi6[ colonna ]  = {92, 85, 78, 72, 66, 61, 56, 50, 45, 41, 35, 33 };

e poi :

if (t0==2){
  umrelativa= gradi2[difftemp];

  }
  else if (t0==3) {
     umrelativa= gradi3[difftemp];
  }
else if (t0==4) {
     umrelativa= gradi4[difftemp];
  }
  else if (t0==5) {
     umrelativa= gradi5[difftemp];
  }
}

.

comunque, ti posto la formula dell'umidità assoluta cosi che tu possa analizzarla, io la trovo complicata, anche se la uso spesso.
E’ necessario prima calcolare l’attuale l’umidità assoluta dell’aria usando la formula:

(12) W=[(Tc-Twb)(Cp)-Lv(Eswb/P)]/[-(Tc-Twb)(Cpv)-Lv]

W=umidità effettiva dell’aria

Cp=calore specifico dell’aria secca a pressione costante (J/g)~1.005 J/g

Cpv= calore specifico del vapor d’acqua a pressione costante (J/g)~4.186 J/g

Lv=calore latente di vaporizzazione (J/g)~2500 J/g

Tc=temperatura dell’aria in gradi Celsius

Twb=temperatura del bulbo bagnato in gradi Celsius

Eswb=pressione di vapore di saturazione alla temperatura del bulbo bagnato mb)

P=pressione atmosferica a livello del mare (1013 mb)

Una volta calcolato la pressione di vapore effettiva, è possibile usare la formula successiva per calcolare l’umidità assoluta di saturazione dell’aria

(13) Ws=Es/P

Una volta ottenuti questi valori è possibile calcolarsi l’umidità relativa

(14) Umidità relativa (RH) in percentuale = (W/Ws)*100

Nota: Il calore latente di vaporizzazione (Lv) varia leggermente con la temperatura. Il valore dato sopra è un valore approssimato per l’atmosfera standard a 0 gradi Celsius.

ribadisco , ti ringrazio ancora per la tua attenzione su questo quesito, si vede che sei preparato.

Ok, domani, adesso nanna

OK, andiamo a incominciare

prima soluzione: tabella psicrometrica

come ti ho detto si tratta di un array a due dimensioni di 39 righe e 12 colonne

quindi si dimensiona un array (globale) di byte (tanto non serve che superi il 100)
di 39 righe e 12 colonne

byte t[39][12];

anzi, dimensionandolo lo si inizializza

byte t[39][12]= {una serie di 39 *12 = 468 numeri separati da virgola};

come si vede la menata è solo copiarsi la tabella psicrometrica

cose da consumarsi le dita.....

OK

si cerca in internet una tabella psicrometrica
la si copia (seleziona, copia eccetera eccetera)
si apre excel, si incolla
si eliminano le intestazioni di riga e colonna
si salva come file csv
che significa comma separed value valori separati da virgola, quasi come ci serve

perché dico quasi?

per i ritorni a capo,

si cambia l'estensione del fila da csv a txt

si apre e si edita il file, cancellando i ritorni a capo
si ottiene una sola riga
seleziona copia

si apre lo ide di arduino
si incolla dentro alle parentesi graffe di inizializzazione dello array

come dicono i croupier
les jeux sont faits
più complesso a dirlo che a farlo
a dopo per la parte di lettura della tabella

Avanti.............

siccome non hai ancora pubblicato il codice completo non so come leggi la temperatura

vabbe, io scrivo una funzione che accetta in ingresso due temperatura e restituisce la percentuale, oppure 0 per valori impossibili

int psicrometro(float umido, float secco)

perché float?

perché non so cosa usi tu.......

date le due temperature NON basta calcolare i due indici
in 'C' non c'é un controllo che ti impedisca di leggere al di fuori di un array, lo dobbiamo implementare

quattro controlli del tipo:

  if (umido > 40) {
    Serial.print(F("bulbo umido oltre scala"));
    return 0;
  }

fanno un debug sulla seriale, se serve si può togliere
fanno un return 0, cge restituisce 0 (che per convenzione ho preso come fuori scala) e termina la funzione

dopo questi 4 controlli serve di calcolare gli indici delle tabelle

per il primo indice, la riga
int primo = umido - 1.5;

semplicemente la temperatura troncata a intero (da float che era), abbassato di 2 perchè la tabella comincia da due e non da zero, alzata di 0.5 per fare l'approssimazione e non il troncamento

il secondo indice
int secondo = (secco - umido) * 2 + 0.5;

qui si calcola la differenza, moltiplicato 2 perché la tabella va di 0.5 in 0.5
sempre il solito 0.5 per l'approssimazione invece del troncamento

da ultimo si restituisce alla loop il valore letto

return t[primo][secondo];

sempre come dicono i croupier
Rien ne va plus

ti basta come aiuto?

mentre cercavo di organizzare le formule per la soluzione 2, analitica

ho trovato questo link:

credo sia inutile che proseguo...
qui trovi tutto e ben spiegato

scusate l'assenza, ma il lavoro toglie tempo.......

pubblico il codice cosi che possiate visionarlo, avviso che non ho apportato ancora modifiche dall'ultima volta che ho scritto per mancanza ti tempo, e che in questo momento, esso è stato formulato solo per provare le singole parti, ci sono degli errori che vanno corretti, sopratutto nella parte di lettura della matrice.

comunque è funzionante.

umidit__relativa.ino (11.8 KB)

pubblico anche la foto dello psicrometro auto costruito.