zigbee无线传感网实训---zigbee显示温湿度以及连接LCD开发板显示温湿度(The Eighth day)

xiaoxiao2021-03-01  40

承接第七天:zigbee无线传感网实训---实现LCD开发板播放音乐并切换歌曲(The Seventh day)

一、实验准备器材如图:

            

二:步骤

===============================一、裸机开发-IO控制===========================

1.1 控制流程     (1)查看原理图             得到硬件对应的是cc2530的什么引脚     (2)查看芯片手册             找到对应的控制方法     (3)编写代码             根据芯片手册的说明,写程序控制对应的引脚     (4)编译程序     (5)下载运行

1.2 IO寄存器         IO寄存器共三组,每组以下标0-2命名                  1.2.1 PxSEL IO功能选择寄存器                 每个IO口引脚有通用功能和拓展功能(外部设备IO信号)                 通过操作引脚对应的下标注,即可生效                 0:通用功能                 1:外设功能         1.2.2 PxDIR 引脚功能选择寄存器                 通过操作引脚对应的下标注,即可生效                 0:输入功能                 1:输出功能         1.2.3 Px_n 具体的引脚使用                 设置对应功能后,可以直接使用。                     #define BLED P1_0                     #define KEY3 P1_2                     写:BLED = 1;                     读:KEY3 == 1; ---------------------------------------------------------------------- ========================二、协议栈的工作原理======================================                 1.1 有线网的工作原理:             由三大运营商各自管理唯一的基站管理上网             --->总基站将网络分发M条网线发送到全国各地基站             --->各地基站将网络分发到每个城市的服务器(路由)             --->城市路由将网线分布成每条网线,分发到每家每户     1.2 无线网络工作原理:             将上述的有线全部转换为无线          1.3 无线网络的组建          必须由RF模块向空中发出网络组建信号,在其传播范围内,只要感知到网络信号,就会自动形成一个无线的局域网。     1.3.1 数据的发送:             根据无线网络的网段:向空中发送一个特定的某个波形的无线电波,电波自动匹配相同的网络标记。             完成数据的收/发     1.3.2 网络标识符的作用:             在无线网络通信时,由于同一个局域网中,往往不止存在一个网络。但在在数据收发时,应该区分符合条件的网络             才能接收数据,网络标识符用于区分不同的网络。(类似有线网络中的IP地址) -------------------------------------------------  安装Z-stack(先下载:ZStack-CC2530-2.5.1a.exe) --> 在磁盘c中找到“ C:\Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB ”     打开“ SampleApp.eww ”          APP:应用程序目录,用户开发程序的位置     ZMain:协议栈的第一句代码执行的位置         zmain ---> main ---> osal_init_systeam();                             --->osalInitTasks();         //创建任务ID,每任务都会有对应的处理函数(9个)                             --->SampleApp_Init(taskID)  //用户事件初始化         初始化完成后,准备启动系统         osal_start_system(); --->系统进入死循环(检测每个任务是否发生)             do {                     if (tasksEvents[idx])  // 判断任务事件是否发生,当事件发生,对应的ID会被置1                     {                         break;                     }                 } while (++idx < tasksCnt);                              --->执行任务对应的处理函数                 events = (tasksArr[idx])( idx, events );                       tasksArr数组:保存了每一个任务对应的处理函数                        events:(事件对应的任务) ----------------------------------------------------------------------- 打开协议栈之后,进行编译,下载时,注意选择下载的设备模式。     左边导航栏--->workspace-->coordinatorEB/coordinatorEB-pro

    2.1 zigbee终端的模式         协调器(coodr):专门用于组建网络(没有网络的情况),唯一的管理者。管理整个无线网络(组建、节点加入、路由加入)

        路由(route):多级网络的组建,数据的分发。

        终端(enddev):只能加入到已有的网络当中,仅仅只能数据的收发。

    2.2 网络拓扑结构(结合图示,将工作原理讲述清楚)         星型:每个节点/路由都是必须直接与协调器相连,连接数少,范围受限         网状:每个路由器都能进行互联,数据转发速度快,可靠性高         树状:更好的拓展网络连接数,网络的距离。

