构建基于CC2530和ESP8266的环境监测系统

一、CC2530核心板电路设计。

(1)器件选型,填写好选型表,粘贴在此。

器件名称及封装

所需数量

单价

MINI-USB

1

8.9

晶振

1

3.03

电容

6

0.08

LED

7

0.06

电阻

14

0.1

三极管

1

2.52

继电器

1

7.96

滑动电阻

1

9.8

开关

4

0.24

AMS117-3.3

1

2.65

CH340

1

12.8

(2)原理图设计–清楚截图并简要说明。

 

IO口配置我们需要配置的寄存器,外部中断需要配置三个寄存器,IRCON:中断标志4,;0为无中断请求。1为有中断请求。TIMIF:定时器1的溢出中断屏蔽与定时器3、4的中断标志。D6为定时器1的溢出中断屏蔽,0为屏蔽,1为使能,默认为1.D5~D0为定时器3和4中各个通道的中断标志,T3 定时器主要是配置三个寄存器,定时器3或定时器4的方式控制寄存器。

(3)PCB设计–清楚截图并简要说明。

定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil,在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。

二、CC2530底板电路设计。

(1)器件选型,填写好选型表,粘贴在此。

器件名称及封装

所需数量

单价

CC2530

1

20

电容

18

0.08

电阻

4

0.1

晶振

1

3.03

SMA

1

4.81

(2)原理图设计–清楚截图并简要说明。

CC2530 具有一个IEEE 802.15.4 兼容无线收发器。RF 内核控制模拟无线模块。另外,它提供了MCU 和无线设备之间的一个接口, 它有三种不同的内存访问总线(SFR,DATA 和CODE/XDATA),单周期访问SFR,DATA 和主SRAM。它还包括一个调试接口和一个18 输入扩展中断单元。 中断控制器总共提供了18 个中断源,分为六个中断组,每个与四个中断优先级之一相关

(3)PCB设计–清楚截图并简要说明。

在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil.

三、网关模块电路设计。

(1)器件选型,填写好选型表,粘贴在此。

器件名称及封装

所需数量

单价

MicroUSB

1

8.8

CH340

1

12.8

晶振

1

3.03

电容

5

0.08

LED

6

0.06

电阻

13

0.1

三极管

2

2.52

开关

2

0.24

ESP8266

1

28.00

继电器

1

7.96

DHT11

1

6.90

蜂鸣器

1

2.90

光敏电阻

1

3.3

(2)原理图设计–清楚截图并简要说明。

1、电源转换电路:对从USB接口输入的电流进行稳压稳流处理

2、USB转TTL电路:带电阻负载的BJT反相器,其动态性能不理想。在保持逻辑功能不变的前提下,可以另外增加若干元器以改善其动态性能,如减少由于BJT基区电荷存储效应和负载电容所引起的时延。

3、USB接口电路:传输电流以及信息

4、序号1~18组成9组的跳线帽:各个接口直接的连接与断开

5、ESP8266模块接口:主要模块,匹配串口实现数据传输

6、蜂鸣器:GPIO14引脚,低电平触发

7、光敏电路:光敏电路,实现感光效果

8、温湿度(DHT11)电路:测量温湿度

9、彩灯电路:R、G、B三色彩灯模块

10、按键和电路指示灯:系统重启按键,LED灯指示

11、继电器电路:电路控制模块,控制高低电压的流通

(3)PCB设计–清楚截图并简要说明。

定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil,在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。

包括:电源转换电路:ESP8266IO口、外部传感器电源接口、外部彩灯接口,ESP8266模块接口,USB转TTL电路及USB接口电路,蜂鸣器及光敏电路,温湿度(DHT11)电路,彩灯电路,按键和电路指示灯,继电器电路。

四、程序设计。

(1)CC2530数据采集关键代码并详细注释。

static void appSwitch()

{

 //   halLcdWriteLine(HAL_LCD_LINE_1, "Switch");

  //  halLcdWriteLine(HAL_LCD_LINE_2, "Joystick Push");

  //  halLcdWriteLine(HAL_LCD_LINE_3, "Send Command");

#ifdef ASSY_EXP4618_CC2420 //液晶模块的定义,我们不用管他

    halLcdClearLine(1);

    halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1);

#endif



   // pTxData[0] = LIGHT_TOGGLE_CMD;

   char data[APP_PAYLOAD_LENGTH]="DHT11:1&";

   // for(int i=0;0==data[i]-'0';i++)

   // {

   //   pTxData[i+1]=data[i];

   // }

   //  pTxData="DHT11:123&";

    //sprintf(pTxData,"%s",data);

   

    // Initialize BasicRF

    basicRfConfig.myAddr = SWITCH_ADDR;

    if(basicRfInit(&basicRfConfig)==FAILED) { //Basic RF 启动中的初始化,就是Basic RF 启动的第 3 步      HAL_ASSERT(FALSE);

    }

