Go Down

Topic: Ayuda con proyecto lector temperaturas y Xively (Read 2050 times) previous topic - next topic

aestrada

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();
  }
}

surbyte

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.

aestrada

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í.

juanpintom

Buen trabajo! :)

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 :) Por ahora tenemos un envio a Xively y emoncms via la APP de Android, aunque se podria valorar hacerlo desde el propio Arduino ;)

Salu2 y suerte con ese codigo estable :)
Souliss - Distributed Home Automation and Internet of Things<br /><br />http://www.souliss.net/<br /><br />http://forum.arduino.cc/index.php?topic=223723.0

surbyte


Go Up