-----------------------------------------------------------------------         组网测试(协调器):             (1)、修改PID: /Tools/f8wconfig.cfg/PAN_ID = (0x0011 - 0x0024)                                                             第一排第一组:0x0011                                                             第一排第二组:0x0012                                                             第一排第三组:0x0013                                                             第一排第四组:0x0014 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24

            (2)配置IO引脚                     在ADD--->sampleapp.h 添加头文件 ioCC2530.h                     在ADD--->sampleapp.c -->SampleApp_Init(180行后)函数中添加LED2的初始化函数(P1DIR |= 0x02)

            (3)增加代码:                 (注意先将头文件和IO初始化)                 /app/sampleapp.c/400行/增加YLED=1;(YLED 是自己define定义的)

            (4)编译                          (5)下载配置                 左边导航栏--->workspece--->coordinatorEB,下载

    组网测试(节点)             (1)修改PID:/Tools/f8wconfig.cfg/58行/PAN_ID=(0x0000-0x3fff)                         第一排第一组:0x0011   0x0012     0x0013                         第二排第一组:0x0021   0x0022     0x0023             (2)配置IO引脚                     在ADD--->sampleapp.h 添加头文件 ioCC2530.h                     在ADD--->sampleapp.c -->SampleApp_Init(180行后)函数中添加LED2的初始化函数(P1DIR |= 0x02)             

            (3)增加代码:                 (注意先将头文件和IO初始化)                 /app/sampleapp.c/400行/增加YLED=1;             (4)编译                          (5)下载配置                 左边导航栏--->workspece--->EnddeviceEB,下载

完整版请下载:coodr_or_endivce.zip

请下载:串口调试器 ---------------------------------------------------------------     初始化串口             配置串口号、波特率、流控、校验位等以前我们都是配置好寄存器然后使用。             现在我们在workspace 下找到HAL\Target\CC2530EB\drivers 的chal_uart.c文件,             我们可以看到里面已经包括了串口初始化、发送、接收等函数                  总结:             在组网的时候一定要注意修改panid 防止串网             ttySAC0 ---> 对应现在连接电脑的串口             ttySAC1 ---> com2             ttySAC2 ---> com3             ttySAC3 ---> com4           

串口调试器显示:

 

            开发板                           协调器节点             5v                    5v             rx                    tx             tx                    rx             gnd                    gnd         T**H**

ZigBee连接开发板显示温湿度           serial.c

#include <stdio.h> #include <fcntl.h>  #include <unistd.h> #include <termios.h>  #include <sys/types.h> #include <sys/select.h> #include <stdlib.h> #include <unistd.h> #include <netdb.h> #include <string.h> #include <errno.h> #include <time.h> #include <pthread.h> /*     目的:linux中的串口配置     效果:我的开发板跟另外一个开发板之间使用串口来收发数据     6818的开发板上有四个串口的驱动,分别     /dev/ttySAC0  ----/dev/ttySAC3     接收端 */ #define UARTPATH   "/dev/ttySAC1" int ser_fd; //将串口配置封装成函数 int serial_init(int *serialfd) {     struct termios myios;     //打开串口     *serialfd=open(UARTPATH,O_RDWR);//com2     if(*serialfd==-1)     {         perror("打开串口失败!\n");         return -1;     }     //获取现有串口参数     tcgetattr(*serialfd,&myios);     //原始模式      cfmakeraw(&myios);     //设置波特率     cfsetispeed(&myios, B115200);      cfsetospeed(&myios, B115200);     myios.c_cflag |= CLOCAL | CREAD;     //8位数据位,无奇偶校验     myios.c_cflag &= ~CSIZE;     myios.c_cflag |= CS8;     myios.c_cflag &= ~PARENB;  //无奇偶校验    //1位停止位    myios.c_cflag &= ~CSTOPB;    //清除串口缓冲区    tcflush(*serialfd,TCIOFLUSH);    myios.c_cc[VTIME] = 0;    myios.c_cc[VMIN] = 1;    tcflush(*serialfd,TCIOFLUSH);    //让前面的配置生效    tcsetattr(*serialfd,TCSANOW,&myios);    return 0; } void *fun(void *arg) {     char message[6];     while(1)     {         memset(message,0,6);         read(ser_fd,message,6);         printf("message = %s\n",message);         //打开LCD屏         int fd = open("/dev/fb0", O_WRONLY);         if(fd == -1)         {             perror("打开LCD失败:\n");             exit(0);         }         write(fd, &message, 4);         close(fd);         tcflush( ser_fd, TCIOFLUSH); //刷新缓冲区     }      } int main() {          char buf[30];     //配置串口     serial_init(&ser_fd);     //使用串口收发数据(通过串口接收数据)     pthread_t thread;     pthread_create(&thread,NULL,fun,NULL);     while(1)     {         write(ser_fd,"11",3);         sleep(1);         write(ser_fd,"10",3);         sleep(1);         write(ser_fd,"21",3);         sleep(1);         write(ser_fd,"20",3);         sleep(1);     }     //关闭     close(ser_fd);     return 0; }  

在虚拟机上编译:

arm-none-linux-gnueabi-gcc serial.c -o serial -lpthread

在LCD开发板上下载并打开:

tftp -g 192.168.1.182 -r serial chmod 777 serial ./serial

    结果显示:

转载请注明原文地址: https://www.6miu.com/read-3199949.html

最新回复(0)