ds18b20 datalloger

viva amigos,

estou a usar o projecto 43 do livro “Arduino Basico”, e tenho algumas duvidas em relaçao codigo.

ao imprimir para a serial, a temperatura da da seguinte forma: (Exemplo do livro)

File Opened.
Inside: 27.25 C 81.05 F
Outside: 15.19 C 59.34 F
Data written.
File Closed.

Mas no SD fica assim:

2010/10/3 17:29:9
Internal Sensor: 27 C 81 F
External Sensor: 15 C 59 F

O que eu pretendia, era que no SD tambem guarda-se a temperatura completa.
ou seja:
2010/10/3 17:29:9
Internal Sensor: 27.15 C 81.05 F
External Sensor: 15.19 C 59.34 F

Como posso fazer isso?

Segue o codigo ja alterado por mim.

// Projeto 43
// Com base nos exemplos da SD Fat, criada por Bill Greiman da sdfatlib
// Biblioteca DS1307, de Matt Joyce, com melhorias criadas por D. Sjunnesson
#include <SdFat.h>
#include <SdFatUtil.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> // escrita por mattt, no forum do Arduino, e modificada por D. Sjunnesson
// armazena as strings de erro em memória flash, para economizar a RAM
#define error(s) error_P(PSTR(s))
// O fio de dados está conectado ao pino 3 do Arduino
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 12
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
// Prepara uma instância de OneWire para se comunicar com qualquer dispositivo OneWire (não
// apenas CIs de temperatura Maxim/Dallas)
OneWire oneWire(ONE_WIRE_BUS);
// Passa uma referência à instância oneWire para Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays para armazenar os endereços do dispositivo
DeviceAddress insideThermometer = { 0x28, 0xD2, 0x50, 0xB0, 0x04, 0x00, 0x00, 0x2E };
DeviceAddress outsideThermometer = { 0x28, 0x4C, 0xA5, 0xB0, 0x04, 0x00, 0x00, 0xF8 };
float tempC, tempF;
int hour, minute, seconds, day, month, year;
// cria um novo nome de arquivo
char name[] = "TEMPLOG.TXT";
void error_P(const char* str) {
PgmPrint("error: ");
SerialPrintln_P(str);
if (card.errorCode()) {
PgmPrint("SD error: ");
Serial.print(card.errorCode(), HEX);
Serial.print(',');
Serial.println(card.errorData(), HEX);
}
while(1);
}
void writeCRLF(SdFile& f) {
f.write((uint8_t*)"\r\n", 2);
}
// Escreve um número não sinalizado no arquivo
void writeNumber(SdFile& f, uint32_t n) {
uint8_t buf[10];
uint8_t i = 0;
do {
i++;
buf[sizeof(buf) - i] = n%10 + '0';
n /= 10;
} while (n);
f.write(&buf[sizeof(buf) - i], i);
}
// Escreve uma string no arquivo
void writeString(SdFile& f, char *str) {
uint8_t n;
for (n = 0; str[n]; n++);
f.write((uint8_t *)str, n);
}
void getTemperature(DeviceAddress deviceAddress)
{
sensors.requestTemperatures();
tempC = sensors.getTempC(deviceAddress);
tempF = DallasTemperature::toFahrenheit(tempC);
}
void getTimeDate() {
hour = RTC.get(DS1307_HR,true); // lê a hora e também atualiza todos os valores,
// utilizando true
minute = RTC.get(DS1307_MIN,false); // lê os minutos sem atualização (false)
seconds = RTC.get(DS1307_SEC,false); // lê os segundos
day = RTC.get(DS1307_DATE,false); // lê a data
month = RTC.get(DS1307_MTH,false); // lê o mês
year = RTC.get(DS1307_YR,false); // lê o ano
}
void setup() {
Serial.begin(9600);
Serial.println("Type any character to start");
while (!Serial.available());
Serial.println();
// Inicia a biblioteca sensors
sensors.begin();
Serial.println("Initialising Sensors.");
// Define a resolução
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
delay(100);
// Define o tempo no RTC.
// Comente esta seção, caso você já tenha definido o tempo e tenha uma bateria de backup
RTC.stop();
RTC.set(DS1307_SEC,0); // define os segundos
RTC.set(DS1307_MIN,43); // define os minutos
RTC.set(DS1307_HR,23); // define as horas
RTC.set(DS1307_DOW,6); // define o dia da semana
RTC.set(DS1307_DATE,14); // define a data
RTC.set(DS1307_MTH,03); // define o mês
RTC.set(DS1307_YR,15); // define o ano
RTC.start();
Serial.println("Initialising SD Card...");
// inicializa o cartão SD em SPI_HALF_SPEED, para evitar erros de barramento com as protoboards.
// Utiliza SPI_FULL_SPEED para um melhor desempenho, caso seu cartão suporte essa opção.
if (!card.init(SPI_HALF_SPEED)) error("card.init failed");
// inicializa um volume FAT
if (!volume.init(&card)) error("volume.init failed");
// abre o diretório raiz
if (!root.openRoot(&volume)) error("openRoot failed");
Serial.println("SD Card initialised successfully.");
Serial.println();
}
void loop() {
Serial.println("File Opened.");
file.open(&root, name, O_CREAT | O_APPEND | O_WRITE);
getTimeDate();
file.timestamp(7, year, month, day, hour, minute, seconds);
getTemperature(insideThermometer);
Serial.print("Interior: ");
Serial.print(tempC);
Serial.print(" C ");
writeNumber(file, year);
writeString(file, "/");
writeNumber(file, month);
writeString(file, "/");
writeNumber(file, day);
writeString(file, " ");
writeNumber(file, hour);
writeString(file, ":");
writeNumber(file, minute);
writeString(file, ":");
writeNumber(file, seconds);
writeCRLF(file);
writeString(file, "Interior Sensor: ");
writeNumber(file, tempC);
writeString(file, " C ");
writeCRLF(file);
getTemperature(outsideThermometer);
Serial.print("Exterior: ");
Serial.print(tempC);
Serial.print(" C ");
writeString(file, "Exterior Sensor: ");
writeNumber(file, tempC);
writeString(file, " C ");
writeCRLF(file);
writeCRLF(file);
Serial.println("Data written.");
// fecha o arquivo e força a escrita de todos os dados no cartão SD
file.close();
Serial.println("File Closed.");
Serial.println();
delay(10000);
}

O teu problema esta na funcao writeNumber...

Muito provavelmente para poupar espaco, quem fez o programa foi pela maneira mais curta e nao colocou o processamento da parte decimal.

brigado pela resposta bubulindo.

vou entao pesquisar esse "problema".

ja agora, o rtc, nao faz contagem. o que pode ser? fica parado nos segundos.

Como o bubulindo referiu, o problema é que a função writeNumber apenas escreve números inteiros:

// Escreve um número não sinalizado no arquivo
void writeNumber(SdFile& f, uint32_t n) {
  uint8_t buf[10];
  uint8_t i = 0;
  do {
    i++;
    buf[sizeof(buf) - i] = n%10 + '0';
    n /= 10;
  } 
  while (n);
  f.write(&buf[sizeof(buf) - i], i);
}

para além disso, esta função apenas processa números positivos (se tiver temperaturas negativas vai ter problemas também com os valores).

Em relação ao RTC, podem ser vários problemas. Como tem a placa ligada?