Go Down

Topic: Conta giri a led per auto e temperatura (Read 3 times) previous topic - next topic

luchetto19

ok ti ripeto grazie ancora per le risposte molto accurate, adesso se sento anche l amico del glcd e ti faccio sapere e magari mi aiuti ancora con l impresa che sto facendo se voi magari mi mandi un messaggio privato con la tua email così se ci sentiamo anche al di fuori del forum...

MauroTec

No niente email privata, anche se la mia email è conosciuta, il motivo di ciò è legato al fatto che rispondo con piacere sul forum, perchè così molti possono seguire il tutto e magari intervenire, privatamente questa per me diventerebbe una consulenza.

Quindi scrivi qui sul forum che se non ti leggo oggi ti leggo domani e magari altri rispondo e seguono il post.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

luchetto19

ok per me va benissimo così...parliamo qui sul forum

luchetto19

ciao MauroTec ho sentito come promesso il programmatore del Glcd e lui mi ha risposto  cosi:

- Temperatura:

Senza farla tanto lunga, devi vedere la temperatura come un segnale di
tensione analogico che devi convertire in digitale utilizzando L 'ADC del
microcontrollore e visualizzarla sul display.
Per quanto riguarda il lavoro che ho fatto sul display della 600, ho
"caratterizzato il sensore" annotandomi delle coppie di valore (tensione,
temperatura) costruendo così una tabella di 20-30 coppie.
A questo punto ho usato una semplice funzione per linearizzare la tabella
stessa così da produrre, avendo in ingresso un conteggio relativo alla
conversione di una tensione, un valore di temperatura in uscita (approssimato
ma quanto più aderente alla realtà quanto più ampia è la tabella). Questo è
tutto. Comunque ti allego la tebella di conversione del sensore temperatura
della 600 con la funzione di conversione che prende come paramentro di ingresso
i conteggi (derivanti dalla conversione Analogico Digitale della tensione del
sensore temperatura) e ritorna un intero che è il valore della temperatura
corrispondente alla tensione di ingresso.Per avere una misura meno "nervosa",
prima di chiamare la funzione di temperatura, ti consiglio di fare una media
matematica di 10-15 valori di conteggi.


e ecco il codice che ha usato:
Code: [Select]
#define LIMITE_CONTEGGI_AI_TEMP 1010
#define ERR_MISURA              0xCFFE
#define MAX_PT_T 26



// Tabella conteggi  / temperatura acqua

const int TABT[MAX_PT_T][2]=
{
        160,  121,
        211  , 111,
        251  , 104,
        263  , 101,
        274  , 99,
        286  , 96,
        299  , 94,
        314  , 91,
        328  , 89,
        351  , 85,
        361  , 83,
        383  , 80,
        406  , 76,
        437  , 71,
        468  , 67,
        498  , 63,
        555  , 56,
        613  , 48,
        665  , 42,
        726  , 35,
        795  , 28,
        858  , 23,
        916  , 18,
        960  , 16,
        974  , 14,
        995  , 13
};




int ConvTAcqua(int Conteggi)
// Converte una misura di temperatura acqua
{
//*******************************************************/
//
//       Conversione  TEMPERATURA Conteggi/Gradi
//
//                    T(i+1)-T(i)
//      T  = T(i) + -------------  *  ( Conteggi - C(i) )
//                    C(i+1)-C(i)
//
//*******************************************************/
        unsigned char        i;
        int                 locCont;
        int                C1;
        int                C2;
        int                T1;
        int                T2;
        int             DeltaT;
        int             DeltaC;
        int             DeltaCont;
        int             Temp;



        if (Conteggi > LIMITE_CONTEGGI_AI_TEMP || Conteggi==0)  return (ERR_MISURA); // DownScale e Conteggi allo Start
        locCont = Conteggi;

        // Sotto il minimo valore in tabella
        if (Conteggi <= TABT[0][0]) return (TABT[0][1]);

        // Valore nel range
        for (i=1; i<MAX_PT_T; i++)
        {
                C2 = TABT[i][0];
                if (Conteggi < C2)
                {
                 C1  = TABT[i-1][0];
                 T1  = TABT[i-1][1];
                 T2  = TABT[i][1];
                 break;
                }
        }
        DeltaT    = (T2 - T1);
        DeltaC    = (C2 - C1);
        DeltaCont = (locCont - C1);
        Temp          =        T1+(DeltaT*DeltaCont)/DeltaC;

        return(Temp);
}


secondo te e possibile fare tutto questo con arduino ?? e mi aiuteresti a modificare il codice per farlo capire ad arduino ??



MauroTec

Certo che puoi fare quel lavoro, anzi è già fatto.

Il codice usato dal programmatore Glcd è standard C e arduino usa un compilatore C/C++, quindi il codice è compatibile.

Allora leggi il valore della conversione AD con analogRead(pin) e chiama la funzione ConvTAcqua(int Conteggi) più o meno così:

Code: [Select]

unsigned int adc_value;                          // variabile dove conservare la conversione AD
byte n_samples = 6;                               // variabile contenente il numero di letture consecutive su cui calcolare la media
int temp_centigradi;

// legge n_samples volte il valore di AD e lo somma a se stesso
for (byte i=0; i< n_samples; i++) {
        adc_value += analogRead(A0);
        delay(10);
}
// calcola la media
adc_value /= n_samples;

temp_centigradi =  ConvTAcqua( adc_value );  // temp_centigradi contiene il valore di temperatura


Devi solo modificare la funzione ConvTAcqua per prendere un valore intero sensa segno (unsigned int).

Originale:
int ConvTAcqua(int Conteggi)
Modificata:
int ConvTAcqua(unsigned int Conteggi)

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up