Hi to all,

I am developing an application to sense temperature and relative
humidity, using Telosb motes.

The application is Java. When running the application, it receives the
temperature and humidity values correctly. But after a while, the
value of the temperature begins to rise and rise, reaching 124.23 °
(limit of sensor SHT11) and the humidity exceeds 100%. Furthermore,
the battery voltage begins to decrease.

Where is the problem:
- NESC application
- Java application
- Calibrate the sensors. ¿how to?

Here are the files NESC:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#ifndef TMOTESKY_H
#define TMOTESKY_H
enum {
  NREADINGS = 2,
  DEFAULT_INTERVAL = 1000,
  AM_TMOTESKY_STRUCT = 0x93
};

typedef nx_struct tmotesky_struct {
  nx_uint16_t version;
  nx_uint16_t interval;
  nx_uint16_t id;
  nx_uint16_t count;
  nx_uint16_t Temp;
  nx_uint16_t ITemp;
  nx_uint16_t TSR;
  nx_uint16_t PAR;
  nx_uint16_t Humedad;
  nx_uint16_t Voltage;
  nx_uint16_t tipoUmbral;
  nx_uint16_t transmision;
  nx_uint16_t umbralSuperior;
  nx_uint16_t umbralInferior;
} tmotesky_struct_t;

#endif
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
configuration TmoteSkyAppC {
}

