Ayuda con proyecto lector temperaturas y Xively

Hola, tengo un proyecto con Arduino Uno Atmega32, un modulo ethernet ENC28J60 y una sonda de temperatura DS18B20. Uso el sketch del final. Mi sketch (uso partes de codigo publicadas) recoge temperaturas con la sonda y las envía a través del modulo ethernet a un recopilador de datos montado en Xively (antes pachube). Mi problema es que cuando pongo el proyecto a funcionar, los datos son enviados perfectamente y su funcionamiento es excelente, se van recopilando los datos en Xively y los veo perfectamente. Pero pasado un tiempo, los valores de Tmax y Tmin se vuelven disparatados y estáticos en su valor, la Tmax se pone en 85 y la Tmin en -127, este cambio de valores ocurre a la vez, y se revierte si apago y enciendo el arduino, o accedo al monitor serie . Los valores medidos de T actual son correctos en todo momento. Gracias por vuestra ayuda.

// Sistema de control de temperaturas usando modulo ethernet ENC28J60 y sensor DS18B20
// 2011-07-08 jc@wippler.nl http://opensource.org/licenses/mit-license.php
//PIN CONNECTION FOR ENC28J60 ETHERNET CARD
//CS…8
//SI…11
//SO…12
//SCK…13
//VCC…3.3v
//GND…GND

#include <EtherCard.h>
#include <stdio.h>
#include <OneWire.h>
#include <DallasTemperature.h>

float tempmin = 2; //Variable donde guardamos la temperatura minima registrada
float tempmax = 8; //Varibale donde guardamos la temperatura maxima registrada
float tempact; //Varibale donde guardamos la temperatura actual

// change these settings to match your own setup (son de mi cuenta Xively)
#define FEED “numero de feed” // mi numero de feed
#define APIKEY “claveAPI” // mi clave de API

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// ethernet interface mac address, must be unique on the LAN
#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)

#if STATIC
// mac address
static byte mymac = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip = { 192,168,1,32 };
// gateway ip address
static byte gwip = { 192,168,1,1 };
// mask address
static byte mymask = { 255,255,255,0 };
// dnsip address
static byte dnsip = { 80,58,61,254 };
#endif

char website PROGMEM = “api.pachube.com”;

byte Ethernet::buffer[700];
BufferFiller bfill;
uint32_t timer;
Stash stash;

void setup () {

// Start up the library
sensors.begin();

Serial.begin(38400);
Serial.println(“Trying to get an IP…”);

Serial.print("MAC: ");
for (byte i = 0; i < 6; ++i) {
Serial.print(mymac*, HEX);*

  • if (i < 5)*

  • Serial.print(’:’);*

  • Serial.println("\n[webClient]");*

  • if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)*

  • Serial.println( “Failed to access Ethernet controller”);*

  • #if STATIC*

  • Serial.println( “Getting static IP.”);*

  • if (!ether.staticSetup(myip, gwip)){*

  • Serial.println( “could not get a static IP”);*

  • }*
    #else

  • Serial.println(“Setting up DHCP”);*

  • if (!ether.dhcpSetup()){*

  • Serial.println( “DHCP failed”);*

  • blinkLed(); // blink forever to indicate a problem*

  • }*
    #endif

  • ether.printIp("IP: ", ether.myip);*

  • ether.printIp("GW: ", ether.gwip); *

  • ether.printIp("DNS: ", ether.dnsip);*

  • ether.printIp("SRV: ", ether.hisip);*
    *} *

  • if (!ether.dnsLookup(website))*

  • Serial.println(“DNS failed”);*

}
void loop () {

  • char temp_string[10];*

  • // call sensors.requestTemperatures() to issue a global temperature*

  • // request to all devices on the bus*

  • Serial.print(" Requesting temperatures…");*

  • sensors.requestTemperatures(); // Send the command to get temperatures*

  • Serial.println(“DONE”);*

  • float tempact = sensors.getTempCByIndex(0);// Why “byIndex”?*

  • // You can have more than one IC on the same bus.*

  • // 0 refers to the first IC on the wire*

  • if (tempact<tempmin)*

  • tempmin=tempact;*

  • if (tempact>tempmax)*

  • tempmax=tempact;*

  • //INICIO ANULACION SERIE*

  • Serial.print("Temperatura Actual Sensor 1: ");*

  • Serial.print(tempact);*

  • Serial.print("Temperatura Min: ");*

  • Serial.print(tempmin);*

  • Serial.print("Temperatura Max: ");*

  • Serial.print(tempmax); *

  • // FIN ANULACION SERIE*

  • ether.packetLoop(ether.packetReceive());*

  • if (millis() > timer) {*

  • timer = millis() + 10000;*

  • // generate two fake values as payload - by using a separate stash,*

  • // we can determine the size of the generated message ahead of time*

  • byte sd = stash.create();*

  • stash.print(“Frigo_1_T_Max,”);*

  • stash.println(tempmax);*

  • stash.print(“Frigo_1_T_Min,”);*

  • stash.println(tempmin);*

  • stash.print(“Frigo_1_Actual,”);*

  • stash.println(tempact);*

  • stash.save();*

  • // generate the header with payload - note that the stash size is used,*

  • // and that a “stash descriptor” is passed in as argument using “$H”*

  • Stash::prepare(PSTR(“PUT http://$F/v2/feeds/$F.csv HTTP/1.0” “\r\n”*

  • “Host: $F” “\r\n”*

  • “X-PachubeApiKey: $F” “\r\n”*

  • “Content-Length: $D” “\r\n”*

  • “\r\n”*

  • “$H”),*

  • website, PSTR(FEED), website, PSTR(APIKEY), stash.size(), sd);*

  • // send the packet - this also releases all stash buffers once done*

  • ether.tcpSend();*

  • }*
    }

Solo una sugerencia. pareciera como si el buffer de 700bytes se llena y por eso repite los valores.
Intenta explorarlo a ver si el problema es por ahi.

Hola , gracias por tu respuesta. Al final solucioné el asunto reestructurando el sketch, aunque la cuestión ahora es que pasado un tiempo de funcionamiento (aleatoriamente, pero siempre más de una o dos horas) el sistema se cuelga y deja de mandar PUT al servidor Xively. He intentado subir el buffer pero da errores de ejecución del programa. Creo que el problema de mis cuelgues y de casi todo lo que le ocurre al programa de fallos es debido a lo que comentas del buffer, que se llena intentando mandar datos a Xively y da un error tipo Stack Overflow o similar. Lo intentaré solucionar bajando drásticamente el número de veces que se toman temperatura (estaba en cada 10 segundos y lo he puesto en 1 minuto). Cuando vea estable el invento, pego el código aquí.

Buen trabajo! :slight_smile:

Si te interesa ampliar la cantidad de datos a sincronizar con xively nos podrias hechar una mano a seguir desarrollando Souliss, se pueden enviar una cantidad ilimitada de datos :slight_smile: Por ahora tenemos un envio a Xively y emoncms via la APP de Android, aunque se podria valorar hacerlo desde el propio Arduino :wink:

Salu2 y suerte con ese codigo estable :slight_smile:

Esto es lo que buscan