收藏官网首页
查看: 10067|回复: 13

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
发表于 2016-8-10 13:05:17 | 显示全部楼层 |阅读模式
校园创客福利
本帖最后由 kiasur 于 2016-8-26 14:54 编辑

手机也可实时监控无线工业粉尘,还能实现太阳能供电!!!!
原创申明:如转载请注明来源:http://club.gizwits.com/thread-3242-1-1.html
本文已参加机智云线上开源硬件大赛  http://club.gizwits.com/thread-2646-1-1.html


· 作品说明及使用场景

  远程无线工业粉尘监测仪采用高精度激光粉尘传感器对工厂内的空气粉尘浓度进行监测,特别适合应用于汽车轮毂厂、铝镁打磨厂、抛光车间、电镀车间、面粉厂等易发生粉尘爆Zha的地方。粉尘监测仪采用STM32控制粉尘传感器并将数据通过串口传输到ZigBee终端设备,ZigBee终端设备通过ZigBee网络传输到ZigBee协调器,ZigBee协调器通过串口传输到gokit2,Gokit2连接到路由器最终通过以太网连接到云服务器。做为公司的管理层能够通过手机远程实时的对工厂粉尘浓度进行监管,同时工厂管理室放置的ZigBee协调器连接着语音报警系统,现场便能通知粉尘超标报警信息。除此之外,作品还扩展了对温湿度监测的功能、太阳能充电及供电系统。


· 作品展示
实物.jpg

视频地址:http://v.youku.com/v_show/id_XMTY4ODI5MDUzNg==.html

代码下载: 无线工业粉尘监测仪代码.rar (11.13 MB, 下载次数: 3349)
发表于 2016-8-10 13:28:25 | 显示全部楼层
本帖最后由 Genius 于 2016-8-10 13:34 编辑

小伙伴,你好。
你是第24个参赛者。
欢迎加入开源大赛群,一起交流讨论
机智云开源硬件大赛 583190709
1、机智云QQ群: 287087942
机智云爱好者-APP开发群: 599735135
QQ群目前非常活跃,欢迎大家参与进来,交流,讨论,答疑,解惑~~
2、机智云微信公众号: 机智云 gizwits /   机智云智能宠物屋go-kit
关注机智云Gizwits官方公众号随时掌握最新资讯和活动信息

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-11 16:24:46 | 显示全部楼层

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

本帖最后由 kiasur 于 2016-8-15 14:56 编辑

【开源硬件】机智云智能硬件创新大赛  http://club.gizwits.com/thread-2646-1-1.html


·项目硬件设计

首先规划一下作品设计思路,下面便画张鱼骨图来展示一下作品的总体规划,如果1所示。


鱼骨图.png


图1 无线工业粉尘监测仪鱼骨图


       有了鱼骨图就有了设计的方向,先从鱼尾开始做起吧!首当其冲便是采集传感器数据,攀藤G1粉尘传感器采用STM32驱动并用串口接收传感器采集的数据。
攀藤副本.jpg

图2 攀藤G1激光粉尘传感器

      传感数据无线传输依赖于ZigBee无线传感网络,因此搭建ZigBee网络是项目的核心之一。ZigBee组成网状网络,使数据能够绕过障碍物进行无线传输,能够在复杂的工厂环境中畅通无阻的将数据传输到控制室。

3大金刚.jpg

图3 ZigBee三大金刚

          数据传输到ZigBee协调器之后我们的Gokit2终于亮相了。ZigBee协调器通过串口与Gokit2连接,将ZigBee网络内收集到的数据传递给Gokit2,Gokit2再将数据传输到机智云,这时候就可以通过手机以及电脑获取实时的粉尘浓度信息了。由于Gokit2的设计对于我这种强迫症来说使用起来有点麻烦,于是稍微改装了一下,如图4图5所示。

gokit2-1.jpg

图4 Gokit2下载开关改装

gokit2-2.jpg

图5 Gokit2串口跳线改装

      改装完之后将ZigBee协调器通过杜邦线与Gokit2以及语音合成模块连接,连接完成之后将它们一下用螺母锁在亚克力板上。如图6图7图8所示。

终端.jpg

图6 ZigBee协调器

终端2.jpg

图7 连接语音合成模块

终端3.jpg

