#物联网征文# 基于CC2530(ZigBee设计)的温度报警器 原创 精华

DS小龙哥
发布于 2022-8-8 09:31
浏览
1收藏

1. 功能介绍

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

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

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

资料包里包含:

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

2. 硬件接线介绍

2.1 DS18B20温度传感器

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

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

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

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

2.2 ESP8266 WIFI模块

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

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

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

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

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

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

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

3. 案例代码

3.1 QT设计的上位机

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

#物联网征文# 基于CC2530(ZigBee设计)的温度报警器-鸿蒙开发者社区

3.2 B节点DS18B20代码

#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<k;i++)
        for(j=0;j<2;j++);
}

void Ds18b20InputInitial(void)//设置端口为输入
{
    P0DIR &= (1<<6);  //P0.7到P0.0的I/O方向   0输入 1输出
}

void Ds18b20OutputInitial(void)//设置端口为输出
{
    P0DIR |= (1<<6);
}

//ds18b20初始化  初始化成功返回0x00,失败返回0x01
unsigned char Ds18b20Initial(void)
{
    unsigned char Status = 0x00;
    unsigned int CONT_1 = 0;
    unsigned char Flag_1 = 1;
    Ds18b20OutputInitial();
    Ds18b20IO = 1;      //DQ复位
    Ds18b20Delay(260);  //稍做延时
    Ds18b20IO = 0;      //单片机将DQ拉低
    Ds18b20Delay(750);  //精确延时 大于 480us 小于960us
    Ds18b20IO = 1;      //拉高总线
    Ds18b20InputInitial();//设置IO输入
    while((Ds18b20IO != 0)&&(Flag_1 == 1))//等待ds18b20响应,具有防止超时功能
    {                                      //等待约60ms左右
        CONT_1++;
        Ds18b20Delay(10);
        if(CONT_1 > 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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.

3.3 协调器-ESP8266代码

#include "esp8266.h"

uint lenU1 = 0;
uchar tempRXU1;
uchar  RecdataU1[MAXCHAR];
//AP+服务器模式
char *ESP8266_AP_Server[]=
{
    "AT\r\n",
    "ATE0\r\n",
    "AT+CWMODE=2\r\n",
    "AT+RST\r\n",
    "ATE0\r\n",
    "AT+CWSAP=\"wbyq_Cortex_M3\",\"12345678\",1,4\r\n",
    "AT+CIPMUX=1\r\n",
    "AT+CIPSERVER=1,8089\r\n",
    "AT+CIFSR\r\n" 
};


//"AT+CIPSEND=0,10\r\n"   //长度10
//返回">" 之后就可以正常发送数据了
//发送成功返回 "SEND OK"


//发送数据
void ESP8266_SendData(char *p,int len)
{
   char buff[50];
   sprintf(buff,"AT+CIPSEND=0,%d\r\n",len);
   clearBuffU1();
   Uart1_Send_String(buff);
   DelayMs(1000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   clearBuffU1();
    
   //发送数据
   Uart1_Send_String(p);
   
   //等待发送完成
   DelayMs(1000);
   
   RecdataU1[lenU1]='\0';
   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("AT\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("ATE0\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("AT+CWMODE=2\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
    clearBuffU1();
   Uart1_Send_String("AT+RST\r\n");
   DelayMs(2000);
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("ATE0\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("AT+CWSAP=\"wifi_cc2530\",\"12345678\",1,4\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("AT+CIPMUX=1\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("AT+CIPSERVER=1,8080\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   UR0SendString(RecdataU1);
   
   clearBuffU1();
   Uart1_Send_String("AT+CIFSR\r\n");
   DelayMs(2000);
   RecdataU1[lenU1]='\0';
   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<MAXCHAR;j++)
  {
    RecdataU1[j]=0x00;
  }
  lenU1=0;
}

/*******************************************************************************
串口1发送一个字节函数			
*******************************************************************************/
void Uart1_Send_Char(char Data)
{
	U1CSR &= ~0x40;      //禁止接收
	U1DBUF = Data;
	while(UTX1IF == 0);
	UTX1IF = 0;
	U1CSR |= 0x40;      //允许接收
}

/*******************************************************************************
串口1发送字符串函数			
*******************************************************************************/
void Uart1_Send_String(char *Data)
{
      while(*Data!='\0')
      {
        Uart1_Send_Char(*Data);
        Data++;
      }
}


/**************************************************************** 
串口接收一个字符: 一旦有数据从串口传至CC2530, 则进入中断,将接收到的数据赋值给变量temp. 
****************************************************************/ 
#pragma vector = URX1_VECTOR 
__interrupt void UART1_ISR(void) 
{ 
  if(lenU1<81)
  {
    tempRXU1 = U1DBUF;
    RecdataU1[lenU1]=tempRXU1;
    
    URX1IF = 0;    // 清中断标志 
    lenU1++;
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.

【本文正在参加物联网有奖征文活动】,活动链接: https://ost.51cto.com/posts/14758

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
3
收藏 1
回复
举报
3
1
1
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

楼主用到不同板子开发的资料一般是有厂商提供还是网上查找呢?

回复
2022-8-8 10:28:54


回复
    相关推荐