implementation {
  components TmoteSkyC;
  components MainC;
  components ActiveMessageC;
  components LedsC;
  components new TimerMilliC();
  components new SensirionSht11C() as TempSensor;
  components new SensirionSht11C() as HumSensor;
  components new VoltageC() as VoltageSensor;
  components CC2420ActiveMessageC as LplRadio;
  components new AMSenderC(AM_TMOTESKY_STRUCT);
  components new AMReceiverC(AM_TMOTESKY_STRUCT);

  TmoteSkyC.Boot -> MainC;
  TmoteSkyC.RadioControl -> ActiveMessageC;
  TmoteSkyC.AMSend -> AMSenderC;
  TmoteSkyC.Receive -> AMReceiverC;
  TmoteSkyC.Timer -> TimerMilliC;
  TmoteSkyC.ReadTemp -> TempSensor.Temperature;
  TmoteSkyC.ReadHum -> HumSensor.Humidity;
  TmoteSkyC.ReadVolt -> VoltageSensor;
  TmoteSkyC.Leds -> LedsC;
  TmoteSkyC.LowPowerListening -> LplRadio;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include "Timer.h"
#include "TmoteSky.h"

module TmoteSkyC {
  uses {
    interface Boot;
    interface SplitControl as RadioControl;
    interface AMSend;
    interface Receive;
    interface Timer<TMilli>;
    interface Read<uint16_t> as ReadTemp;
    interface Read<uint16_t> as ReadHum;
    interface Read<uint16_t> as ReadVolt;
    interface Leds;
    interface LowPowerListening;
  }
}

implementation {
  message_t sendbuf;
  bool sendbusy;
  tmotesky_struct_t local;
  bool suppress_count_change;

  nx_uint16_t tUmbral;
  nx_uint16_t USuperiorTemp;
  nx_uint16_t UInferiorTemp;
  nx_uint16_t USuperiorHum;
  nx_uint16_t UInferiorHum;
  nx_uint16_t USuperiorTSR;
  nx_uint16_t UInferiorTSR;
  nx_uint16_t idTemp;
  nx_uint16_t envioEvento;
  nx_uint16_t envioInicial;

  // Uso de los LEDs para reportar comportamientos
  void report_problem() { call Leds.led0Toggle();}
  void report_sent() { call Leds.led1Toggle(); }
  void report_received() { call Leds.led2Toggle(); }

  event void Boot.booted() {
    local.interval = DEFAULT_INTERVAL;
    local.id = TOS_NODE_ID;
    USuperiorTemp=10000;
    UInferiorTemp=9000;

    if (call RadioControl.start() != SUCCESS){
      report_problem();
    }

    local.transmision = 0; /*inicia sin transmitir nada*/
    envioEvento = 0;
    envioInicial = 0;
  }

  void startTimer() {
    call Timer.startPeriodic(local.interval);
  }

  event void RadioControl.startDone(error_t error) {
    startTimer();
  }

  event void RadioControl.stopDone(error_t error) {
  }

  event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) {
    tmotesky_struct_t *omsg = payload;

    report_received();
    local.transmision = omsg->transmision;
    local.tipoUmbral = omsg->tipoUmbral;
    local.umbralSuperior = omsg->umbralSuperior;
    local.umbralInferior = omsg->umbralInferior;
    local.interval = omsg->interval;
    idTemp = omsg->id; //extrae ID anterior del msg recibido

    startTimer();
        
    if (omsg->count > local.count) {
      local.count = omsg->count;
      suppress_count_change = TRUE;
    }
    return msg;
  }

  void envio() {
    if (!sendbusy && sizeof local <= call AMSend.maxPayloadLength()) {
      memcpy(call AMSend.getPayload(&sendbuf,sizeof(local)), &local,
sizeof local);
      if (call AMSend.send(AM_BROADCAST_ADDR, &sendbuf, sizeof local)
== SUCCESS)
        sendbusy = TRUE;
      }
      if (!sendbusy)
        report_problem();

      if (!suppress_count_change)
        local.count++;
        
      suppress_count_change = FALSE;

      if (call ReadTemp.read() != SUCCESS)
        report_problem();

      if (call ReadHum.read() != SUCCESS)
        report_problem();

      if (call ReadVolt.read() != SUCCESS)
        report_problem();
  }

  void MsgTipoUmbral(int tipoUmb) {
    if (tipoUmb == 1) {
      local.umbralSuperior = USuperiorTemp;
      local.umbralInferior = UInferiorTemp;
    }
    if (tipoUmb == 2) {
      local.umbralSuperior = USuperiorHum;
      local.umbralInferior = UInferiorHum;
    }
    if (tipoUmb == 3) {
      local.umbralSuperior = USuperiorTSR;
      local.umbralInferior = UInferiorTSR;
    }
    if (tipoUmb == 4) {
      USuperiorTemp = local.umbralSuperior;
      UInferiorTemp = local.umbralInferior;
    }
    if (tipoUmb == 5) {
      USuperiorHum = local.umbralSuperior;
      UInferiorHum = local.umbralInferior;
    }
    if (tipoUmb == 6) {
      USuperiorTSR = local.umbralSuperior;
      UInferiorTSR = local.umbralInferior;
    }
  }

  event void Timer.fired() {                    
    switch(local.transmision) {
      case 0 : call Leds.set(0);        
               if (envioInicial == 0){
                 envio();
                 envioInicial = 1;
               }
               break;
      case 1 : envio();
               break;

      case 2 : MsgTipoUmbral(local.tipoUmbral);
               local.transmision=0;
               envio();
               break;

      case 3 : if(local.id == idTemp) {
                 local.id = local.tipoUmbral;
               }
               break;
                                
    }
    envioEvento++;              
  }

  event void AMSend.sendDone(message_t* msg, error_t error) {
    if (error == SUCCESS)
      report_sent();
    else
      report_problem();

    sendbusy = FALSE;
  }

 event void ReadTemp.readDone(error_t result, uint16_t data) {
    if (result != SUCCESS) {
      data = 0xffff;
      report_problem();
    }
    local.Temp = data;
  }

  event void ReadHum.readDone(error_t result, uint16_t data) {
    if (result != SUCCESS) {
      data = 0xffff;
      report_problem();
    }
    local.Humedad = data;
   }

  event void ReadVolt.readDone(error_t result, uint16_t data) {
    if (result != SUCCESS) {
      data = 0xffff;
      report_problem();
    }
    local.Voltage = data;
  }
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

You are the experts, I am here to learn.
Salu2, regards!!!

_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to