图8 连接Gokit2

       前端的传感数据采集发送是项目的重中之重,花了好长时间才搭好这个平台。内含粉尘传感器一枚(采集粉尘浓度)、STM32开发板一块(粉尘传感器数据处理)、ZigBee终端节点一块(数据无线传输)、太阳能电源系统(供电)。各种跳线实在凌乱T T,太阳能电池板电源接反烧了一块ZigBee开发板。。。用亚克力板做了个外壳,能把东西塞进去就行,外观神马的因为手残也就只能这样了。。。

发1.jpg

图9 前端内景-1

发2.jpg

图10 前端内景-2

发3.jpg

图11 前端上表面

发4.jpg

图12 前端下表面

IMG_20160811_151307.jpg


图13 无线工业粉尘监测仪全家福



2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-15 13:39:05 | 显示全部楼层

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

本帖最后由 kiasur 于 2016-8-17 15:17 编辑

·项目BOM清单
《无线工业粉尘监测仪》BOM清单
编号品名规格单位单价/元数量总价/元
1ZigBee-CC2530最小系统1003300
2攀藤科技G1粉尘浓度传感器1051105
3神舟3号开发板STM32ZET61951195
4聚合物电芯8000毫安35.8271.6
5模型工具及材料112.731112.73
6Gokit2010
7太阳能电池板5V\1.2W18.9118.9
8升压模块0.3910.39
9杜邦线40P4.414.4
10锂电池充电板1.111.1
11LCD-12864液晶屏26.5126.5
12语音合成模块SYN628857157
13带外壳喇叭\0.5W\8欧 10110
14温湿度传感器DHT1117117
15优力源14500锂电池12.8338.4
958.02



2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-15 13:57:49 | 显示全部楼层

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

汉枫LPB120模块
本帖最后由 kiasur 于 2016-8-21 16:30 编辑

· 项目软件设计


        开发环境: IAR For 8051 8.10.1(ZigBee-CC2530开发使用)、Keil V4 For ARM(Gokit2及STM32使用)
        代码依旧流程图编写

流程图副本.jpg

图14 项目数据传输流程图

代码下载: 无线工业粉尘监测仪代码.rar (11.13 MB, 下载次数: 209)
  1. /*STM32main函数代码*/
  2. #include "stm32f10x.h"
  3. #include "usart1.h"
  4. #include "Time_test.h"
  5. #include "LCD12864.h"
  6. volatile u32 time,time_LCD; // ms 计时变量
  7. u8 PM_save[11];

  8. /*
  9. * 函数名:main
  10. * 描述  :主函数
  11. * 输入  :无
  12. * 输出  :无
  13. */

  14. int main(void)
  15. {        
  16.         /* USART1 config 115200 8-N-1 */
  17.         u8 i,LCD_PM1[6]={"PM1.0:"},LCD_PM25[6]={"PM2.5:"},LCD_PM10[5]={"PM10:"};
  18.         u8 LCD_PM1_DATA[5],LCD_PM25_DATA[5],LCD_PM10_DATA[5];
  19.         u16 LCD_PM1_SAVE,LCD_PM25_SAVE,LCD_PM10_SAVE;
  20.         SystemInit();
  21.         TIM2_NVIC_Configuration();
  22.           TIM2_Configuration();

  23.         USART1_Config();//串口初始化
  24.         lcdinit();//12864初始化
  25.         NVIC_Configuration();
  26.         
  27.         write_com(0x03);
  28.           delay(50);
  29.         
  30.         write_com(0x81);
  31.         lcd_display(LCD_PM1);
  32.         
  33.         write_com(0x91);
  34.         lcd_display(LCD_PM25);
  35.         
  36.         write_com(0x89);
  37.         lcd_display(LCD_PM10);
  38.         
  39.         delay(50);
  40.         write_com(0x01);//清屏
  41.         START_TIME;//启动定时器
  42.         while(1)
  43.         {
  44.                 /* 每1000MS更新一次数据 */
  45.                 if(time_LCD > 1000)
  46.                 {
  47.                         LCD_PM1_SAVE = PM_save[4]*256 + PM_save[5];
  48.                         LCD_PM1_DATA[0] = LCD_PM1_SAVE/1000+'0';
  49.                         LCD_PM1_DATA[1] = LCD_PM1_SAVE/100%10+'0';
  50.                         LCD_PM1_DATA[2] = LCD_PM1_SAVE%100/10+'0';
  51.                         LCD_PM1_DATA[3] = LCD_PM1_SAVE%10+'0';
  52.                         LCD_PM1_DATA[4] = 0;
  53.                         
  54.                         LCD_PM25_SAVE = PM_save[6]*256 + PM_save[7];
  55.                         LCD_PM25_DATA[0] = LCD_PM25_SAVE/1000+'0';
  56.                         LCD_PM25_DATA[1] = LCD_PM25_SAVE/100%10+'0';
  57.                         LCD_PM25_DATA[2] = LCD_PM25_SAVE%100/10+'0';
  58.                         LCD_PM25_DATA[3] = LCD_PM25_SAVE%10+'0';
  59.                         LCD_PM25_DATA[4] = 0;
  60.                         
  61.                         LCD_PM10_SAVE = PM_save[8]*256 + PM_save[9];
  62.                         LCD_PM10_DATA[0] = LCD_PM10_SAVE/1000+'0';
  63.                         LCD_PM10_DATA[1] = LCD_PM10_SAVE/100%10+'0';
  64.                         LCD_PM10_DATA[2] = LCD_PM10_SAVE%100/10+'0';
  65.                         LCD_PM10_DATA[3] = LCD_PM10_SAVE%10+'0';
  66.                         LCD_PM25_DATA[4] = 0;
  67.                         

  68.                         write_com(0x84);
  69.                         lcd_display(LCD_PM1_DATA);
  70.                         write_com(0x94);
  71.                         lcd_display(LCD_PM25_DATA);
  72.                         write_com(0x8c);
  73.                         lcd_display(LCD_PM10_DATA);
  74.                         time_LCD =0;
  75.                 }

  76.                 /* 每5000MS将数据通过串口传输到ZigBee终端节点 */
  77.                 if(time>5000)
  78.                 {                 
  79.                         for(i=0;i<11;i++)
  80.                                         {
  81.                                                 USART_SendData(USART2,PM_save[i]);//发送数据
  82.                                                 while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);        
  83.                                         }
  84.                         time = 0;
  85.                 }

  86.                
  87.         }
  88. }
