TMP006

Ciao, qualcuno ha mai utilizzato il sensore di temperatura infrarosso tmp006?
Ho cercato di realizzare un semplice sketch per rilevare la temperatura. Dopo aver aggiunto le librerie ho cercato le funzioni c he realizzassero cio di cui avevo bisogno all’interno delle stesse librerie… però in fase di compilazione mi da questi errori. Qualcuno è cosi gentile da potermi rispondere, in caso sapesse come risolvere questo problema? Ho fatto diversi tentativi ma non sono riuscito…

#include <stdint.h>
#include <math.h>
#include <Wire.h>
#include “I2C_16.h”
#include “TMP006.h”

uint8_t sensor1 = 0x40; // I2C address of TMP006, can be 0x40-0x47
uint16_t samples = TMP006_CFG_8SAMPLE; // # of samples per reading, can be 1/2/4/8/16

// costanti per calcolare la temperatura dell’oggetto
#define TMP006_B0 -0.0000294
#define TMP006_B1 -0.00000057
#define TMP006_B2 0.00000000463
#define TMP006_C2 13.4
#define TMP006_TREF 298.15
#define TMP006_A2 -0.00001678
#define TMP006_A1 0.00175
#define TMP006_S0 6.4 // * 10^-14

// settings
#define TMP006_CFG_RESET 0x8000
#define TMP006_CFG_MODEON 0x7000
#define TMP006_CFG_1SAMPLE 0x0000
#define TMP006_CFG_2SAMPLE 0x0200
#define TMP006_CFG_4SAMPLE 0x0400
#define TMP006_CFG_8SAMPLE 0x0600
#define TMP006_CFG_16SAMPLE 0x0800
#define TMP006_CFG_DRDYEN 0x0100
#define TMP006_CFG_DRDY 0x0080

//registri per leggere la termopila e la temperatura del sensore; le due temperature servono per calcolare quella dell’oggetto
#define TMP006_VOBJ 0x00
#define TMP006_TAMB 0x01
#define TMP006_CONFIG 0x02

void setup() {
Serial.begin(9600);
// configurazione del sensore, da fare prima di utilizzarlo
void config_TMP006(uint8_t addr, uint16_t samples)
{
Wire.begin();
write16(addr, TMP006_CONFIG, samples | TMP006_CFG_MODEON | TMP006_CFG_DRDYEN);
}

}

void loop() {
// lettura della temperatura del sensore
int16_t readRawDieTemperature(uint8_t addr)
{
int16_t raw = read16(addr, TMP006_TAMB);

raw >>= 2;
return raw;
}
// lettura della tensione della termpila
int16_t readRawVoltage(uint8_t addr)
{
int16_t raw = read16(addr, TMP006_VOBJ);
return raw;
}
// calcolo della temperatura dell’oggetto attraverso le due temperature lette prima
double readObjTempC(uint8_t addr)
{
double Tdie = readRawDieTemperature(addr);
double Vobj = readRawVoltage(addr);
Vobj *= 156.25; // 156.25 nV per LSB (per bit)
Vobj /= 1000000000; // nV → V
Tdie *= 0.03125; // converte a celsius
Tdie += 273.15; // converte a kelvin

// equazioni per il calcolo della temperatura, fanno irferimento a quelle della user guide sel sensore sez. 5.1
double tdie_tref = Tdie - TMP006_TREF;
double S = (1 + TMP006_A1tdie_tref + TMP006_A2tdie_tref*tdie_tref);
S *= TMP006_S0;
S /= 10000000;
S /= 10000000;

double Vos = TMP006_B0 + TMP006_B1tdie_tref +
TMP006_B2
tdie_tref*tdie_tref;

double fVobj = (Vobj - Vos) + TMP006_C2*(Vobj-Vos)*(Vobj-Vos);

double Tobj = sqrt(sqrt(Tdie * Tdie * Tdie * Tdie + fVobj/S));

Tobj -= 273.15; // Kelvin → *C
return Tobj;
Serial.println(Tobj);
delay(4000);
}

}

qui invece ci sono gli errori

sketch_tmp006.ino: In function ‘void setup()’:
sketch_tmp006:42: error: a function-definition is not allowed here before ‘{’ token
sketch_tmp006.ino: In function ‘void loop()’:
sketch_tmp006:52: error: a function-definition is not allowed here before ‘{’ token
sketch_tmp006:60: error: a function-definition is not allowed here before ‘{’ token
sketch_tmp006:66: error: a function-definition is not allowed here before ‘{’ token

se dovesse tornare utile io utilizo arduino mega2560

[code][code]cc#include <stdint.h>
#include <math.h>
#include <Wire.h>
#include "I2C_16.h"
#include "TMP006.h"

uint8_t sensor1 = 0x40; // I2C address of TMP006, can be 0x40-0x47
uint16_t samples = TMP006_CFG_8SAMPLE; // # of samples per reading, can be 1/2/4/8/16

// costanti per calcolare la temperatura dell'oggetto
#define TMP006_B0 -0.0000294
#define TMP006_B1 -0.00000057
#define TMP006_B2 0.00000000463
#define TMP006_C2 13.4
#define TMP006_TREF 298.15
#define TMP006_A2 -0.00001678
#define TMP006_A1 0.00175
#define TMP006_S0 6.4  // * 10^-14

// settings 
#define TMP006_CFG_RESET    0x8000
#define TMP006_CFG_MODEON   0x7000
#define TMP006_CFG_1SAMPLE  0x0000
#define TMP006_CFG_2SAMPLE  0x0200
#define TMP006_CFG_4SAMPLE  0x0400
#define TMP006_CFG_8SAMPLE  0x0600
#define TMP006_CFG_16SAMPLE 0x0800
#define TMP006_CFG_DRDYEN   0x0100
#define TMP006_CFG_DRDY     0x0080

//registri per leggere la termopila e la temperatura del sensore; le due temperature servono per calcolare quella dell'oggetto 
#define TMP006_VOBJ  0x00        
#define TMP006_TAMB 0x01
#define TMP006_CONFIG 0x02


void setup() {
                    Serial.begin(9600);
                    // configurazione del sensore, da fare prima di utilizzarlo
                    void config_TMP006(uint8_t addr, uint16_t samples)
                    {
                        Wire.begin();
                        write16(addr, TMP006_CONFIG, samples | TMP006_CFG_MODEON | TMP006_CFG_DRDYEN);
                    }

              }

void loop() {
              // lettura della temperatura del sensore
              int16_t readRawDieTemperature(uint8_t addr)
                  {
                    int16_t raw = read16(addr, TMP006_TAMB);
                  
                    raw >>= 2;
                    return raw;
                  }
              // lettura della tensione della termpila
              int16_t readRawVoltage(uint8_t addr) 
                  {
                    int16_t raw = read16(addr, TMP006_VOBJ);
                    return raw;
                  }
              // calcolo della temperatura dell'oggetto attraverso le due temperature lette prima
              double readObjTempC(uint8_t addr) 
              {
                double Tdie = readRawDieTemperature(addr);
                double Vobj = readRawVoltage(addr);
                Vobj *= 156.25;  // 156.25 nV per LSB (per bit)
                Vobj /= 1000000000; // nV -> V
                Tdie *= 0.03125; // converte a celsius
                Tdie += 273.15; // converte a kelvin
              
                // equazioni per il calcolo della temperatura, fanno irferimento a quelle della user guide sel sensore sez. 5.1
                double tdie_tref = Tdie - TMP006_TREF;
                double S = (1 + TMP006_A1*tdie_tref + TMP006_A2*tdie_tref*tdie_tref);
                S *= TMP006_S0;
                S /= 10000000;
                S /= 10000000;
              
                double Vos = TMP006_B0 + TMP006_B1*tdie_tref + 
                  TMP006_B2*tdie_tref*tdie_tref;
              
                double fVobj = (Vobj - Vos) + TMP006_C2*(Vobj-Vos)*(Vobj-Vos);
              
                double Tobj = sqrt(sqrt(Tdie * Tdie * Tdie * Tdie + fVobj/S));
              
                Tobj -= 273.15; // Kelvin -> *C
                return Tobj;
                Serial.println(Tobj);
                delay(4000);
              }
                  
  
             }

qui invece ci sono gli errori

[/code]sketch_tmp006.ino: In function ‘void setup()’:
sketch_tmp006:42: error: a function-definition is not allowed here before ‘{’ token
sketch_tmp006.ino: In function ‘void loop()’:
sketch_tmp006:52: error: a function-definition is not allowed here before ‘{’ token
sketch_tmp006:60: error: a function-definition is not allowed here before ‘{’ token
sketch_tmp006:66: error: a function-definition is not allowed here before ‘{’ token
[/code]

se dovesse tornare utile io utilizo arduino mega2560

Quando includi una libreria le funzioni presenti in essa possono essere usate nel codice principale. Tu, oltre ad includerla hai ricopiato il codice dalla libreria; devi invece sostituire a quel codice una chiamata alla funzione passando i parametri richiesti dalla funzione stessa. Presumo, visto l'errore, che ti manchino le basi di programmazione in linguaggio C. In Megatopic trovi un topic "Link Utili" con alcuni collegamenti a guide per apprendere le basi di programmazione.