I am Using IM920 Sub-GHz module for transmitting data. Now the problem is when I transfer data it's sending continuously. But I want to send data only when the data value will be changed. Ex: Temp=24.4 so data transmit one time and wait until the Temp=24.0 or Temp=24.5 when the value is changed only send data.
Below is my present code:
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet2.h>
#include <avr/pgmspace.h>
#include <EEPROM.h>
#include <Uardecs_mega.h>
#include <Wire.h>
#define OPRMODE_ERR_SHT2xSENSERR 0x20000000 //0 01000 00000 0 0000 0000000000000000 //Sensor error
char SHT2x_sensSts;
unsigned char SHT2x_errcount=0;
SoftwareSerial im920serial (10, 11);// RX TX
/////////////////////////////////////
//IP reset jupmer pin setting
/////////////////////////////////////
const byte U_InitPin = 3;
const byte U_InitPin_Sense=HIGH;
////////////////////////////////////
//Node basic infomation
///////////////////////////////////
const char U_name[] PROGMEM= "TempHumid Node";//MAX 20 chars
const char U_vender[] PROGMEM= "WARC/NARO";//MAX 20 chars
const char U_uecsid[] PROGMEM= "000000000000";//12 chars fixed
const char U_footnote[] PROGMEM= "SHT2x Sensor Node";
char U_nodename[20] = "node";//MAX 19chars (This value enabled in safemode)
UECSOriginalAttribute U_orgAttribute;//
//////////////////////////////////
// html page1 setting
//////////////////////////////////
//Total number of HTML table rows.
const int U_HtmlLine = 0;
struct UECSUserHtml U_html[U_HtmlLine]={
};
//////////////////////////////////
// UserCCM setting
//////////////////////////////////
enum {
CCMID_InAirTemp,
CCMID_InAirHumid,
CCMID_InAirHD,
CCMID_cnd,
CCMID_dummy,
};
//CCM Declaration of CCM storage variable
//
const int U_MAX_CCM = CCMID_dummy;
UECSCCM U_ccmList[U_MAX_CCM];
//CCM definition material
const char ccmNameTemp[] PROGMEM= "Temperature";
const char ccmTypeTemp[] PROGMEM= "InAirTemp";
const char ccmUnitTemp[] PROGMEM= "C";
const char ccmNameHumid[] PROGMEM= "Humid";
const char ccmTypeHumid[] PROGMEM= "InAirHumid";
const char ccmUnitHumid[] PROGMEM= "%";
const char ccmNameHD[] PROGMEM= "HumidDiff";
const char ccmTypeHD[] PROGMEM= "InAirHD.mIC";
const char ccmUnitHD[] PROGMEM= "g m-3";
const char ccmNameCnd[] PROGMEM= "NodeCondition";
const char ccmTypeCnd[] PROGMEM= "cnd.mIC";
const char ccmUnitCnd[] PROGMEM= "";
//------------------------------------------------------
void UserInit(){
//MAC address is printed on sticker of Ethernet Shield.
//You must assign unique MAC address to each nodes.
U_orgAttribute.mac[0] = 0x12;
U_orgAttribute.mac[1] = 0x34;
U_orgAttribute.mac[2] = 0x56;
U_orgAttribute.mac[3] = 0x78;
U_orgAttribute.mac[4] = 0x9A;
U_orgAttribute.mac[5] = 0xBC;
UECSsetCCM(true, CCMID_InAirTemp, ccmNameTemp, ccmTypeTemp, ccmUnitTemp, 29, 1, A_10S_0);
UECSsetCCM(true, CCMID_InAirHumid, ccmNameHumid, ccmTypeHumid, ccmUnitHumid, 29, 1, A_10S_0);
UECSsetCCM(true, CCMID_InAirHD, ccmNameHD, ccmTypeHD, ccmUnitHD, 29, 2, A_10S_0);
UECSsetCCM(true, CCMID_cnd , ccmNameCnd , ccmTypeCnd , ccmUnitCnd , 29,0, A_1S_0);
}
//---------------------------------------------------------
void OnWebFormRecieved(){
}
//float myftemp;
//float myfhumd;
int x = 100;
long myresulttemp;
long myresulthumd;
//---------------------------------------------------------
void UserEverySecond(){
U_ccmList[CCMID_cnd].value=0;
if(SHT2x_errcount>3)
{
SHT2x_errcount=4;
U_ccmList[CCMID_cnd].value|=OPRMODE_ERR_SHT2xSENSERR;
}
//------------------Temperature measurement (once every three seconds)
static char count=0;
count++;
if(count %3==1)
{
double t=SHT2x_GetTemperature();
double rh=SHT2x_GetHumidity();
if(SHT2x_sensSts)
{
SHT2x_errcount++;
}
else{
SHT2x_errcount=0;
U_ccmList[CCMID_InAirTemp].value=(long)(t*10);
U_ccmList[CCMID_InAirHumid].value=(long)(rh*10);
}
//
double humidpress=6.1078*pow(10,(7.5*t/(t+237.3)));
double humidvol=217*humidpress/(t+273.15);
U_ccmList[CCMID_InAirHD].value=(100-rh)*humidvol;//Since a small number is the lower two digits, it outputs as it is
myresulttemp = t * x;
myresulthumd = rh * x;
Serial.print ("Temp:");
Serial.println (myresulttemp, HEX);
Serial.print ("Humd:");
Serial.println (myresulthumd, HEX);
im920serial.print("TXDA 0");
im920serial.print (myresulttemp, HEX);
im920serial.println (myresulthumd, HEX);
}
//Serial.print(t);
//------------------------------------------------Stop CCM transmission on error
if(SHT2x_errcount)
{
U_ccmList[CCMID_InAirTemp].flagStimeRfirst=false;
U_ccmList[CCMID_InAirHumid].flagStimeRfirst=false;
U_ccmList[CCMID_InAirHD].flagStimeRfirst=false;
}
}
//---------------------------------------------------------
void UserEveryMinute(){
}
//---------------------------------------------------------
void UserEveryLoop(){
}
//---------------------------------
void loop(){
UECSloop();
}
//---------------------------------
void setup(){
Serial.begin (19200);
im920serial.begin (19200);
Wire.begin();
UECSsetup();
}
//-Sensor - SHT2x
#define eSHT2xAddress 0x40
#define eTempHoldCmd 0xE3
#define eRHumidityHoldCmd 0xE5
#define eTempNoHoldCmd 0xF3
#define eRHumidityNoHoldCmd 0xF5
double SHT2x_GetHumidity(void)
{
return (-6.0 + 125.0 / 65536.0 * (double)(SHT2x_readSensor(eRHumidityHoldCmd)));
}
double SHT2x_GetTemperature(void)
{
return (-46.85 + 175.72 / 65536.0 * (double)(SHT2x_readSensor(eTempHoldCmd)));
}
uint16_t SHT2x_readSensor(uint8_t command)
{
uint16_t result;
Wire.beginTransmission(eSHT2xAddress);
Wire.write(command);
delay(5);
SHT2x_sensSts=Wire.endTransmission();
if(SHT2x_sensSts){return 0;}
Wire.requestFrom(eSHT2xAddress, 3);
if(Wire.available()==3)
{
result = ((Wire.read()) << 8);
result += Wire.read();
result &= ~0x0003; // clear two low bits (status bits)
return result;
}
else
{
SHT2x_sensSts=4;
return 0;
}
}
Anyone, please help me on this issue.
Thanks In advance.