Pages: 1 2 [3]   Go Down
Author Topic: Conta giri a led per auto e temperatura  (Read 2512 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 2820
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sapevo che potevi fare di meglio e infatti ora sai.
Sai che si tratta di un resistore il cui valore muta in funzione della temperatura, purtroppo non sono molto lineari e serve la formula per migliorare la linearità. Ora come puoi immaginare il resistore NTC non "tira fuori 5 volts" perchè si tratta di un componente passivo.

Per lavorare correttamente un NTC richiede un resistore posto in serie così da formare un partitore resistivo, dove un resistore è fisso mentre l'altro (il NTC) muta in funzione della temperatura.

L'NTC lo puoi simulare grazie ad un potenziometro e a un resistore serie e il collegamento è questo:

5Volts---- R -----O-----NTC------GND
                         |
                         |
                        vout to analog pin

Segui questo tutorial di ladyada, mettilo in pratica senza saltare una virgola e se hai domande dubbi posta pure.
http://learn.adafruit.com/thermistor/overview

Quando arrivi al codice sorgente da provare devi modificare alcuni valori, es Resistenza a 25 °C e questa la prendi dal datasheet che dice 3 k, ma ti serve il valore in ohm per cui 3 * 1000 = 3000 ohm
Ti serve anche RESISTORSERIE che nello sketch di ladyada è da 10Kohm (10000 ohm) se ne hai uno uguale va bene altrimenti può usare uno da 3300, 3900, 4700, 5600, ecc. e non dimenticare a specificare il valore al posto di 10000.

Un parametro non c'è e si chiama BCostant, ma non importa al momento tu dagli il valore di 3500 che poi ti calcolo il valore esatto teorico.

Non mi pare di essermi scordato nulla, ah si il valore della temperatura letta dal cruscotto sballa perchè ponendoti in paralello al NTC ne cambi il valore di resistenza che dovrebbe dimuire e quindi leggi una t maggiore.

Ciao.
                         
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa ma io ho un problema il sensore in questione è gia alimentato dalla centralina elettronica quindi io  quindi io non lo posso alimentare con l arduino e non posso nemmeno mettere la resistenza in serie perchè mi sballerebbe la lettura della centralina elettronica   in questo caso come posso modificare il programma ??
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 2820
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non si tratta di modificare il programma, il problema da te evidenziato è di carattere elettronico. Per risolvere hai due strade, aggiungere un sensore NTC economico (tipo quello di ladyada) e lasciare il sensore bulbo connesso alla centralina. Oppure se vuoi sfruttare lo stesso sensore, ti serve un circuito che offra una impedenza di carico molto alta e che di fatto disaccoppi il sensore dal convertitore AD di arduino. Il circuito in questione può essere un amplificatore operazionale collegato come amplificatore DC a guadagno unitario, cioè un buffer.

Vedi se riesci a trovare qualcosa in rete, appena ho tempo cerco qualcosa di adatta a lavorare come buffer. Utile sarebbe anche aprire un altro post nella sezione hardware per chiedere lumi su possibili buffer da acquistare già pronti.

Io fossi in te acuisterei dei sensori NTC come questi:
http://it.rs-online.com/web/p/termistori/0151237/?origin=PSF_433053|cav

Ne prendi più di uno così puoi rilevare anche la temperatura esterna e interna alla vettura, ti servono anche i resistori da 10 kohm 1/4W.

Però dovrai ingegnerti per fissare il sensore al collettore o testata o altra parte meccanica preoccupandoti anche del fatto che il sensore non venga influenzato da correnti di aria, l'ideale è propio forare un perno, inserire il sensore nel foro e chiude il tutto con resina epossidica.

Ciao.
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora io ho sentito anche un mio amico che è ingegnere elettrico è lui mi ha detto che il valore nel cruscotto digitale si sballava prechè quando collegavo   l aurduino io facevo una misura differenziale perchè l arduino era alimentato dal pc mentre il sensore era alimentato dalla centralina invece se io l arduino lo alimento con l automobile secondo lui il problema non si pone devo provare a fare questa prova molto probabilmente lo farò dopo natale perchè  non ho molto tempo da dedicarci quindi per adesso non farò molte prove.

quando l'amico di mio padre ha programmato il glcd di cui parlavo qualche post precedente lui ha preso il segnale dallo  stesso mio sensore come sto facendo io poi abbiamo preso il sensore lo abbiamo scaldato e si è fatto una tabella e dove da una parte c'erano i bit che segnava il display e da un altra c'era i vari capioni di temperatura che abbiamo fatto se io volessi fare la stessa cosa poi che funzione dovrei usare per dire ad aurduino che a tot temperatura corrisponde a tot bit ecc?? secondo me questa sarebbe la strada più semplice e pare che il valore è a a bastanza preciso...grazie ancora 
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 2820
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il tuo amico ingegnere ha ragione. Io non sapevo che come avevi fatto i collegamenti.

Una tensione di 5 Volts ha quel potenziale rispetto ad un altro punto del circuito che in questo caso è il negativo di batteria, se vuoi alimentare arduino da usb devi condividere il polo negativo della batteria dell'auto. Quindi devi solo collegare il negativo della batteria al negativo di Arduino.

Però insisti nell'errore, il tuo obbiettivo è raggiungere il risultato, invece dovrebbe essere quello di imparare le basi.
Per cui io ti suggerisco di seguire il tutorial di ladyada, arrivare a leggere la temperatura nel display e poi tentare di risolvere il problema della lettura NTC montato in auto, però sono sicuro che farai di testa tua.

Che funzione vuoi usare?

Non c'è una funzione pronta per fare quello che vuoi, mentre il codice del tutorial di ladyada è già pronto e funzionante, devi solo adattarlo secondo necessità.

Io non capisco cosa vuoi dire con: fatto una tabella e dove da una parte c'erano i bit che segnava il display e da un altra c'era i vari capioni di temperatura.

L'adc di arduino ritorna la lettura di un pin analogico in formato decimale, se hai una corrispondenza tra il valore decimale letto e la temperatura misurata, puoi mettere questi in relazione tabellare, dovresti accontentarti di un valore di temperatura privo di decimali, cioè 80 °C anche se la temperatura effettiva sarà di 79,60 °C. Io non sono in grado di aiutarti in tal senso, perchè non vedo il motivo di complicarsi la vita, quando hai già uno sketch pronto e funzionante. Insomma, ti sconsiglio di usare gli array per mettere in relazione temperatura e lettura analogica.

Ricordati che io non sono li con te e quindi non so come hai fatto i collegamenti, non so come te la cavi con il linguaggio di arduino e con il C/C++ in generale, ecc.

Ciao.

Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 2820
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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 ??


Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 2820
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

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

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset



- Temperatura:

Senza farla tanto lunga, devi vedere la temperatura come un segnale di


mah  IMHO  ti stai complicando la "vita "  per nulla

nelle auto la lancetta della temperatura acqua e tenuta in posizione da un servo,
ovviamente la lettura e filtrata via software
e se la temperatura sta entro certi limiti (70-100) sta ferma su i 90°

anche perche la temperatura e in continua variazione e3 vedere un termometro che balla entro limiti "normali "  serve solo a distrarre
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Pages: 1 2 [3]   Go Up
Jump to: