基于CC2530(ZigBee设计)的温度报警器

目录

1. 功能介绍

2. 硬件接线介绍

2.1 DS18B20温度传感器

2.2 ESP8266 WIFI模块

3. 案例代码

3.1 QT设计的上位机

3.2 B节点DS18B20代码

3.3 协调器-ESP8266代码

1. 功能介绍

这是基于CC2530设计的远程温度报警器,通过CC2530终端检测环境温度上传给手机APP实时显示。

一共有两块CC2530开发板,这里就分别称为A板(当做协调器)、B板(当做温度节点),A板上接了ESP8266 WIF模块,用于与手机APP之间通信。B板上接了DS18B20 温度传感器模块,用于给A板传递检测的温度,A板收到DS18B20的温度之后,发送给手机APP显示。APP上位机采用Qt框架设计,支持跨平台,Android、windows、IOS、Linux都可以编译运行安装。

​编辑

资料包里包含:

2. 硬件接线介绍

2.1 DS18B20温度传感器

作为B节点的CC2530开发板上接了DS18B20温度传感器,采集温度传递给A节点。

这是B节点的程序,在主函数1秒采集一次DS18B20温度数据,然后传递给A节点。

2.2 ESP8266 WIFI模块

作为A节点协调器的CC2530开发板用到了2个串口:

(1)串口0—作为常规调试串口,可以向串口调试助手打印调试信息。

(2)串口1—连接ESP8266 WIFI,进行通信。 P0.4,P0.5用作串口

上面这张图是代码的截图,设置ESP8266的AP热点名称和密码。 把ESP8266接线接好之后,在把程序下载进去。 正常情况下,ESP8266就会创建一个名称为” wbyq_Cortex_M3” 的热点,连接密码为”12345678”, 这是打开手机APP搜索这个WIFI名称,然后连接即可,连接上了,打开专用的手机APP,点击连接服务器,然后就可以收到ESP8266发送过来的温度数据了。

下面这个是代码主函数里,1秒的频率向APP上传DS18B20的温度。

3. 案例代码

3.1 QT设计的上位机

​编辑

3.2 B节点DS18B20代码

代码也可以在这里下载:https://download.csdn.net/download/xiaolong1126626497/75315395

#define Ds18b20IO P0_6 //温度传感器引脚

void Delay_us(unsigned int k)//us延时函数

{

T1CC0L = 0x06;

T1CC0H = 0x00;

T1CTL = 0x02;

while(k)

{

while(!(T1CNTL >= 0x04));

k–;

}

T1CTL = 0x00; //关闭定时器

}

void Delay_ms(unsigned int k)

{

T1CC0L = 0xe8;

T1CC0H = 0x03;

T1CTL = 0x0a; //模模式 32分频

while(k)

{

while(!((T1CNTL >= 0xe8)&&(T1CNTH >= 0x03)));

k–;

}

T1CTL = 0x00; //关闭定时器

}

void Delay_s(unsigned int k)

{

while(k)

{

Delay_ms(1000);

k–;

}

}

//时钟频率为32M

void Ds18b20Delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i 8000)Flag_1 = 0;

Status = Ds18b20IO;

}

Ds18b20OutputInitial();

Ds18b20IO = 1;

Ds18b20Delay(100);

return Status; //返回初始化状态

}

void Ds18b20Write(unsigned char infor)

{

unsigned int i;

Ds18b20OutputInitial();

for(i=0;i<8;i++)

{

if((infor & 0x01))

{

Ds18b20IO = 0;

Ds18b20Delay(6);

Ds18b20IO = 1;

Ds18b20Delay(50);

}

else

{

Ds18b20IO = 0;

Ds18b20Delay(50);

Ds18b20IO = 1;

Ds18b20Delay(6);

}

infor >>= 1;

}

}

unsigned char Ds18b20Read(void)

