📄 temperature.c
字号:
#ifndef ENABLE_DEBUG
//#define ENABLE_DEBUG
#endif
#include <string.h>
#include "msstate_lrwpan.h"
#include "MAC.h"
#include <stdlib.h>
#include "SensorComm.h"
#define APP_TAG_STARTUP (0)
#define APP_TAG_INITED (1)
#define APP_TAG_JOINREQUESTED (2)
#define APP_TAG_JOINEDGROUP (3)
#define APP_TAG_ADDITIONALlISTEN (4)
#define APP_CAPTAIN_STARTUP (5)
#define APP_CAPTAIN_INITED (6)
#define APP_CAPTAIN_CALLING (7)
#define APP_CAPTAIN_REPLACECAPTAIN (8)
#define STARTUP_MSG "ZigBee Demo RFD Application v1.0"
#define MAC_RESPONSE_WAITFOR_DURATION (50)
#define MAC_ACK_WAITFOR_DURATION (50)
#define QUERY_INT_DURATION (200)
#define MAC_QUERY_WAIT_DURATION (25)
#define MAC_WAITFOR_QUERY_DURATION (250)
#define PHYSetChannel(x) macSetChannel(x)
#define PHYGetPhyChannel() macGetChannel()
#define PHYSetTxPower(x) halSetTxPower(x)
#define GRADIENT_C 0.01496
#define OFFSET_C -300 //偏移量,此参数需要标定
#define ADC14_TO_CELSIUS(ADC_VALUE) \
( (float)ADC_VALUE *(float)GRADIENT_C + OFFSET_C)
#define GRADIENT_F (9.0/5.0 * GRADIENT_C)
#define OFFSET_F (9.0/5.0 * OFFSET_C) + 32
#define ADC14_TO_FARENHEIT(ADC_VALUE) \
( (float)ADC_VALUE *(float)GRADIENT_F + OFFSET_F)
/*Ref: 1,25 V, Resolution: 14bit, Temperature Sensor */
#define SAMPLE_TEMP_SENSOR(v) \
do{ \
ADCCON2 = 0x3E; \
ADCCON1 = 0x73; \
while(!(ADCCON1 & 0x80)); \
v = ADCL; \
v |= (((unsigned int)ADCH) << 8); \
}while(0)
REPDATTOSENSORREC RepDatToSensorRec[MAXREPRECNUM];
BYTE ChannelIdx=0;
BYTE NewChannelIdx,GroupChannelIdx,NormalChannelIdx,NewGroupChannel;
NODE_STUTAS ThisNode;
TICK LedChangeTime;
TICK TAGLastConnectTime;
TICK TAGAddtionalListenTime;
TICK TAGOnlineStartTime;
TICK CAPTAINBroadcastStartTime;
TICK CAPTAINLastCallingTime;
TICK SENSORLastBroadcastTime;
TICK CAPTAINSingleCallingTime;
TICK SENSORLastReportTime;
BYTE WatchDogReset=0;
TICK CAPTAINLastSleepTime;
TICK ChannelStatiTime;
BYTE APPSTATE;
BYTE SensorInfo=0;
BYTE JoinReqCount=0;
BYTE DebugCode=0;
BYTE mainLoop=0;
BYTE UART0rcvBuf[200];
BYTE UART0rcvBuf2[200];
BYTE datalen=0,datalen2=0;
BYTE wlsendbuf[8];
float temperture;
extern void WirelessSendData(BYTE frame);
extern void Delay(WORD i);
//获取温度值函数
float getTemp(void){
unsigned int value;
SAMPLE_TEMP_SENSOR(value); //采样温度
//return value;
return ADC14_TO_CELSIUS(value); //返回AD采样值
// return ADC14_TO_FARENHEIT(value);
}
void _changetochannel(BYTE idx) //切换信道
{
ISRFOFF; //晶振关闭
PHYSetChannel(idx); //切换信道物理层函数
ISRXON; //晶振打开
ChannelIdx=idx;
}
void ChangeToNormalChannel(void) //切换到公用信道函数
{
ConsolePutROMString("切换到公用信道:");
ConsolePutInitData(0,NormalChannelIdx); //输出调试信息
_changetochannel(NormalChannelIdx); //切换信道
}
void ChangeToChannel(BYTE chlidx) //切换到指定信道函数
{
ConsolePutROMString("切换到信道(11~26):");
ConsolePutInitData(0,chlidx);
_changetochannel(chlidx);
}
void SleepSomeTime(int time) //休眠函数
{
ConsolePutROMString("休眠:");
ConsolePutInitData(0,time);
ISRFOFF; //晶振关闭
halSleep(time+100); //休眠
ISRXON; //晶振打开
ConsolePutROMString("唤醒\r\n");
}
BYTE DebugParam[20];
BYTE DebugParamLen;
void WirelesDebugOut(BYTE code) //无线发送调试信息函数
{
BYTE OldChlIdx;
OldChlIdx=ChannelIdx;
DebugCode=code;
ChangeToChannel(DEBUGCHANNEL);
WirelessSendData(MSG_DEBUG_OUT);
DebugParamLen=0;
ChangeToChannel(OldChlIdx);
}
int TickGetDiff(TICK now,TICK start) //返回值单位:50ms
{
return halMACTimerDelta(now,start) *50/LRWPAN_SYMBOLS_PER_SECOND;
}
void Delay(WORD i)
{
while( i-- );
}
void Delayx(WORD i)
{
while( i-- )
while( i-- );
}
void MainLoop(void) //主循环函数
{
BYTE TxPower;
BYTE rst;
unsigned int xyz=0;
NormalChannelIdx=COMMCHANNEL;
ChangeToNormalChannel(); //切换信道到公用信道
#if defined(IAMTAG)
TxPower =TAG_TXPOWER;
#else
TxPower =SENSOR_TXPOWER; //设置发射功率,标签与节点的功率设置不同
#endif
PHYSetTxPower(TxPower);//设置发射功率//0~7;0-min ; 7-max
ThisNode.NODEID[0] = macInfo.longAddr.v[0];
ThisNode.NODEID[1] = macInfo.longAddr.v[1];
ThisNode.MEMBERNUM = 0;
JoinReqCount=0;
ThisNode.NODESTATE = GROUP_MEMBER;
APPSTATE=APP_TAG_STARTUP;
#if defined(IAMSENSOR)
for(i=0;i<MAX_GROUPINSENSOR_NUM;i++)
{
GroupList[i].USED=0;
}
#endif
srand(ThisNode.NODEID[0]*256+ThisNode.NODEID[1]);
CAPTAINLastSleepTime=TickGet();
SENSORLastReportTime=0;
DebugParamLen=0;
rst=(SLEEP>>0x03)&0x03;
#if defined(IAMTAG)
WirelesDebugOut(DEBUG_HARDWARE_RESET);
if(rst==0x02)//看门狗复位
{
ConsolePutROMString("watch dog reset\r\n");
WirelesDebugOut(DEBUG_WATCHDOG_RESET);
WatchDogReset=0;
}
if(rst==0x00)//看门狗复位
{
ConsolePutROMString("Power-on reset\r\n");
WatchDogReset=0;
}
if(rst==0x01)//看门狗复位
{ //ConsolePutROMString("External reset\r\n");
WatchDogReset=0;
}
#endif
//WDT_SET_TIMEOUT_PERIOD(M_SEC_250); //设置看门狗时间值
//WDT_ENABLE(); //使能看门狗
Delay(4000);
mainLoop=1;
macFSM();
while (1)
{
//WDT_RESET(); //看门狗喂狗
//SleepSomeTime(100); //休眠
macFSM(); //mac层通讯处理
if(submacCurrentFrame.sub_type.Val==0x20) //若收到数据
{
P0_0=~P0_0; //改变红灯状态
ConsolePutROMString("当前温度:\r\n"); //串口输出当前温度字符
ConsolePutInitData(0,submacCurrentFrame.data[0]); //串口输出当前温度值
}
if(xyz==0) //定时时间到
{
P0_1=~P0_1; //改变绿灯状态
temperture=getTemp(); //获取当前温度值
WirelessSendData(MSG_TAG_ISANYCAPTAINHERE); //将温度值无线广播发送出去
}
xyz++;
if(xyz>8000)xyz=0;
continue;
}
}
void ResetsubmacCurrentFrame(void)
{
submacCurrentFrame.sub_type.Val=0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -