Go Down

Topic: problema lettura NTC con piattaforma Chameleon (Read 1 time) previous topic - next topic

garbabele

Buonasera a tutti!
Ho una questione che non riesco a risolvere a cavallo, credo, tra software e hardware.
Dunque io sto cercando di leggere la temperautra tramite ntc (e per fare questo ho usato il tutorial: http://learn.adafruit.com/thermistor?view=all). Con questo sistema faccio dieci letture, tolgo le due più alte e le due più basse (già discusso in un altro post) e calcolo la temperatura sulla media delle sei letture rimanenti. Fin qua tutto ok.
Questo però era solo un esercizio da mettere in pratica con la piattaforma Chameleon (http://www.eurogi.it/portfolio/chameleon/). Il problema è che una volta che carico il programma in Chameleon (il quale va alimentato a 10V separatamente dal cavo usb per caricarci sopra il software) questo mi restituisce delle letture che non corrispondono affatto alla temperatura.
Io suppongo che questo sia dovuto ai parametri che vanno settati nel tutorial, cioè:
Code: [Select]
// which analog pin to connect
#define THERMISTORPIN 0       
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000     
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 10
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3470
// the value of the 'other' resistor
#define SERIESRESISTOR 10000

però, visto che di elettronica ci capisco pochino (poco proprio!), non sono sicuro di essere sulla giusta strada! A me serve di leggere la temperatura (corretta!) dal Chameleon!
allego il codice
Code: [Select]
// which analog pin to connect
#define THERMISTORPIN 0       
// resistance at 25 degrees C
#define THERMISTORNOMINAL 10000     
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 10
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3470
// the value of the 'other' resistor
#define SERIESRESISTOR 10000

#define outputBedRoomOne 8       

int n = 0;
int i = 0;
int arraysala[10];

float tempConverter(float average){
  // convert the value to resistance
  Serial.print("CONVERTO LA MEDIA ");
  Serial.println(average);
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;
  float steinhart;
  steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
  steinhart = log(steinhart);                  // ln(R/Ro)
  steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  steinhart = 1.0 / steinhart;                 // Invert
  steinhart -= 273.15;                         // convert to C
  Serial.print("temp rilevata ");
  Serial.println(steinhart);
  return steinhart; 
}

void setup()
{
pinMode(n, INPUT);
Serial.begin(9600);
}

void loop()
{
int valore = analogRead(THERMISTORPIN);
Serial.print("read value ");
Serial.print(valore);
arraysala[i] = valore;
Serial.print(" array index number ");
Serial.print(i);
Serial.print(" save ");
Serial.println(arraysala[i]);
i = i+1;

if(i>9){
 
  int indmin = 0;
  int indmax = 0;
  for(int j = 1; j<=2; j++){
    int vmax = 0;
    for(int k = 0; k<10; k++){
      if(vmax < arraysala[k] && arraysala[k] != 10000){
        vmax = arraysala[k];
        indmax = k;
      }
    }
    Serial.print("max ");
    Serial.println(indmax);
    arraysala[indmax] = -10000;
  }

  for(int j = 1; j<=2; j++){
    int vmin = 1023;
    for(int k = 0; k<10; k++){
      if(vmin > arraysala[k] && arraysala[k] != -10000){
        vmin = arraysala[k];
        indmin = k;
      }
    }
    Serial.print("min ");
    Serial.println(indmin);
    arraysala[indmin] = 10000;
  }
  i = 0;
 
  float media = 0;
  for(int l = 0 ; l<10; l++){
    Serial.print(arraysala[l]);
    Serial.print(" + ");
    Serial.print(media);
    Serial.print(" = ");
    media = arraysala[l] + media;
   
    Serial.println(media);
  }
  media = media / 6;
  Serial.print("diviso 6 = ");
  Serial.println(media);
  tempConverter(media);
}

delay(1000);
}

Grazie a tutti!

PaoloP

Da quello che ho letto nel loro sito usano un ATmega2560. Però è da vedere a che tensione lo alimentano e quindi quale è la tensione di riferimento (AREF) per l'ADC (il convertitore analogico digitale).
Dovresti fornire all'ingresso analogico una tensione nota (ad esempio 3.3V) e vedere che valore ti restituisce l'analogread con uno sketch semplice semplice.

garbabele


Da quello che ho letto nel loro sito usano un ATmega2560. Però è da vedere a che tensione lo alimentano e quindi quale è la tensione di riferimento (AREF) per l'ADC (il convertitore analogico digitale).
Dovresti fornire all'ingresso analogico una tensione nota (ad esempio 3.3V) e vedere che valore ti restituisce l'analogread con uno sketch semplice semplice.

Grazie per la risposta! Non sono però sicuro di aver capito bene...quindi: io devo alimentare il Chameleon con una tensione nota e vedere che valori mi restituisce dalla lettura analogica e fin qua ok! Ma questo lo faccio a che scopo?
Suppongo che mi serva per capire qual'è la nuova scala di valori per le temperature ma forse mi sbaglio! Grazie!

PaoloP

No. L'alimentazione è quella prevista dal progetto Chamaleon. (che ignoro)
Quello che intendevo era di fornire all'ingresso analogico una tensione nota in modo da verificare qual'è il riferimento di tensione utilizzato dal micro.
Sarebbe meglio avere il datasheet con i dati del progetto, altrimenti dovrai fare un po' di prove per capire come hanno implementato il micro nel loro circuito.
Oppure chiama la ditta e fatti fornire i dati essenziali.

garbabele

#4
Dec 09, 2013, 10:12 am Last Edit: Dec 09, 2013, 02:38 pm by garbabele Reason: 1
Ma tutto questo influenza il codice che ho scritto? Ovviamente penso di si, ma l'unica cosa che posso fare (credo) è intervenire sulla scala dei valori letti, in modo da associare una lettura ad una temperatura. In questo caso tutta la funzione di trasformazione delle temperature è da buttare? Nel senso che quella fornita dall'esempio funziona su Arduino e con lo schema dato e basta?
grazie!
EDIT leggendo il tutorial (quello linkato sopra http://learn.adafruit.com/thermistor?view=all) scopro che la tensione non modifica la lettura della temperatura:
Quote
Say the fixed resistor is 10K and the variable resistor is called R - the voltage output (Vo) is:

Vo = R / (R + 10K) * Vcc

Where Vcc is the power supply voltage (3.3V or 5V)

Now we want to connect it up to a microcontroller. Remember that when you measure a voltage (Vi) into an Arduino ADC, you'll get a number.

ADC value = Vi * 1023 / Vcc

So now we combine the two (Vo = Vi) and get:

ADC value = R / (R + 10K) * Vcc * 1023 / Vcc

What is nice is that if you notice, the Vcc value cancels out!

ADC value = R / (R + 10K) * 1023

quindi...quale può essere il problema? oppure non ho capito nulla!

PaoloP

Ho dato uno sguardo al manuale di programmazione della Chamaleon ed ho trovato profonde modifiche hardware che si riflettono sul software.
Non sapendo bene come è stata costruita la scheda che ha quanto pare segue più la logica di un PLC che quella di Arduino, ti consiglio di contattare l'azienda per chiedere spiegazioni sul suo funzionamento.

garbabele


Ho dato uno sguardo al manuale di programmazione della Chamaleon ed ho trovato profonde modifiche hardware che si riflettono sul software.
Non sapendo bene come è stata costruita la scheda che ha quanto pare segue più la logica di un PLC che quella di Arduino, ti consiglio di contattare l'azienda per chiedere spiegazioni sul suo funzionamento.

In effetti loro dichiarano che è Arduino Compatibile, e questo può voler dire molte cose...quindi da questo commento quello che capisco è che probabilmente un sw fatto su arduino e che funziona per arduino potrebbe non andare bene per chameleon. Va bene, proverò a sentire quelli della ditta e vediamo!
Intanto grazie per il disturbo!

Go Up