pTxData[0] = LIGHT_TOGGLE_CMD;//Basic RF 发射第 1 步,把要发射的数据或者命令放入一个数据 buffer,此处把灯状态改变的命令 LIGHT_TOGGLE_CMD 放到 pTxData 中。

        basicRfReceiveOff();//由于模块只需要发射,所以把接收屏蔽掉以降低功耗。



    // Main loop

    while (TRUE) {

      //  if( halJoystickPushed() ) {  / qiujie tech

      if(halButtonPushed()==HAL_BUTTON_1){ //按键 S1 被按下,if(halButtonPushed()==HAL_BUTTON_1)判断是否 S1 按下,函数halButtonPushed()是 halButton.c 里面的,它的功能是:按键 S1有 被 按 动 时 , 就 回 返 回 true ,则进入basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);



            basicRfSendPacket(LIGHT_ADDR, data, APP_PAYLOAD_LENGTH);

//Basic RF 发射第 2 步,也是发送数据最关键的一步,

            // Put MCU to sleep. It will wake up on joystick interrupt

            halIntOff();

            halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global

            // interrupt enable

            halIntOn();//使能中断发送的 appSwitch()讲解完毕,接下来就到我们的接收 appLight()函数了

        }

    }

}

(2)CC2530引脚控制关键代码并详细注释。

//函数声明

void Delay(uint);

void initUARTSEND(void);

void UartTX_Send_String(char *Data,int len);



char Txdata[50]={0};

void initUARTSEND(void)

{



    CLKCONCMD &= ~0x40;                       //设置系统时钟源为32MHZ晶振

    while(CLKCONSTA & 0x40);                     //等待晶振稳定

    CLKCONCMD &= ~0x47;                        //设置系统主时钟频率为32MHZ

  

 

    PERCFG = 0x00;             //位置1 P0口

    P0SEL = 0x3c;              //P0_2,P0_3,P0_4,P0_5用作串口

    P2DIR &= ~0XC0;                             //P0优先作为UART0



    U0CSR |= 0x80;             //UART方式

    U0GCR |= 11;                  

    U0BAUD |= 216;             //波特率设为115200

    UTX0IF = 0;                                 //UART0 TX中断标志初始置位0

}

(3)CC2530实现Zigbee数据传输关键代码并详细注释。

void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData  )

{

    char buf[32];

    //接收到数据之后LED灯闪烁

    HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );

    HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );

    if (len==6 && pData[0]==0xff) { 

      sprintf(buf, "DEVID:%02X SAddr:%02X%02X PAddr:%02X%02X",

                pData[5], pData[1], pData[2], pData[3], pData[4]);

      debug_str(buf);//将数据通过串口传递给上位机

    }

}



void zb_HandleOsalEvent( uint16 event )//用户处理函数

{



   if (event & ZB_ENTRY_EVENT) {//当有事件发送时

        uint8 startOptions;

        uint8 logicalType;

 

        zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType );//ZigBee读设置

        if ( logicalType != ZG_DEVICETYPE_ENDDEVICE )

          {

          logicalType = ZG_DEVICETYPE_ENDDEVICE;

   

          zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);// ZigBee写设置

        }



    

        zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );

        if (startOptions != ZCD_STARTOPT_AUTO_START) {

          startOptions = ZCD_STARTOPT_AUTO_START;//ZigBee自动绑定

          zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );

        }

      

        HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );//设置灯灭        HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH ); //设置灯闪烁

    

  }

 

  if ( event & MY_START_EVT )//当有消息请求时

  { 

    zb_StartRequest();

  }



  if (event & MY_REPORT_EVT) {//

   

    myReportData();//采集数据

    osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, REPORT_DELAY );// 返回成功或设定时间无效, 该函数是一个定时函数,网络组建成功后,每隔一段时间就会去执行

  }

}

(4)CC2530串口数据通信关键代码并详细注释。

void UartTX_Send_String(char *Data,int len)//串口发送字符串函数

{

  int j;

  for(j=0;j<len;j++)

  {

    U0DBUF = *Data++;

    while(UTX0IF == 0);

    UTX0IF = 0;

  }

}



