• 项目(智慧教室)第五部分,Zigbee采集控制功能实现


    一。IAR工程针对Zigbee的修改

    补充:硬件配置

    (1)拨码开关拨到公口处,协调器的连接

    (2)协调器的烧写(Zigbee协调器也需要烧写)

    (4)温湿度模块的烧写

    1.寻找Zigbee项目文件。

    2.使用IAR,Zigbee协调器的选择,Zigbee协调器代码烧写

    注意:协调器与节点的代码在一个工程文件下,所以会有协调器选择或温湿度节点的选择。

    编译前选择coordinatorEB不要选错

    编译下载

    3.编译前选择风扇与温度

    (1)宏定义选择--》温湿度选择#define TMEP_NODE

    风扇选择--》FAN_NODE

    二。keil工程的修改

    1.向keil工程中移植protocol.c protocol.h

    (1)protocol.c

    (2)protocol.h。这是zigbee的移植文件

    2.对ZIgbee串口数据的接受

    2.1usart.c
        //主要配置使能uart1空闲中断-->串口中断的使能
        

      __HAL_UART_ENABLE_IT(uartHandle,UART_IT_RXNE);

    2.2freertos.c
        //在zigbee任务中进行接收消息,解析消息

    (1)头文件的加入

    1. #include "string.h"
    2. #include "protocol.h"

    (2)创建Zigbee消息队列

    1. uint8_t ZigbeeBuff[40];
    2. osMessageQId ZigbeeQueueHandle;

    (3)Zigbee消息队列的初始化

    1. osMessageQDef(ZigbeeQueue, 40, uint8_t);
    2. ZigbeeQueueHandle = osMessageCreate(osMessageQ(ZigbeeQueue), NULL);

    (4)Zigbee消息接收

    1. void Zigbee_Task(void const * argument)
    2. {
    3. /* USER CODE BEGIN Zigbee_Task */
    4. uint8_t u8Index;
    5. /* Infinite loop */
    6. for(;;)
    7. {
    8. //每次读取消息之前,把索引初始化为0
    9. u8Index = 0;
    10. //1、一直等待接收消息,第一个消息应该放在消息缓冲区的第一个元素上
    11. if(xQueueReceive(ZigbeeQueueHandle,&ZigbeeBuff[u8Index++],portMAX_DELAY)==pdPASS){
    12. while(xQueueReceive(ZigbeeQueueHandle,&ZigbeeBuff[u8Index++],50)){}
    13. //完成解析以后,要清空接收缓冲区,不然会出现问题
    14. ProtocolParse(ZigbeeBuff,u8Index-1);
    15. memset(ZigbeeBuff,0,40);
    16. }
    17. }
    18. /* USER CODE END Zigbee_Task */
    19. }

    2.3stm32f4xx_it.c
        //zigbee消息入队

    (1)添加头文件

    #include "cmsis_os.h"

    (2)声明外部Zigbee

    1. extern osMessageQId ZigbeeQueueHandle;
    2. extern UART_HandleTypeDef huart3;

    (3)串口中断接受数据

    1. uint8_t u8Data;
    2. if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == SET){
    3. u8Data = huart1.Instance->DR;
    4. xQueueSendFromISR(ZigbeeQueueHandle,&u8Data,NULL);
    5. }

    3.数据封装CmdAndSensor.c

    (1)加入头文件,控制zigbee节点(风扇

    1. #include "protocol.h"
    2. FanControl((uint8_t)(Cmd));

    4.httpserver-socket.c通信实现

    (1)加入外部数据,修改

    extern int SensorValue[3];

    (2)得到数据字符串

    1. static void Get_SensorValue(void *buffer, void *value)
    2. {
    3. sprintf(buffer, "{\"temperature\":\"%d\",\"humidity\":\"%d\",\"light\":\"10021.1\"}", SensorValue[0], SensorValue[1]);
    4. }

    (2)对风扇的控制

    <1>加入头文件

    #include "protocol.h"

    <2>实现对风扇的控制

    1. static void Post_Cmd_Fan(void *buffer, void *value)
    2. {
    3. if (strstr(value, On))
    4. {
    5. sprintf(buffer, "{\"Status\":\"On\"}");
    6. FanControl(0x01);
    7. }
    8. else if (strstr(value, Off))
    9. {
    10. sprintf(buffer, "{\"Status\":\"Off\"}");
    11. FanControl(0x0);
    12. }
    13. else
    14. {
    15. sprintf(buffer, "{\"Status\":\"Error\"}");
    16. }
    17. }

    5.对TempDLG.c修改

    (1)修改外部数据(就是展示温湿度的数据

    extern int SensorValue[3];

    (2)定义一个字符串

    	char       SensorBuff[10];

    (3)页面展示数据

    1. sprintf(SensorBuff,"%d",SensorValue[0]);
    2. TEXT_SetText(hItem, SensorBuff);

    6.LightDLG.c修改 (与上面一样)

    (1)外部数据声明(收到的温湿度),声明字符串(数据改为字符串,这样才可以展示)

    1. extern int SensorValue[3];
    2. char SensorBuff[10];

    (2)展示出来

    1. sprintf(SensorBuff,"%d",SensorValue[2]);
    2. TEXT_SetText(hItem, SensorBuff);

    7.HumDLG.c(同上)

    (1)使用外部声明数据,声明字符串

    1. extern int SensorValue[3];
    2. char SensorBuff[10];

    (2)数据展示( 通过数据)

    1. sprintf(SensorBuff,"%d",SensorValue[1]);
    2. TEXT_SetText(hItem, SensorBuff);

    8.FanDLG.c(风扇不需要加入数据)

    #include "CmdAndSensor.h"

    vFanCmd(status);  

  • 相关阅读:
    volatile 关键字有什么用?它的实现原理是什么?
    数据结构学习笔记
    java面试中的高并发的问题
    中级软件设计师考试(软考中级)设计模式分类及其典型特点
    驶入产业发展快车道,汉鑫科技人工智能研发中心正式启用!
    Ajax——超时与网络异常
    亚马逊卖家参与活动:提升产品排名的神秘法宝?
    爬网神器组
    SQL server2019 Express安装
    电脑翻译软件-大家都觉得好用的免费电脑翻译软件
  • 原文地址:https://blog.csdn.net/m0_61659911/article/details/132753345