Recibi el ethernet shield y hoy he estado probando a ver si era capaz de conectar mi arduino con pachube. He seguido este tutorial ( http://www.enerzuul.es/?p=572 ), y parece que todo ha ido mas o menos bien, pero tengo un problema. Parece que se mandan bien los datos, y en el monitor serie sale todo bien, pero en la grafica de pachube, la coordenada y sale fuera de rango... en vez de salir la tabla con un rango de , que se yo, 0 y 50 grados, sale -15000 y +30000...
por lo demas, todo correcto, pero no entiendo como configurar esto...
En pachube en el gráfico en la parte inferior derecha tienes una rueda dentada, haces click allí y se abre el graph builder en la parte inferior derecha tienes las opciones de Scale
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);
}
La teoría dice que deberás incorporar la funcion float leeTemp(byte* direccion) y sus dependencias en el codigo de pachube y reemplazar los datos enviados en vez de readpin9 usar temp.
La guía que estas siguiendo es un pelin antigua y pachube a cambiado mucho, yo intentaria con algo mas actual como esto http://code.google.com/p/pachubelibrary/
o directamente en el IDE file<examples<ethernet<pachubeclient.