Arduino Forum

International => Italiano => Software => Topic started by: antoniocnn on Jun 12, 2016, 08:56 am

Title: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 12, 2016, 08:56 am
Ciao tutti,
sto iniziando un nuovo progetto e utilizzo la sonda TMP36GZ per monitorare la temperatura.
Ho trovato questo codice
Code: [Select]
/*
 * FILE:    TMP36.11GIU16
 * PURPOSE:
 * PROBE:   TMP36
 * AUTHOR:  Antonio Cannavale
 * COMFORT:
 */

int val_ADC = 0;
float temp = 0;

void setup() { // Start setup
 Serial.begin(9600); // Start the serial connection with the computer
 delay(500); // Delay to let system boot
 while (!Serial) {
    ; // Wait for serial port to connect. Needed for native USB port only
 }
 delay(1000); // Wait before accessing sensor
} // End setup

void loop() { // Start loop
 val_ADC = analogRead(0); //Getting voltage from sensor at Analog PIN A0
 temp = ((val_ADC * 0.00488) - 0.5)/0.01; // Convert voltage in Celsius
 Serial.print(val_ADC); // Print
 Serial.println(" mV");
 Serial.print(temp);
 Serial.println (" C");
 delay(120000);
} // End loop

Ma il programma mi da questo errore.
Quote
Arduino:1.6.5 (Windows 8.1), Scheda:"Arduino Uno"

TMP36.11GIU16:23: error: stray '\' in program
TMP36.11GIU16.ino: In function 'void loop()':
TMP36.11GIU16:23: error: expected ')' before 'u2013'
stray '\' in program

  Questo report potrebbe essere più ricco
di informazioni con
  "Mostra un output dettagliato durante la compilazione"
  abilitato in "File > Impostazioni"
Come mai?

Grazie
Title: Re: Errore nella compilazione
Post by: gpb01 on Jun 12, 2016, 09:47 am
Con cosa hai fatto il copia/incolla nel tuo IDE? Perché ti sei portato dietro dei caratteri speciali (... per di più invisibili) tipici della formattazione del testo ...

Prova a fare una cosa ...
... cancella il tuo programma nell'IDE, prendi quello che hai incollato qui (usa il tastino [Select], copia e incolla nell'IDE) e vedrai che l'errore scompare.

Guglielmo
Title: Re: Errore nella compilazione
Post by: cyberhs on Jun 12, 2016, 09:57 am
L'errore indica la presenza alla riga 23 di un carattere "randagio", per l'esattezza un "\" che, peraltro, non vedo in nessuna parte del listato..

Prova a riscriverla: alle volte, copiandola da un sito, possono essere presenti caratteri invisibili.
Title: Re: Errore nella compilazione
Post by: uwefed on Jun 12, 2016, 10:40 am
Lo sketch non corrisponde allo sketch che ha prodotto gli errori.
Cosí non riusciamo ad aiutarti.
Ciao Uwe
Title: Re: Errore nella compilazione
Post by: nid69ita on Jun 12, 2016, 10:54 am
Inoltre quel pezzo nella setup:

Code: [Select]
while (!Serial) {
    ; // Wait for serial port to connect. Needed for native USB port only

serve di solito solo per Arduino Leonardo.  Quel pezzo ferma il programma in attesa che da serial monitor premi qualcosa. Secondo me... levalo.
Title: Re: Errore nella compilazione
Post by: antoniocnn on Jun 12, 2016, 03:19 pm
Inoltre quel pezzo nella setup:

Code: [Select]
while (!Serial) {
    ; // Wait for serial port to connect. Needed for native USB port only

serve di solito solo per Arduino Leonardo.  Quel pezzo ferma il programma in attesa che da serial monitor premi qualcosa. Secondo me... levalo.
Daccordo.
Uso Arduino UNO
Title: Re: Errore nella compilazione
Post by: antoniocnn on Jun 12, 2016, 03:30 pm
L'errore indica la presenza alla riga 23 di un carattere "randagio", per l'esattezza un "\" che, peraltro, non vedo in nessuna parte del listato..

Prova a riscriverla: alle volte, copiandola da un sito, possono essere presenti caratteri invisibili.
Funziona. :D
Ho cancellato e riscritto a mano la riga 23.
Vi chiedo un'altra cosa.
La formula è corretta?
Title: Re: Errore nella compilazione con TMP36
Post by: cyberhs on Jun 12, 2016, 06:04 pm
La formula è corretta, anche se io preferisco questa forma:

temp = (val_ADC * 5.0 / 1023 - 0.5) / 0.01;  // 5.0 = tensione ADC, 0.5 = tensione offset, 0.01 = 10mV/°C
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 12, 2016, 09:49 pm
La formula è corretta, anche se io preferisco questa forma:

temp = (val_ADC * 5.0 / 1023 - 0.5) / 0.01;  // 5.0 = tensione ADC, 0.5 = tensione offset, 0.01 = 10mV/°C
Perfetto.
l'ho sostituita con la mia, mi sembra commentata meglio.
Inoltre ho anche inserito il condensatore da 0.1uF di tipo poliestere tra Vs e GND, come consiglato dal data sheet. Ma ho una domanda. Dove lo devo mettere, vicino al TMP36?

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: Maurotec on Jun 13, 2016, 01:12 am
Quote
Dove lo devo mettere, vicino al TMP36?
Se il TMP36 è saldato su PCB lo saldi vicino, se c'è un cavo che collega TMP36 al PCB allora il condensatore va saldato sui pin del TMP36.

PS: Occhio che con alimentazione da USB avrai una lettura ADC poco affidabile, molto meglio alimentare arduino da jack o da VIN fornendo a questo 5.0Vdc

Ciao.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 13, 2016, 07:09 am
Se il TMP36 è saldato su PCB lo saldi vicino, se c'è un cavo che collega TMP36 al PCB allora il condensatore va saldato sui pin del TMP36.
Il TMP36 è libero, nel senso che ho ascquistato solo il transistor. Comunque sia va saldato vicino al TMP36.

PS: Occhio che con alimentazione da USB avrai una lettura ADC poco affidabile, molto meglio alimentare arduino da jack o da VIN fornendo a questo 5.0Vdc
Alimento arduino solo con USB perche non dispongo di un lcd per vedere i valori di temperatura. Posso utilizzare anche l'alimentazione a jack pur collegando arduino a USB?

Grazie

Ciao
Title: Re: Errore nella compilazione con TMP36
Post by: Maurotec on Jun 14, 2016, 02:21 am
Quote
Alimento arduino solo con USB perche non dispongo di un lcd. Posso utilizzare anche l'alimentazione a jack pur collegando arduino a USB?
Si, con jack e USB connessi assieme, l'alimentazione viene presa dal jack.
La tensione presa dal jack viene stabilizzata a 5Vdc ad opera di un LDO.
Mentre l'alimentazione da USB vale sempre 5Vdc, ma la stabilizzazione è affidata ai circuiti si alimentazione interni al PC.
La 5Vdc proveniente da USB può fluttuare rapidamente passando da 4.9Vdc a 4.6Vdc per poi risalire al valore iniziale.

Ciao.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 14, 2016, 07:33 am
Mi scappa un'altra domanda.
Quando arduino legge si accende per pochi millesimi di secondi il led TX, come posso fare accendere un led esterno con la stessa funzione del led TX?

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: Maurotec on Jun 14, 2016, 04:02 pm
Fai un esempio di led connesso ad un pin e che vuoi che lampeggi a condizione che; devi formulare una espressione condizionale.

Esempio:
Code: [Select]
// al posto di ? scrivi il numero del pin
// const byte button  = ?;
// const byte led0     = ?;   
// booleane led0State = false;
// ovviamente nella funzione setup() (qui mancante) devi configurare i pin con pinMode() ecc.

void loop() {
    //  questa è la condizione
    if (digitalRead(button) == HIGH) {
       // qui l'azione legata alla condizione
       led0State ^= 1;   // (1 xor 1 = 0), (0 xor 1 = 1)
       digitalWrite(led0, led0State); 
    } else {
       digitalWrite(led0, LOW);   
    }
}


led0State ^= 1 usa lo xor per invertire lo stato di led0State.

Chiedevi questo o altro?

Ciao.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 15, 2016, 08:02 am
Chiedevi questo o altro?

Penso di si.
Mi sembrava più semplice.

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 15, 2016, 08:35 am
Ciao tutti,
ancora una domanda.
Com'è possibile che il termostato di casa indica 23.3°C mentre il sensore mostra 20.3°C?
Posso aggiustare la tensione del pin Vout?

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: astrobeed on Jun 15, 2016, 08:52 am
Com'è possibile che il termostato di casa indica 23.3°C mentre il sensore mostra 20.3°C?
Possibilissimo per tutta una serie di motivi, prima di tutto la precisione di questi sensori che tipicamente è +/- 1° (@25°), è chiaramente scritto sul data sheet, risoluzione e precisione sono due cose diverse, inoltre la lettura dipende dal valore di Aref, se alimenti tramite USB difficilmente sono 5V esatti, il che introduce un ulteriore fattore di errore.
Sommando gli effetti degli errori sul TMP36 e l'errore, che c'è sicuramente, sul sensore del termostato ecco che è possibile arrivare ad uno scarto di 3°, non ultimo il fatto che dentro casa è facile rilevare differenze di un paio di gradi tra punti diversi, la misura di paragone dovresti farla tenendo il TMP36 vicino al sensore del termostato.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 15, 2016, 09:11 am
Possibilissimo per tutta una serie di motivi, prima di tutto la precisione di questi sensori che tipicamente è +/- 1° (@25°), è chiaramente scritto sul data sheet, risoluzione e precisione sono due cose diverse, inoltre la lettura dipende dal valore di Aref, se alimenti tramite USB difficilmente sono 5V esatti, il che introduce un ulteriore fattore di errore.
Alimento arduino con un alimentatore esterno, tengo il cavo USB collegato perché non dispongo di un lcd per cui uso il monitor seriale per monitorare la temperatura.

Sommando gli effetti degli errori sul TMP36 e l'errore, che c'è sicuramente, sul sensore del termostato ecco che è possibile arrivare ad uno scarto di 3°, non ultimo il fatto che dentro casa è facile rilevare differenze di un paio di gradi tra punti diversi, la misura di paragone dovresti farla tenendo il TMP36 vicino al sensore del termostato.
Proverò a tenere il transistor vicino al termostato per valutare meglio le differenze, tenendo conto delle indicazioni che mi hai dato.

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: SukkoPera on Jun 15, 2016, 09:47 am
Invece di usare 5 nei calcoli, potresti utilizzare il Secret Voltmeter (magari tramite questa comoda libreria (https://github.com/Yveaux/Arduino_Vcc)) e misurare la Vcc reale.
Title: Re: Errore nella compilazione con TMP36
Post by: astrobeed on Jun 15, 2016, 10:10 am
magari tramite questa comoda libreria (https://github.com/Yveaux/Arduino_Vcc)
In quella libreria, come in tutte le pagine web che parlano della cosa, c'è un grave errore, viene assunto in modo assoluto il valore di 1.1 V per il riferimento interno degli AVR.
Il generatore 1.1V degli AVR è tutto meno che preciso, il suo valore ha una tolleranza di +/-10%, ovvero la sua tensione può essere un qualunque valore compreso tra 1V e 1.2V, per poter usare in modo efficace il "voltmetro segreto" è necessario misurare la tensione del riferimento 1.1V e inserire il corretto valore nel calcolo.
Per misurare il valore del generatore a 1.1V basta attivarlo e fare la misura sul pin Aref con un buon multimetro elettronico, questo perché il pin viene fisicamente collegato al generatore interno quando è attivo.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 15, 2016, 11:48 am
Rieccomi con un nuovo quesito.
Volevo inserire nel monitor seriale il valore minimo e massimo della temperatura.
Qualcuno può indicarmi un semplice codice?

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: SukkoPera on Jun 15, 2016, 11:57 am
In quella libreria, come in tutte le pagine web che parlano della cosa, c'è un grave errore, viene assunto in modo assoluto il valore di 1.1 V per il riferimento interno degli AVR.
In realtà nel costruttore puoi passarle un fattore di correzione Vcc_measured/Vcc_reported.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 16, 2016, 07:13 am
Ho notato che il valore di temperatura durante la giornata rimane pressocché costante per cui basta solo trovare il modo di correggere il valore di Vout. La mia idea, seppur strampalata, potrebbe essere quella di inserire un trimmer.
Attualmente utilizzo questa connessione
GND - GND
Vout - Analog Input A0
Vin - +5V

Volevo inserire nel monitor seriale il valore minimo e massimo della temperatura.
Qualcuno può indicarmi un semplice codice?

In realtà nel costruttore puoi passarle un fattore di correzione Vcc_measured/Vcc_reported.
Quale sarebbe?

Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: brunello22 on Jun 16, 2016, 05:10 pm

Code: [Select]
if ( TempC < MinTempC ) {
    MinTempC = tempC ;
  }
  if ( TempC > MaxTempC ) {
    MaxTempC = TempC ;
  }
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 16, 2016, 11:28 pm
Code: [Select]
if ( TempC < MinTempC ) {
    MinTempC = tempC ;
  }
  if ( TempC > MaxTempC ) {
    MaxTempC = TempC ;
  }

Ho provato ma mi dice:
Code: [Select]

'MinTempC' was not declared in this scope
Title: Re: Errore nella compilazione con TMP36
Post by: Maurotec on Jun 16, 2016, 11:51 pm
Quote
Ho provato ma mi dice:
Code: [Select]


'MinTempC' was not declared in this scope
Ciò vuol dire che non l'hai dichiarata, stessa cosa per le altre variabili presenti nell'esempio.

Il codice che ti hanno suggerito, prima lo devi studiare, comprendere e poi adattare alle tue esigenze.

Quindi ti suggerisco di studiare l'esecuzione di codice condizionato tramite il costrutto if else if.

PS: Ci devi mettere del tuo.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 17, 2016, 10:50 am
Ciò vuol dire che non l'hai dichiarata, stessa cosa per le altre variabili presenti nell'esempio.

Il codice che ti hanno suggerito, prima lo devi studiare, comprendere e poi adattare alle tue esigenze.

Quindi ti suggerisco di studiare l'esecuzione di codice condizionato tramite il costrutto if else if.

PS: Ci devi mettere del tuo.
Obbiettivo raggiunto.
Condivido con la comunity il codice.

Code: [Select]

/*
 * FILE:    TMP36.16GIU16
 * PURPOSE: Temperature test program to show minimum and maximum
 * PROBE:   TMP36
 * AUTHOR:  Antonio Cannavale
 * COMFORT:
 *
 * TMP36 connected to Arduino as follow:
 * GND  - GND
 * Vout - Analog Input
 * Vin  - +5V
 */

int val_ADC = 0; // Set variable
float tempC = 0; // Set variable
float MaxTempC = 150; // Set variable maximum temperature
float MinTempC = -40; // Set variable nimimum temperature

void setup() { // Start setup
 Serial.begin(9600); // Start Serial Communication at boud rate 9600 to verify the output
 delay(500); // Delay to let system boot
 Serial.println("TEMPERATURE TEST PROGRAM");
 Serial.println("------------------------");
 Serial.println();
 Serial.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");
} // End setup

void loop() { // Start loop
  val_ADC = analogRead(0); // Getting voltage from sensor at Analog PIN A0
  tempC = (val_ADC*5.0/1023-0.5)/0.01; // 5.0=tensione ADC, 0.5=offset, 0.01=10mV/°C
  if (tempC>MinTempC) {
    MinTempC=tempC;
  }
  if (tempC<MaxTempC) {
    MaxTempC=tempC ;
  }
  Serial.print("TMP36,\t");
  Serial.print(val_ADC); // Print mV ADC value
  Serial.print(",\t");
  Serial.print(tempC); // Print celsius temperature
  Serial.print(",\t");
  Serial.print(MaxTempC);
  Serial.print(",\t");
  Serial.println(MinTempC);
  delay(120000); // Wait 2 minutes before accessing sensor again
} // End loop
Title: Re: Errore nella compilazione con TMP36
Post by: brunello22 on Jun 17, 2016, 12:35 pm
io cambierei qualcosa..

Code: [Select]


/*
   FILE:    TMP36.16GIU16
   PURPOSE: Temperature test program to show minimum and maximum
   PROBE:   TMP36
   AUTHOR:  Antonio Cannavale
   COMFORT:

   TMP36 connected to Arduino as follow:
   GND  - GND
   Vout - Analog Input
   Vin  - +5V
*/

int val_ADC  ; // Set variable
float tempC  ; // Set variable
float MaxTempC   ; // Set variable maximum temperature
float MinTempC   ; // Set variable nimimum temperature

void setup() { // Start setup
  Serial.begin(9600); // Start Serial Communication at boud rate 9600 to verify the output
  delay(500); // Delay to let system boot
  Serial.println("TEMPERATURE TEST PROGRAM");
  Serial.println("------------------------");
  Serial.println();
  Serial.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");
  val_ADC = analogRead(A0);
  tempC = (val_ADC * 5.0 / 1023.0 - 0.5) / 0.01;
  MaxTempC = MinTempC = tempC ;
} // End setup

void loop() { // Start loop
  val_ADC = analogRead(A0); // Getting voltage from sensor at Analog PIN A0
  tempC = (val_ADC * 5.0 / 1023 - 0.5) / 0.01; // 5.0=tensione ADC, 0.5=offset, 0.01=10mV/°C
  if (tempC < MinTempC) {
    MinTempC = tempC;
  }
  if (tempC > MaxTempC) {
    MaxTempC = tempC ;
  }
  Serial.print("TMP36,\t");
  Serial.print(val_ADC); // Print mV ADC value
  Serial.print(",\t");
  Serial.print(tempC); // Print celsius temperature
  Serial.print(",\t");
  Serial.print(MinTempC);
  Serial.print(",\t");
  Serial.println(MaxTempC);
  delay(12000000); // Wait 2 minutes before accessing sensor again
} // End loop
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 17, 2016, 10:56 pm
io cambierei qualcosa..
Molto bene.
Mi sembra meglio

Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 23, 2016, 03:33 pm
Ciao tutti,
sul sito adafruit (https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor) ho trovato uno schema per migliorare la risposta in temperatura.
Eccovi il codice che condivido
Code: [Select]

/*
   FILE:    TMP36.24GIU16
   PURPOSE: Test program to show minimum and maximum temperature with average
   PROBE:   TMP36
   AUTHOR:  Antonio Cannavale
   COMFORT:
 
   Formula keys: aref_voltage=Volts ADC, 0.5=Volts offset, 0.01=10mV/°C
 
   TMP36 connected to Arduino as follow:
   GND  - GND
   Vout - Analog Input
   Vin  - AREF voltage
*/

#define aref_voltage 3.27 // We tie 3.3V to AREF and measure it with a multimeter!
int val_ADC; // Set variable voltage
float TempC; // Set variable temperature
float MaxTempC; // Set variable maximum temperature
float MinTempC; // Set variable nimimum temperature

void setup() { // Start setup
  Serial.begin(9600); // Start Serial Communication
  analogReference(EXTERNAL);
  delay(500); // Delay to let system boot
  Serial.println("TEMPERATURE TEST PROGRAM");
  Serial.println("------------------------");
  Serial.println();
  Serial.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");
  byte n_samples = 10; // Take N samples in a row, with a slight delay
  float average = 0;
    for (byte i=0; i<n_samples; i++) {
         average += analogRead(A0); // Getting voltage from sensor at Analog PIN A0
        _delay_us(200);
    }
  average /= n_samples;
  val_ADC = average; // Getting voltage from average
  TempC = (val_ADC*aref_voltage/1023-0.5)/0.01; // Formula
  MaxTempC=MinTempC=TempC;
} // End setup

void loop() { // Start loop
  byte n_samples = 10; // Take N samples in a row, with a slight delay
  float average = 0;
    for (byte i=0; i< n_samples; i++) {
         average += analogRead(A0);
        _delay_us(200);
    }
  average /= n_samples;
  val_ADC = average; // Getting voltage from average
  TempC = (average*aref_voltage/1023-0.5)/0.01; // Formula
  if (TempC<MinTempC) {
    MinTempC=TempC;
  }
  if (TempC>MaxTempC) {
    MaxTempC=TempC ;
  }
  Serial.print("TMP36,\t");
  Serial.print(val_ADC); // Print mV ADC value
  Serial.print(",\t");
  Serial.print(TempC); // Print celsius temperature
  Serial.print(",\t");
  Serial.print(MinTempC); // Print minimum celsius temperature
  Serial.print(",\t");
  Serial.println(MaxTempC); // Print maximum celsius temperature
  delay(120000); // Wait 2 minutes before accessing sensor again
} // End loop
Title: Re: Errore nella compilazione con TMP36
Post by: Maurotec on Jun 23, 2016, 06:19 pm
Per migliorare ulteriormente il task ti consiglio di trasformare val_ADC in un valore risultante dalla media di più letture adc, cioè ad esempio:

Code: [Select]

// take N samples in a row, with a slight delay
byte n_samples = 10;
float average = 0;

    for (byte i=0; i< n_samples; i++) {
         average += analogRead(A0);
        _delay_us(200);
    }
average /= n_samples;


average contiene la media aritmetica di 10 letture adc distanti le une dalle altre 200us, valore che puoi anche aumentare anche fino a 1000, cioè 1ms per 10 letture = 10ms tanto dura il task.

Non scartare l'idea di trasformare questo codice in una funzione con prototipo simile:
Code: [Select]
float readTMP36(byte n_samples)

Ciao.
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 24, 2016, 04:58 pm
Per migliorare ulteriormente il task ti consiglio di trasformare val_ADC in un valore risultante dalla media di più letture adc
Ho ascoltato il tuo esempio e condivido con voi per correggere gli eventuali errori e migliorare il task.

Code: [Select]

/*
   FILE:    TMP36.24GIU16
   PURPOSE: Test program to show minimum and maximum temperature with average
            Used AREF voltage to getting better precision
   PROBE:   TMP36
   AUTHOR:  Antonio Cannavale
   COMFORT:
 
   Formula keys: aref_voltage=Volts ADC, 0.5=Volts offset, 0.01=10mV/°C
 
   TMP36 connected to Arduino as follow:
   GND  - GND
   Vout - Analog Input
   Vin  - AREF voltage
*/

#define aref_voltage 3.27 // We tie 3.3V to AREF and measure it with a multimeter!
float val_ADC; // Set variable voltage
float TempC; // Set variable temperature
float MaxTempC; // Set variable maximum temperature
float MinTempC; // Set variable minimum temperature

void setup() { // Start setup
  Serial.begin(9600); // Start Serial Communication
  analogReference(EXTERNAL);
  delay(500); // Delay to let system boot
  Serial.println("TEMPERATURE TEST PROGRAM");
  Serial.println("------------------------");
  Serial.println();
  Serial.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");
  byte n_samples = 10; // Take N samples in a row, with a slight delay
  float average = 0;
    for (byte i=0; i<n_samples; i++) {
         average += analogRead(A0); // Getting voltage from sensor at Analog PIN A0
        _delay_us(200);
    }
  average /= n_samples;
  val_ADC = average; // Getting voltage from average
  TempC = (val_ADC*aref_voltage/1023-0.5)/0.01; // Formula
  MaxTempC=MinTempC=TempC;
} // End setup

void loop() { // Start loop
  byte n_samples = 10; // Take N samples in a row, with a slight delay
  float average = 0;
    for (byte i=0; i<n_samples; i++) {
         average += analogRead(A0);
        _delay_us(200);
    }
  average /= n_samples;
  val_ADC = average; // Getting voltage from average
  TempC = (average*aref_voltage/1023-0.5)/0.01; // Formula
  if (TempC<MinTempC) {
    MinTempC=TempC;
  }
  if (TempC>MaxTempC) {
    MaxTempC=TempC ;
  }
  // Serial.println(byte);
  Serial.print("TMP36,\t");
  Serial.print(average); // Print mV ADC value
  Serial.print(",\t");
  Serial.print(TempC); // Print actual celsius temperature
  Serial.print(",\t");
  Serial.print(MinTempC); // Print minimum celsius temperature
  Serial.print(",\t");
  Serial.println(MaxTempC); // Print maximum celsius temperature
  delay(120000); // Wait 2 minutes before accessing sensor again
} // End loop


Grazie
Title: Re: Errore nella compilazione con TMP36
Post by: antoniocnn on Jun 27, 2016, 06:43 pm
ciao tutti,
eccomi con un nuovo problema.
Ho utilizzato il seguente codice
Code: [Select]

/*
   FILE:    TMP36.26GIU16
   PURPOSE: Temperature test program also show minimum, maximum
            and write data to SD_CARD file.
            Used AREF voltage to getting better precision
   PROBE:   TMP36
   AUTHOR:  Antonio Cannavale
   COMFORT: T 21C
  
   Formula keys: aref_voltage=Volts ADC, 0.5=Volts offset, 0.01=10mV/°C
 
   TMP36 connected to Arduino as follow:
   GND  - GND
   Vout - Analog Input
   Vin  - 3.3V

   SD card connected to Arduino as follows:
    _________
   |876543219\
   1 - PIN10   4 - 3.3V    7 - PIN12
   2 - PIN11   5 - PIN13   8 - NC
   3 - GND     6 - GND     9 - NC
*/

#include <SPI.h> // Include SPI library
#include <SD.h> // Include SD library

#define aref_voltage 3.3 // We tie 3.3V to AREF and measure it with a multimeter!

float val_ADC; // Set variable voltage
float TempC; // Set variable temperature
float MaxTempC; // Set variable maximum temperature
float MinTempC; // Set variable minimum temperature

File myFile;

void setup() { // Start setup
  Serial.begin(9600); // Start Serial Communication
  delay(500); // Delay to let system boot
  
  // Initialization SD Card and check to see if the file exists
  Serial.print("Initializing SD card...");
  if (!SD.begin(10)) {
    Serial.println(" initialization failed!");
    Serial.println("TEMPERATURE TEST PROGRAM");
    Serial.println("------------------------");
    Serial.println();
    Serial.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");
    analogReference(EXTERNAL);
    byte n_samples = 10; // Take N samples in a row, with a slight delay
    float average = 0;
    for (byte i=0; i<n_samples; i++) {
       average += analogRead(A0); // Getting voltage from sensor at Analog PIN A0
       _delay_us(200);
    }
    average /= n_samples;
    val_ADC = average; // Getting voltage from average
    TempC = (val_ADC*aref_voltage/1023-0.5)/0.01; // Formula
    MaxTempC=MinTempC=TempC;
    return; // Don't do anything more
  }
  Serial.println(" initialization done.");
  if (SD.exists("example.txt")){
    Serial.println("example.txt exists.");
    Serial.println("Removing example.txt...");
    SD.remove("example.txt");
  }
  else {
    Serial.println("example.txt doesn't exists.");
  }
  /* Open a new file. Note that only one file can be open at a time,
     so you have to close this one before opening another.
  */
  Serial.print("Creating and writing to example.txt...");
  myFile = SD.open("example.txt", FILE_WRITE);

  // Check to see if the file exists
  if (SD.exists("example.txt")) {
     Serial.println("example.txt exists.");
  }
  else {
    Serial.println("example.txt doesn't exists.");
  }
  // Delete the file
  Serial.println("Removing example.txt...");
  SD.remove("example.txt");
  if (SD.exists("example.txt")) {
    Serial.println("example.txt exists.");
  } else {
    Serial.println("example.txt doesn't exist.");
  }
   Serial.println();
   Serial.println("TEMPERATURE TEST PROGRAM");
   Serial.println("------------------------");
   Serial.println();
   Serial.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");

  // If the file opened okay, write to it:
  if (myFile) {
    myFile.println("TEMPERATURE TEST PROGRAM");
    myFile.println("------------------------");
    myFile.println();
    myFile.println("Type ,\tmV ,\tT(C) ,\tMin(C)  Max(C)");
    myFile.close(); // Close the file
    }
  else {
    // If the file didn't open, print an error:
    Serial.println("error opening example.txt");
  }
} // End setup

void loop() { // Start loop
  myFile = SD.open("example.txt", FILE_WRITE); // Open the file
  byte n_samples = 10; // Take N samples in a row, with a slight delay
  float average = 0;
    for (byte i=0; i<n_samples; i++) {
         average += analogRead(A0);
        _delay_us(200);
    }
  average /= n_samples;
  val_ADC = average; // Getting voltage from average
  TempC = (val_ADC*aref_voltage/1023-0.5)/0.01; // Formula
  if (TempC<MinTempC) {
    MinTempC=TempC;
  }
  if (TempC>MaxTempC) {
    MaxTempC=TempC ;
  }
  Serial.print("TMP36,\t");
  Serial.print(average);
  Serial.print(",\t");
  Serial.print(TempC);
  Serial.print(",\t");
  Serial.print(MinTempC);
  Serial.print(",\t");
  Serial.println(MaxTempC);
  // Write file
  myFile.print("TMP36,\t");
  myFile.print(average);
  myFile.print(",\t");
  myFile.print(TempC);
  myFile.print(",\t");
  myFile.print(MinTempC);
  myFile.print(",\t");
  myFile.println(MaxTempC);
  myFile.close(); // Close the file
  delay(120000); // Wait 2 minutes before accessing sensor again
} // End loop

ma nonostante sia simile a quello utilizzato nella mia discussione per il DHT11, non inizializza la sd card.
Ho utilizzato gli stessi collegamenti.
Qualcuno può aiutarmi?

Grazie