static void appLight()

 {

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

 halLcdWriteLine(HAL_LCD_LINE_1, "Light");

 halLcdWriteLine(HAL_LCD_LINE_2, "Ready");

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

 #ifdef ASSY_EXP4618_CC2420LCD// 内容暂时不用理它

 halLcdClearLine(1);

 halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1);

 #endif

 // Initialize BasicRF

 basicRfConfig.myAddr = LIGHT_ADDR;

 if(basicRfInit(&basicRfConfig)==FAILED) {//Basic RF 启动中的初始化,上面 Basic RF 启动的第 3 步

 HAL_ASSERT(FALSE);

 }

 basicRfReceiveOn();//函数 basicRfReceiveOn(),开启无线接收功能,调用这个函数后模块一直会接收,除非再调用 basicRfReceiveOff()使它关闭接收。

 // Main loop

    while (TRUE) { //程序开始进行不断扫描的循环

        while(!basicRfPacketIsReady());//Basic RF 接收的第 1 步,while(!basicRfPacketIsReady()) 检查是否接收上层数据,        char shuju[20]={0};

        //Basic RF 接收的第 2步,if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH,NULL)>0)判断否接收到有数据

    // UartTX_Send_String(shuju,APP_PAYLOAD_LENGTH);

        if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {

//if(pRxData[0] == LIGHT_TOGGLE_CMD)判断接收到的数据是否就是发送函数里面的 LIGHT_TOGGLE_CMD

            //if(pRxData[0] == LIGHT_TOGGLE_CMD) {

               //    UartTX_Send_String(pRxData[0],APP_PAYLOAD_LENGTH);   

                        //shuju[0]=pRxData[1];

           UartTX_Send_String(pRxData,strlen(pRxData));

             // strcpy(Txdata,"1");       //将UART0 TX test赋给Txdata;

              //UartTX_Send_String(pRxData,strlen(pRxData)); //串口发送数据

                halLedToggle(1); //halLedToggle(1),改变 Led1 的状态。

           // }

        }

}

}

(5)网关模块模式控制及数据发送关键代码并详细注释。

//串口0数据接收函数

void UartData_cb(uint8 c){

    //插入数据到缓冲RxData

    RxData[RxLen]=c;

    //os_sprintf(RxData,"%s","DHT11:123&");

    //os_printf("RxData1:%24s\n",RxData);



    //RxData[RxLen];



    RxLen++;//每接收一个数据长度加一

    if(c=='&'){

    //os_printf("RxData:%s\n",RxData);

    if(RxLen>=MAX_LEN) RxLen=0;//数据接收长度超出了范围,清零

    char *PA;

    char *PB;



       PA=strstr(RxData,"DHT11:");

       PA+=6;

       PB=strstr(PA,"&");

           os_memcpy(data.pc,PA,PB-PA);//清空,准备下次继续接收数据

//DHT11:2^45#& 23^45

//DHT11:28^71#&

           char *PA1;

           char *PB1;

           char *PA2;

           PA1=PA;

           PB1=strstr(PA1,"^");

           //pc:28^72#    wendu:28^72#&     shidu:^72

           os_memcpy(data.wendu,PA1,PB1-PA1);//读取温度数据

           PA2=PB1+1;

           char *PC;

           PC = strstr(PA2,"#");

           os_memcpy(data.shidu,PA2,PC-PA2);//读取湿度数据

              os_printf("pc:%s\t",data.pc);

              os_printf("wendu:%s\n\t",data.wendu);

              os_printf("shidu:%s\n\t",data.shidu);

    //收到#号结束就去控制灯

              ets_memset(RxData, 0, MAX_LEN);

              RxLen=0;

    }



}

void ICACHE_FLASH_ATTR

Wifi_conned(void *arg)

{

    static uint8 count=0;

    uint8 status;



    os_timer_disarm(&connect_timer);

    count++;



    //检测STA连接状态

    status=wifi_station_get_connect_status();

    if(status==STATION_GOT_IP)

    {

       os_printf("Wifi connect success!");



       //如果连接成功

       //启动一个服务器

       struct ip_info info;

       const char remote_ip[4]={192,168,1,102};

       wifi_get_ip_info(STATION_IF,&info);



       os_printf("\r\n------STA ip:%d.%d.%d.%d.---------\r\n",

                  ip4_addr1(&info.ip.addr),

                  ip4_addr2(&info.ip.addr),

                  ip4_addr3(&info.ip.addr),

                  ip4_addr4(&info.ip.addr));





       //启动TCP服务器,端口哦80,webservice默认port是80

       server_init(&info.ip,80);

       return;

    }

    else

    {

       if(count>=7)//等待超时

       {

           os_printf("Wifi connect fail!");

           return;

        }

    }



    os_timer_arm(&connect_timer,2000,false);

}

(6)网页设计核心代码段并添加必要注释

<html><head>//使用AJAX,异步刷新

<meta http-equiv=Content-Type content="text/html; charset=utf-8">

