简介
给大家介绍一下这个单片机项目。
个人体会:
当时是因为毕业设计,在网上查看相关资料时,发现有一些人,是接这个种毕业设计项目的,要好几千。我又不想花钱,就慢慢在B站上翻的学习资料(感谢B站让我完成80%的内容,感谢喜欢分析的大佬们)。这个毕业设计还是蛮有意义的,是实习的时候做的,白天上班,晚上做毕设,一天的社畜。不想花钱的学弟学妹们,可以作为参考。特别是用到了ZigBee组网的同学。
基于zigbee的智能鱼缸(鱼塘)养殖
本系统主要用到的ZigBee协议栈基础代码分享
链接:
1 项目介绍
该项目是物联网三层架构,感知层、网络层、应用层。
1.1 感知层*
通过ZigBee的协议栈进行组网,实现终端采集传感器的各项数据,在通过组网无线传输将数据发送到协调器。协调器利用串口传输将数据发送至Coterx-A53(6818)开发板子。
1.2 网络层:
在进行网关数据处理,通过腾讯云服务提供的公网IP实现TCP可靠传输将数据发送至云服务器中,数据在转发至手机APP中,进行显示和下发。
1.3 应用:
系统设计了手机APP,通过QT可视化界面交互编程,实现Coterx-A53(6818)开发板的数据显示和手机APP的实时监测传感器采集的数据,确保实时性的同时,能够让用户更加的方便,并且能够根据不同鱼类进行修改相关的阈值,来进行智能化控制单片机的外部设备,达到水体环境调节的作用。
控制部分可以采用自动控制和用户预定时控制、用户手动控制,手机APP或者是Coterx-A53(6818)下发命令,鱼塘环境设备根据指令做出相应的动作;当数据超过阈值,设备自动进行处理并警报,当水体环境下降至正常状态,警报结束。总体功能分为:数据采集功能,数据执行设备,用户手动设备。
2 系统架构
3 实验效果
视频:https://www.bilibili.com/video/BV1ZX4y1n78u/?vd_source=bd8f37dbcfa78eb9a2851c0ec844f419
4 实验代码
4.1 ZigBee底层代码
4.1.1 ZigBee基础协议栈
4.1.1.1 ZigBee终端节点:接收:
主要用于接收,协调器AF射频发送的数据或者指令
void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint16 flashTime;
char buf[10]={
0};
switch ( pkt->clusterId )
{
case SAMPLEAPP_PERIODIC_CLUSTERID:
// HalUARTWrite ( 0, pkt->cmd.Data, 10 );
//用一个缓冲区接收数据
/*
buff[0] = 步进电机指令
buff[1] = 水阀1(加水)继电器
buff[2] = 水阀2(放水)继电器
buff[3] = 氧气泵(增氧)继电器
1表示开,0表示关闭
*/
sprintf(buf,"%s",pkt->cmd.Data);
if(buf[0] == '1')
{
Motor_up();
flag = 1;
}
else if(buf[1] == '1')
{
}
break;
case SAMPLEAPP_FLASH_CLUSTERID:
flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
break;
}
}
上面这个接收协调器数据的函数时ZigBee协议自带的
// Received when a key is pressed
case KEY_CHANGE:
SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
// Received when a messages is received (OTA) for this endpoint
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt );
break;
4.1.1.2 ZigBee终端节点:发送:
这是点对点模式的ZigBee,目的是将终端节点采集到的数据发送至协调器的函数。
void SampleApp_Send_P2P_Message( void )
{
uint8 str[15];
uint8 temp;
uint8 water = 0;
float height =0;
float perence;
perence = GetFTU();
height = GetWater();
if((int)height>0)
{
water = 1;
}else water = 0;
//温度传感器
temp = ReadDs18B20();
if(water == 1)
{
P0_1 =1;
on_flag = 0;
}
str[0] = 49;
str[1] = temp/10+48;
str[2] = temp%10+48;
str[3] = (int)perence/1000+48;
str[4] = (int)perence/100%10+48