{

unsigned char Value = 0x00;

unsigned int i;

Ds18b20OutputInitial();

Ds18b20IO = 1;

Ds18b20Delay(10);

for(i=0;i<8;i++)

{

Value >>= 1;

Ds18b20OutputInitial();

Ds18b20IO = 0;// 给脉冲信号

Ds18b20Delay(3);

Ds18b20IO = 1;// 给脉冲信号

Ds18b20Delay(3);

Ds18b20InputInitial();

if(Ds18b20IO == 1) Value |= 0x80;

Ds18b20Delay(15);

}

return Value;

}

//温度读取函数 带1位小数位

float floatReadDs18B20(void)

{

unsigned char V1,V2; //定义高低8位 缓冲

unsigned int temp; //定义温度缓冲寄存器

float fValue;

Ds18b20Initial();

Ds18b20Write(0xcc); // 跳过读序号列号的操作

Ds18b20Write(0x44); // 启动温度转换

Ds18b20Initial();

Ds18b20Write(0xcc); //跳过读序号列号的操作

Ds18b20Write(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

V1 = Ds18b20Read(); //低位

V2 = Ds18b20Read(); //高位

//temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据

temp=V2*0xFF+V1;

fValue = temp*0.0625;

return fValue;

};i++)>

3.3 协调器-ESP8266代码

#include “esp8266.h”

uint lenU1 = 0;

uchar tempRXU1;

uchar RecdataU1[MAXCHAR];

//AP+服务器模式

char *ESP8266_AP_Server[]=

{

“ATrn”,

“ATE0rn”,

“AT+CWMODE=2rn”,

“AT+RSTrn”,

“ATE0rn”,

“AT+CWSAP=”wbyq_Cortex_M3″,”12345678″,1,4rn”,

“AT+CIPMUX=1rn”,

“AT+CIPSERVER=1,8089rn”,

“AT+CIFSRrn”

};

//”AT+CIPSEND=0,10rn” //长度10

//返回”>” 之后就可以正常发送数据了

//发送成功返回 “SEND OK”

//发送数据

void ESP8266_SendData(char *p,int len)

{

char buff[50];

sprintf(buff,”AT+CIPSEND=0,%drn”,len);

clearBuffU1();

Uart1_Send_String(buff);

DelayMs(1000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

//发送数据

Uart1_Send_String(p);

//等待发送完成

DelayMs(1000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

}

/****************************************************************************

* 名 称: SetWifi()

* 功 能: 设置LED灯相应的IO口

* 入口参数: 无

* 出口参数: 无

****************************************************************************/

void SetWifi(void)

{

P0DIR |= 0x40; //P0.6定义为输出

IGT = 0; //高电平复位

DelayMs(500);

IGT = 1; //低电平工作

}

/*

设置WIFI为AP模式+TCP服务器

*/

void SetESP8266_AP_TCP_Server()

{

clearBuffU1();

Uart1_Send_String(“ATrn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“ATE0rn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“AT+CWMODE=2rn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“AT+RSTrn”);

DelayMs(2000);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“ATE0rn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“AT+CWSAP=”wifi_cc2530″,”12345678″,1,4rn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“AT+CIPMUX=1rn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“AT+CIPSERVER=1,8080rn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

clearBuffU1();

Uart1_Send_String(“AT+CIFSRrn”);

DelayMs(2000);

RecdataU1[lenU1]=’�’;

UR0SendString(RecdataU1);

}

unsigned char dataRecv;

unsigned char Flag = 0;

/*===================UR1初始化函数====================*/

void Init_Uart1()

{

PERCFG = 0x00; //位置1 P0.4/P0.5口

P0SEL |= 0x30; //P0.4,P0.5用作串口(外部设备功能)

U1CSR |= 0x80; //设置为UART方式

U1GCR |= 11; //BAUD_E

U1BAUD |= 216; //BAUD_M 波特率设为115200

UTX1IF = 0; //UART1 TX中断标志初始置位0

U1CSR |= 0X40; //允许接收

IEN0 |= 0x88; // 开总中断,UART1接收中断

}

void clearBuffU1(void)

{

int j;

for(j=0;j;j++)>

​审核编辑:汤梓红