Ahora lo que creo es que de alguna manera el dato pasa correctamente al monitor serie de arduino, pero se manda erroneamente a pachube... es raro, por que el valor va en la misma variable tempValor, no??
Yo he modificado algo el codigo, porque en el original usan una entrada analogica para el sensor, y mi sensor, el ds1820, usa una digital, la 9... este es el mio:
/*=======================================================================================================
Enerzuul - http://www.enerzuul.es
V.0.1 - Marzo, 2010 (Solamente lectura sensor temperatura)
Envio de datos de lectura de sensores hacia Pachube.
Modificación del código original de Pachube (www.pachube.com) ethernet_Pachube_input_output_1_1 para adaptarlo a la lectura
de la temperatura y el consumo de energía. El sketch original puedes encontrarlo en
http://community.pachube.com/files/ethernet_Pachube_input_output_1_1.zip
Este sketch esta disponible en :
http://www.enerzuul.es/?p=570
Lo hemos ha probado con la version 0017 de Arduino
Es necesario revisar los datos siguientes para personalizarlos según los datos de tu cuenta en Pachube y de tu red:
SHARE_FEED_ID --> El identificador de tu feed en Pachube
PACHUBE_API_KEY --> La clave API de tu cuenta en Pachube
byte mac[] --> La direccion MAC para la placa Arduino , sólo si no funciona con esta.
byte ip[] --> La dirección IP que daras a la placa Arduino
byte gateway[] --> La dirección del router
byte subnet[] --> La mascara de red
Mas consejos sobre el blog de enerzuul : http://www.enerzuul.es
======================================================================================================== */
#include <Ethernet.h>
#include <string.h>
#include <SPI.h>
#include <OneWire.h>
OneWire ds(9);
#define SHARE_FEED_ID 54356 // Aqui debes indicar el identificador del feed donde quieres subir los datos
#define REMOTE_FEED_ID 256 // NO USADO AQUI. Si quieres recuperar datos de otro feed deberias indicar aqui su identificador
#define REMOTE_FEED_DATASTREAMS 0 // NO USADO AQUI. Aqui indicamos el tamaño del Array si necesitamos leer valores remotamente
#define UPDATE_INTERVAL 10000 // Tiempo de espera entre envios en milisegundos (no debe ser inferior a 5 seg , es decir 5000)
#define RESET_INTERVAL 10000 // Tiempo de espera entre re-intentos de envio cuando ha ocurrido un error (no debe ser inferior a 5 seg , es decir 5000)
#define PACHUBE_API_KEY "S81yMS-3wJ7ogIXHgtjdL1ZARi6SAKw1QmkvM0trQ0dTRT0g"// Indica aqui el código de tu API entre comillas
byte mac[] = { 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA }; // Una direccion MAC . Cualquiera es valida si no existe ya dentro de tu red !
byte ip[] = { 192, 168, 1, 93 }; // La direccion IP que quieres asignar a la placa Arduino Ethernet Shield
byte gateway[] = { 192, 168, 1, 1 }; // La direccion de tu router en la red
byte subnet[] = { 255, 255, 255, 0 }; // La mascara de red
byte remoteServer[] = { 173,203,98,29 }; // Esta es la direccion IP del servidor remote de Pachube. NO TOCAR
float remoteSensor[REMOTE_FEED_DATASTREAMS]; // we know that feed 256 has floats - this might need changing for feeds without floats
int pinTemperatura = 2; // Damos un nombre al pin de entrada analógica 2 (pin donde conectamos el sensor de temperatura)
float tempValor ; // La variable donde guardaremos la temperatura para enviar o visualizar
int kwhValor ; // La variable donde guardaremos el consumo de energia
extern volatile unsigned long timer0_overflow_count;
float fanalog0;
int analog0;
unsigned long tiempo;
byte serialByte;
void setup()
{
Serial.begin(9600);
setupEthernet();
}
//Declararemos varias funciones para simplificar el codigo
void buscasensor (byte direccion[8]) // Rutina de búsqueda de la dirección del sensor
{
if(!ds.search(direccion)) // Si no encuentra ningun sensor
{
ds.reset_search(); // Se reinicia la busqueda de los sensores
delay(250); // Espera de 250ms
}
}
void convert (byte* direccion) // Rutina que inicia la conversion del Ds1820
{
ds.reset(); // Se resetea el canal de comunicaciones
ds.select(direccion); // Se selecciona de nuevo el sensor
ds.write(0x44,1); // Se escribe un 1 en la direccion 0x44h para que comience la conversion, deja el bus a PullUP
delay (1000); // Una espera de un 1000ms para que no haya conflictos
}
void leerScratchpad (byte* direccion, byte* datos) // Rutina que lee el Scratchpad
{
ds.reset(); // Se resetea el canal de comunicaciones
ds.select(direccion); // Se selecciona de nuevo el sensor
ds.write(0xBE); // Se escribe un 1 en la direccion 0x44h para que comience la conversion
for (byte i=0; i<9; i++) // Hasta 9 por que la Scratchpad tiene 9 bytes
{
datos[i]=ds.read();
}
}
float leeTemp(byte* direccion) // Rutina que devuelve la lectura de la temperatura en grados centigrados
{
int TempR;
byte datos [9];
convert (direccion); // Se hace la llamada a la funcion convert para iniciar la conversion
leerScratchpad(direccion, datos); // Se lee el Scratchpad
TempR = datos [0]; // Se mueve a tr el valor de los 8 bits menos significativos
if (datos[1] > 0x80) // Se comprueba para datos negativos, si los 8 bits mas significativos son mayores que 0x80 es decir alguno a 1
{
TempR=!TempR + 1; // Se hace el complento a dos, como pone el datasheet
TempR = TempR * (-1); // Se le cambia el signo a tr para que salga negativo posteriormente
}
int CPC = datos [7]; // Se define el COUNTER PER C esta en la direccion 10h
int CR = datos [6]; // se define el COUNT REMAIN 0Ch
TempR = TempR >> 1; // Se desplaza el registro completo para "truncar" el bit0 de los datos de la temperatura
return TempR - (float)0.25 + (CPC - CR)/(float)CPC; // Formula obtenida del datasheet
}
void loop()
{
byte direccion [8];
float temp;
buscasensor (direccion);
temp = leeTemp (direccion); // Se hace la llamada a la funcion que lee la temperatura del sensor
Serial.println(temp);
// Lectura de la energia consumida. Por el momento enviamos un valor 0
kwhValor = 0;
tempValor = temp;
// Ahora imprimimos el valor en el puerto serie donde podremos monitorizarlo para saber que todo va bien.
Serial.print("Temperatura (Celsius) = ");Serial.println(tempValor);
// Envio de los datos a Pachube usando la funcion pachube_in_out (ver solapa pachube_functions).
pachube_in_out();
// Esperamos 10 segundos antes de entrar de nuevo en el bucle y volver a leer los sensores
delay (10000);
}