<title>室内环境监控</title>

<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'/>

<style type="text/css">



</style>

<body style="background-color: #f9e79f ">

<center>

<div>

<br><br><br>

<h1>基于WiFi的室内环境监控系统</h1>

 

</div>

 <br>

<div><h2>

  温度: <span id="temp_val">0</span>

  <span id="Tdanwei"> ℃</span><br><br>



   湿度: <span id="humi_val">0</span>

  <span id="Hdanwei"> %RH</span><br><br>





</h2>

</div>

<script>

let status=false;

let status1=false;

setInterval(function()

{

  getTempData();

  getHumiData();

}, 700);

function getTempData() {

if(status)x.abort();

  var xhttp = new XMLHttpRequest();

status=true;

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

status=false;

      document.getElementById("temp_val").innerHTML =

      this.responseText;//把接收的数据转换为文本

    }

  };

  xhttp.open("GET", "tempread", true);//配置参数

  xhttp.send();//发送数据

}

function getHumiData() {

if(status1)x.abort();

  var xhttp = new XMLHttpRequest();

status1=true;

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

status1=false;

      document.getElementById("humi_val").innerHTML =

      this.responseText;

    }

  };

  xhttp.open("GET", "humiread", true);

  xhttp.send();

}

</script>

</center>

</body>

</html>

五、项目总结。要求:从电路原理、驱动程序设计、问题攻克、意义等方面展开总结,不少于500字。

CC2530核心板中IO口配置我们需要配置的寄存器,外部中断需要配置三个寄存器,IRCON:中断标志4,;0为无中断请求。1为有中断请求。TIMIF:定时器1的溢出中断屏蔽与定时器3、4的中断标志。D6为定时器1的溢出中断屏蔽,0为屏蔽,1为使能,默认为1.D5~D0为定时器3和4中各个通道的中断标志,T3 定时器主要是配置三个寄存器,定时器3或定时器4的方式控制寄存器。CC2530 具有一个IEEE 802.15.4 兼容无线收发器。RF 内核控制模拟无线模块。另外,它提供了MCU 和无线设备之间的一个接口, 它有三种不同的内存访问总线(SFR,DATA 和CODE/XDATA),单周期访问SFR,DATA 和主SRAM。它还包括一个调试接口和一个18 输入扩展中断单元。 中断控制器总共提供了18 个中断源,分为六个中断组,每个与四个中断优先级之一相关。

ESP8266 可以控制蜂鸣器,继电器,一个LED灯的颜色,蜂鸣器,光敏电路,DHT11,按键控制等,支持IIC总线,支持UART,可支持一个数字输入/输出口,不能直接接入模拟输入/输出设置,通过WIFI连接其他设备进行通信,可以采用AP模式,STA+AP模式工作。包括:电源转换电路:ESP8266IO口、外部传感器电源接口、外部彩灯接口,ESP8266模块接口,USB转TTL电路及USB接口电路,蜂鸣器及光敏电路,温湿度(DHT11)电路,彩灯电路,按键和电路指示灯,继电器电路。

在画PCB板时定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil,在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。在画电路图时有部分电子元件在库里面没有,需要我们在网上下载包含了对应元器件的元件库导入进去,或者也可以自己画出来,在铺设PCB板时,如果为了图快,直接选择自动布线会出现后续用的时候线之间会有干扰,导致结果出不来。但是毕竟只有2天时间,为了省时间还是选择了自动布线,在设置孔尺寸时一样的电子元件要设置一样的孔径。

在物联网短距离通信课上学到可以用CC2530与其他CC2530板子通信,用一个协调器,一个路由,一个终端,前提是它必须在一个Zigbee无线局域网里,如果它还没有入网,那么它仅仅是一个下载了响应功能代码的模块而已。下载了路由器和终端代码的模块,上电后第一件事是去寻找网络,请求加入;网络是不会平白无故产生的,所以创建网络这个工作由下载了协调器代码的模块来完成,下载协调器代码的模块上电的第一件事是去创建网络。任何一个网络,第一个节点一定是该网络的协调器,一个网络里有且仅有一个协调器。

ESP8266支持3种工作模式”STA”、“AP”、“STA+AP”模式。STA模式:该模块通过路由器连接网络,手机或者电脑实现该设备的远程控制。AP模式:该模块作为热点,手机或者电脑连接wifi与该模块通信,实现局域网的无线控制。STA+AP模式:两种模式共存,既可以通过路由器连接到互联网,也可以作为WiFi热点,使其他设备连接到这个模块,实现广域网与局域网的无缝切换。

物联沃分享整理
物联沃-IOTWORD物联网 » 构建基于CC2530和ESP8266的环境监测系统

发表评论