复制代码

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-15 13:58:14 | 显示全部楼层

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

本帖最后由 kiasur 于 2016-8-15 14:15 编辑
  1. /*ZigBee用户函数代码*/
  2. #include "OSAL.h"
  3. #include "ZGlobals.h"
  4. #include "AF.h"
  5. #include "aps_groups.h"
  6. #include "ZDApp.h"

  7. #include "SampleApp.h"
  8. #include "SampleAppHw.h"

  9. #include "OnBoard.h"

  10. /* HAL */
  11. #include "hal_lcd.h"
  12. #include "hal_led.h"
  13. #include "hal_key.h"
  14. #include "MT_UART.h"
  15. #include "MT.h"//消息命令ID定义头文件
  16. #include "string.h"
  17. #include "hal_voice.h"

  18. const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] =
  19. {
  20.   SAMPLEAPP_PERIODIC_CLUSTERID,//广播簇ID
  21.   SAMPLEAPP_FLASH_CLUSTERID
  22. };

  23. const SimpleDescriptionFormat_t SampleApp_SimpleDesc =
  24. {
  25.   SAMPLEAPP_ENDPOINT,              //  int Endpoint;
  26.   SAMPLEAPP_PROFID,                //  uint16 AppProfId[2];
  27.   SAMPLEAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  28.   SAMPLEAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  29.   SAMPLEAPP_FLAGS,                 //  int   AppFlags:4;
  30.   SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
  31.   (cId_t *)SampleApp_ClusterList,  //  uint8 *pAppInClusterList;
  32.   SAMPLEAPP_MAX_CLUSTERS,          //  uint8  AppNumInClusters;
  33.   (cId_t *)SampleApp_ClusterList   //  uint8 *pAppInClusterList;
  34. };

  35. endPointDesc_t SampleApp_epDesc;


  36. uint8 SampleApp_TaskID;   // Task ID for internal task/event processing
  37. // This variable will be received when
  38. // SampleApp_Init() is called.
  39. devStates_t SampleApp_NwkState;

  40. uint8 SampleApp_TransID;  // This is the unique message ID (counter)

  41. afAddrType_t SampleApp_Periodic_DstAddr;//广播afAddrType_t类型数据
  42. afAddrType_t SampleApp_Flash_DstAddr;
  43. afAddrType_t Point_To_Point_DstAddr;

  44. aps_Group_t SampleApp_Group;

  45. uint8 SampleAppPeriodicCounter = 0;
  46. uint8 SampleAppFlashCounter = 0;

  47. /**********************************************
  48. * LOCAL FUNCTIONS
  49. */
  50. void SampleApp_HandleKeys( uint8 shift, uint8 keys );
  51. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
  52. void SampleApp_SendPointToPointMessage( uint8 *dat ) ;//点对点传播
  53. void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg);//数据接收处理
  54. /**********************************************
  55. * NETWORK LAYER CALLBACKS
  56. */

  57. /**********************************************
  58. * PUBLIC FUNCTIONS
  59. */

  60. /**********************************************
  61. * @fn      SampleApp_Init
  62. *
  63. * @brief   Initialization function for the Generic App Task.
  64. *          This is called during initialization and should contain
  65. *          any application specific initialization (ie. hardware
  66. *          initialization/setup, table initialization, power up
  67. *          notificaiton ... ).
  68. *
  69. * @param   task_id - the ID assigned by OSAL.  This ID should be
  70. *                    used to send messages and set timers.
  71. *
  72. * @return  none
  73. */
  74. void SampleApp_Init( uint8 task_id )
  75. {
  76.   SampleApp_TaskID = task_id;
  77.   SampleApp_NwkState = DEV_INIT;
  78.   SampleApp_TransID = 0;
  79.   
  80.   /********串口初始化************/
  81.   MT_UartInit();
  82.   MT_UartRegisterTaskID(SampleApp_TaskID);
  83.   HalUARTWrite(0,"uart init success\n" ,18);  
  84.   /**************************/
  85.   
  86.   //  uint8 vol[11]={0xfd,0x00,0x08,0x01,0x01,0x5b,0x76,0x30,0x31,0x5d,0x84};
  87.   //  HalUARTWrite(1,vol,11);//减小音量
  88.   
  89.   
  90. #if defined ( BUILD_ALL_DEVICES )
  91.   // The "Demo" target is setup to have BUILD_ALL_DEVICES and HOLD_AUTO_START
  92.   // We are looking at a jumper (defined in SampleAppHw.c) to be jumpered
  93.   // together - if they are - we will start up a coordinator. Otherwise,
  94.   // the device will start as a router.
  95.   if ( readCoordinatorJumper() )
  96.     zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR;
  97.   else
  98.     zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;
  99. #endif // BUILD_ALL_DEVICES
  100.   
  101. #if defined ( HOLD_AUTO_START )
  102.   // HOLD_AUTO_START is a compile option that will surpress ZDApp
  103.   //  from starting the device and wait for the application to
  104.   //  start the device.
  105.   ZDOInitDevice(0);
  106. #endif
  107.   
  108.   
  109.   //Setup for the Point To Point destination address
  110.   Point_To_Point_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//点对点短地址
  111.   Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
  112.   Point_To_Point_DstAddr.addr.shortAddr = 0x0000; //协调器地址
  113.   
  114.   // Fill out the endpoint description.
  115.   SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT;
  116.   SampleApp_epDesc.task_id = &SampleApp_TaskID;
  117.   SampleApp_epDesc.simpleDesc
  118.     = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc;
  119.   SampleApp_epDesc.latencyReq = noLatencyReqs;
  120.   
  121.   // Register the endpoint description with the AF
  122.   afRegister( &SampleApp_epDesc );
  123.   

  124.   uint8 test[]={"欢迎使用无线工业粉尘监测仪"},len=0;
  125.   len = sizeof(test);
  126.   voice_input(test,len);
  127. }

  128. /**********************************************
  129. * @fn      SampleApp_ProcessEvent
  130. *
  131. * @brief   Generic Application Task event processor.  This function
  132. *          is called to process all events for the task.  Events
  133. *          include timers, messages and any other user defined events.
  134. *
  135. * @param   task_id  - The OSAL assigned task ID.
  136. * @param   events - events to process.  This is a bit map and can
  137. *                   contain more than one event.
  138. *
  139. * @return  none
  140. */
  141. uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
  142. {
  143.   afIncomingMSGPacket_t *MSGpkt;
  144.   (void)task_id;  // Intentionally unreferenced parameter
  145.   
  146.   if ( events & SYS_EVENT_MSG )
  147.   {
  148.     MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
  149.     while ( MSGpkt )
  150.     {
  151.       switch ( MSGpkt->hdr.event )
  152.       {
  153.       case CMD_SERIAL_MSG: //串口收到数据后由 MT_UART 层传递过来的
  154.         SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt);
  155.         break;

  156.       case AF_INCOMING_MSG_CMD:
  157.         SampleApp_MessageMSGCB( MSGpkt );
  158.         break;
  159.         
  160.         // Received whenever the device changes state in the network
  161.       case ZDO_STATE_CHANGE:
  162.         SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
  163.         break;
  164.         
  165.       default:
  166.         break;
  167.       }
  168.       
  169.       // Release the memory
  170.       osal_msg_deallocate( (uint8 *)MSGpkt );
  171.       
  172.       // Next - if one is available
  173.       MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
  174.     }
  175.    
  176.     // return unprocessed events
  177.     return (events ^ SYS_EVENT_MSG);
  178.   }
  179.   
  180.   return 0;
  181. }


  182. /*对接收到的串口数据进行处理*/
  183. void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)
  184. {
  185.   uint8 *str=NULL; //len 有用数据长度
  186.   str=cmdMsg->msg; //指向数据开头
  187.   if( (*(str+1) ==0x42) && (*(str+2) ==0x4D) )
  188.     SampleApp_SendPointToPointMessage(str);//将数据通过广播发送
  189. }

  190. void SampleApp_HandleKeys( uint8 shift, uint8 keys )
  191. {
  192.   
  193. }


  194. /*协调器对接收到的数据进行处理*/
  195. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
  196. {
  197.   uint8 PM[10],WS[10];
  198.   switch ( pkt->clusterId )
  199.   {
  200.   case SAMPLEAPP_POINT_TO_POINT_CLUSTERID:
  201.     if(pkt->cmd.Data[1] == 0X42 && pkt->cmd.Data[2] == 0X4d)//判断粉尘数据是否符合协议
  202.     {
  203.       /*协调器接收到终端节点的数据后对数据进行剪切*/
  204.       uint16 PM1_0,PM2_5,PM10;
  205.       PM[0] = pkt->cmd.Data[1];
  206.       PM[1] = pkt->cmd.Data[2];
  207.       PM[2] = pkt->cmd.Data[5];
  208.       PM[3] = pkt->cmd.Data[6];
  209.       PM[4] = pkt->cmd.Data[7];
  210.       PM[5] = pkt->cmd.Data[8];
  211.       PM[6] = pkt->cmd.Data[9];
  212.       PM[7] = pkt->cmd.Data[10];
  213.       PM[8] = 0xdd;
  214.       PM[9] = 0xff;
  215.       
  216.       PM1_0 = (PM[2]*256) + PM[3];
  217.       PM2_5 = (PM[4]*256) + PM[5];
  218.       PM10 =  (PM[6]*256) + PM[7];
  219.       if( (PM1_0 < PM2_5 < PM10) && (PM1_0<2000) &&(PM2_5<2000) && (PM10<2000))//判断粉尘浓度是否超过设定阈值
  220.       {
  221.         HalUARTWrite(0,PM,10);
  222.         
  223.         if(( PM1_0>1000) | (PM2_5>1000)| (PM10>1000) )
  224.         {
  225.           uint8 test[]={"警告警告粉尘浓度超标"},len=0;//发送报警信息到语音合成模块
  226.           len = sizeof(test);
  227.           voice_input(test,len);
  228.         }
  229.       }
  230.       
  231.     }
  232.    
  233.     if(pkt->cmd.Data[1] == 0xaa && pkt->cmd.Data[2] == 0xbb)//判断温湿度数据是否符合协议
  234.     {
  235.       WS[0] = pkt->cmd.Data[1];
  236.       WS[1] = pkt->cmd.Data[2];
  237.       WS[2] = pkt->cmd.Data[3];
  238.       WS[3] = pkt->cmd.Data[4];
  239.       WS[4] = pkt->cmd.Data[5];
  240.       WS[5] = pkt->cmd.Data[6];
  241.       WS[6] = pkt->cmd.Data[7];
  242.       WS[7] = pkt->cmd.Data[8];
  243.       WS[8] = 0xdd;
  244.       WS[9] = 0xff;
  245.       HalUARTWrite(0,WS,10);
  246.       
  247.       if(WS[2]>0x30 )//判断温度是否超过设定阈值
  248.       {
  249.         uint8 test[]={"警告警告温度过高"},len=0;//发送报警信息到语音合成模块
  250.         len = sizeof(test);
  251.         voice_input(test,len);
  252.       }
  253.       if(WS[3]>0x40 )////判断湿度浓度是否超过设定阈值
  254.       {
  255.         uint8 test[]={"警告警告湿度过高"},len=0;//发送报警信息到语音合成模块
  256.         len = sizeof(test);
  257.         voice_input(test,len);
  258.       }
  259.       break;
  260.     }
  261.   }
  262. }


  263. /*点对点传输函数,终端节点用来发送点对点消息到协调器*/
  264. void SampleApp_SendPointToPointMessage( uint8 *dat )
  265. {
  266.   if ( AF_DataRequest( &Point_To_Point_DstAddr,
  267.                       &SampleApp_epDesc,
  268.                       SAMPLEAPP_POINT_TO_POINT_CLUSTERID,
  269.                       *dat,//(byte)osal_strlen(dat),
  270.                       dat,
  271.                       &SampleApp_TransID,
  272.                       AF_DISCV_ROUTE,
  273.                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  274.   {
  275.   }
  276.   else
  277.   {
  278.     // Error occurred in request to send.
  279.   }
  280. }
  281. /**********************************************

  282. **********************************************/
复制代码

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-15 13:58:31 | 显示全部楼层

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

本帖最后由 kiasur 于 2016-8-15 14:27 编辑
  1. /*Gokit2代码*/
  2. #include "gokit.h"

  3. /*Global Variable*/
  4. uint32_t ReportTimeCount = 0;
  5. uint8_t gaterSensorFlag = 0;
  6. uint8_t Set_LedStatus = 0;
  7. uint8_t NetConfigureFlag = 0;
  8. uint8_t curTem = 0, curHum = 0;
  9. uint8_t lastTem = 0,lastHum = 0;

  10. extern RingBuffer u_ring_buff;
  11. uint8_t p0Flag = 0;

  12. WirteTypeDef_t        WirteTypeDef;
  13. ReadTypeDef_t        ReadTypeDef;
  14. uint8_t Rx_sensor[10]={0};//´«¸ÐÆ÷Êý¾Ý
  15. extern uint8_t zb_count;
  16. uint8_t Switch_LEDStatus = 0,Switch_WaterStatus = 0,Switch_AirStatus = 0,Switch_WaringStatus = 0;
  17. /**
  18.   * @brief  Main program.
  19.   * @param  None
  20.   * @retval None
  21.   */
  22. int main(void)
  23. {
  24.         uint8_t p0_control_buf[MAX_P0_LEN];
  25.        
  26.         SystemInit();       
  27.         HW_Init();
  28.         SW_Init();               
  29.         while(1)
  30.         {
  31.                 KEY_Handle();
  32.                 GizWits_MessageHandle(p0_control_buf, sizeof(WirteTypeDef_t));

  33.                
  34.     if(gaterSensorFlag != 0)
  35.     {
  36.       gaterSensorFlag = 0;
  37.                   Zigbee_sensorData();//获取ZigBee串口传输的数据
  38.                         GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1);//上传数据到机智云服务器
  39.     }

  40.         }
  41. }
  42. /** @addtogroup GizWits_HW_Init
  43.   * @{
  44.   */
  45. void HW_Init(void)
  46. {
  47.         Delay_Init(72);       
  48.         UARTx_Init();
  49.   RGB_KEY_GPIO_Init();
  50.         RGB_LED_Init();       
  51.         LED_GPIO_Init();       
  52.         KEY_GPIO_Init();
  53.         TIM3_Int_Init(7199,9);   //ms interrupt       
  54.         Motor_Init();       
  55.         DHT11_Init();       
  56.         IR_Init();       
  57. }
  58. /** @addtogroup GizWits_SW_Init
  59.   * @{
  60.   */
  61. void SW_Init()
  62. {

  63.         ReadTypeDef.PM1_0_H =0;
  64.         ReadTypeDef.PM1_0_L =0;
  65.         ReadTypeDef.PM2_5_H = 0;
  66.         ReadTypeDef.PM2_5_L = 0;
  67.         ReadTypeDef.PM10_H = 0;
  68.         ReadTypeDef.PM10_L = 0;
  69.         GizWits_init(sizeof(ReadTypeDef_t));
  70.         printf("hello world\r\n");
  71.         printf("Gokit Init Ok ...\r\n");
  72. }
  73. /** @addtogroup Printf_SystemRccClocks
  74.   * @{
  75.   */
  76. void Printf_SystemRccClocks(void)
  77. {
  78.         uint8_t SYSCLKSource;

  79.         RCC_ClocksTypeDef  SystemRCC_Clocks;
  80.         printf("System start...\r\n");
  81.         SYSCLKSource = RCC_GetSYSCLKSource();
  82.         if(SYSCLKSource==0x04)
  83.                 printf("SYSCLKSource is HSE\r\n");
  84.         else if(SYSCLKSource==0x00)
  85.                 printf("SYSCLKSource is HSI\r\n");
  86.         else if(SYSCLKSource==0x08)
  87.                 printf("SYSCLKSource is PL!\r\n");
  88.        
  89.         RCC_GetClocksFreq(&SystemRCC_Clocks);
  90.         printf("SYS clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.SYSCLK_Frequency/1000000);
  91.         printf("HCLK clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.HCLK_Frequency/1000000);
  92.         printf("PCLK1 clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK1_Frequency/1000000);
  93.         printf("PCLK2_clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK2_Frequency/1000000);       
  94.         printf("SADCCLK_Frequencyclock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.ADCCLK_Frequency/1000000);

  95. }

  96. /*Gokit2获取到ZigBee协调器传输的数据进行处理*/
  97. void Zigbee_sensorData(void)
  98. {
  99.         uint8_t i;
  100.         if( (Rx_sensor[0] == 0x42) && (Rx_sensor[9] == 0xFF) )//判断数据是否符合协议
  101.         {
  102.                 ReadTypeDef.PM1_0_H = Rx_sensor[2];//保存数据到结构体中
  103.                 ReadTypeDef.PM1_0_L = Rx_sensor[3];//保存数据到结构体中
  104.                 ReadTypeDef.PM2_5_H = Rx_sensor[4];//保存数据到结构体中
  105.                 ReadTypeDef.PM2_5_L = Rx_sensor[5];//保存数据到结构体中
  106.                 ReadTypeDef.PM10_H = Rx_sensor[6];//保存数据到结构体中
  107.                 ReadTypeDef.PM10_L = Rx_sensor[7];//保存数据到结构体中
  108.                 printf("%s",Rx_sensor);//打印数据,方便调试
  109.                

  110.                 for(i=0;i<10;i++)
  111.                         {
  112.                                 Rx_sensor[i] = 0;//清除数组为下一次数据保存
  113.                         }
  114.                  zb_count =0;
  115.         }
  116. }
  117. /*****************************************************
  118. * Function Name  : KEY_Handle
  119. * Description    : Key processing function
  120. * Input          : None
  121. * Output         : None
  122. * Return         : None
  123. * Attention                          : None
  124. *****************************************************/
  125. void KEY_Handle(void)
  126. {
  127.         uint8_t Key_return =0;       
  128.         Key_return = ReadKeyValue();       
  129.         if(Key_return & KEY_UP)
  130.         {
  131.                 if(Key_return & PRESS_KEY1)
  132.                 {
  133. #ifdef PROTOCOL_DEBUG
  134.                                   printf("KEY1 PRESS\r\n");
  135. #endif               
  136.                 }
  137.                 if(Key_return & PRESS_KEY2)
  138.                 {
  139. #ifdef PROTOCOL_DEBUG
  140.                         printf("KEY2 PRESS ,Soft AP mode\r\n");
  141. #endif       
  142.                         //Soft AP mode, RGB red
  143.                         LED_RGB_Control(255, 0, 0);
  144.                         GizWits_D2WConfigCmd(SoftAp_Mode);
  145.                         NetConfigureFlag = 1;
  146.                 }                               
  147.         }

  148.         if(Key_return & KEY_LONG)
  149.         {
  150.                 if(Key_return & PRESS_KEY1)
  151.                 {
  152. #ifdef PROTOCOL_DEBUG
  153.                                 printf("KEY1 PRESS LONG ,Wifi Reset\r\n");
  154. #endif                       
  155.                         GizWits_D2WResetCmd();
  156.                 }
  157.                 if(Key_return & PRESS_KEY2)
  158.                 {
  159.                         //AirLink mode, RGB Green
  160. #ifdef PROTOCOL_DEBUG
  161.                                 printf("KEY2 PRESS LONG ,AirLink mode\r\n");
  162. #endif       
  163.                         LED_RGB_Control(0, 128, 0);
  164.                         GizWits_D2WConfigCmd(AirLink_Mode);
  165.                         NetConfigureFlag = 1;
  166.                 }
  167.         }
  168. }
  169. /*****************************************************
  170. * Function Name  : GizWits_WiFiStatueHandle
  171. * Description    : Callback function , Judge Wifi statue
  172. * Input          : None
  173. * Output         : None
  174. * Return         : Bit , Attr_Flags
  175. * Attention                 :
  176. *****************************************************/
  177. void GizWits_WiFiStatueHandle(uint16_t wifiStatue)
  178. {       
  179.         if(((wifiStatue & Wifi_ConnClouds) == Wifi_ConnClouds) && (NetConfigureFlag == 1))
  180.         {
  181.                 printf("W2M->Wifi_ConnClouds\r\n");
  182.                 NetConfigureFlag = 0;
  183.                 LED_RGB_Control(0,0,0);
  184.         }
  185. }
  186. /************* (C) COPYRIGHT 2011 STMicroelectronics ****END OF FILE***/
复制代码

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-15 14:16:34 | 显示全部楼层

【Gokit2&ZigBee&STM32】之无线工业粉尘监测仪

本帖最后由 kiasur 于 2016-8-17 15:17 编辑

·项目数据
数据点副本.jpg

图15 机智云数据点

1.jpg

图16 IOT Demo数据-1

2.jpg

图17 IOT Demo数据-2

3.jpg

图18 IOT Demo数据-3

4.jpg

图19 IOT Demo数据-5

5.jpg

图20 液晶屏粉尘浓度数据-1

7.jpg

图21 液晶屏粉尘浓度数据-2

8.jpg

图22 液晶屏粉尘浓度数据-3



3

主题

47

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2016-8-15 22:13:19 | 显示全部楼层
我感觉哥们你可以简化一下这个系统,因为机智云有引出AD采样接口和普通IO,传感器可以直接用机智云底板的STM32处理,只将机智云作为串口设备转接一下,意义不太大。使用了WIFI其实ZIGBEE就可以省了。优化一下,让机智云尽量参加系统中

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-16 13:47:26 | 显示全部楼层
汉枫LPB120模块
本帖最后由 kiasur 于 2016-8-16 13:48 编辑
努力的人 发表于 2016-8-15 22:13
我感觉哥们你可以简化一下这个系统,因为机智云有引出AD采样接口和普通IO,传感器可以直接用机智云底板的ST ...

WiFi做不了低功耗,并且WiFi不能组网,用ZigBee组网可以对工厂的各个车间进行监测,汇总数据,然后用WiFi传输到机智云。机智云最核心的还是使用它的串口做应用。底板的32引脚寥寥无几,做扩展也不太够用。

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-17 20:15:33 | 显示全部楼层
作品已上传,希望各位小伙们指教不足之处,谢谢啦!

8

主题

42

帖子

1649

积分

金牌会员

Rank: 6Rank: 6

积分
1649
发表于 2016-8-29 20:59:04 | 显示全部楼层
楼主,关于zigbee跟gokit2如何实现连接可否等你有空给我们小白们弄个简单的教程贴,感激不尽!

2

主题

12

帖子

86

积分

注册会员

Rank: 2

积分
86
 楼主| 发表于 2016-8-31 15:09:26 | 显示全部楼层
飞翔中的语言 发表于 2016-8-29 20:59
楼主,关于zigbee跟gokit2如何实现连接可否等你有空给我们小白们弄个简单的教程贴,感激不尽! ...

Gokit2与ZigBee连接需要将Gokit2进行改造,改装方法帖子上 图5 Gokit2串口跳线改装,这样做Gokit2既能下载程序,串口也能外接使用。
Gokt2的TX/PA9连接ZigBee的RX/P0.2,Gokt2的RX/PA10连接ZigBee的TX/P03。
注意:下载程序时需要将Gokit2的原本的跳线帽插上,待下载完成后再讲跳线帽拔出连接ZigBee.

0

主题

30

帖子

198

积分

注册会员

Rank: 2

积分
198
发表于 2018-10-22 16:39:42 | 显示全部楼层
感谢楼主分享,学习,学习。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

© 2011-2017 Gizwits ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表