摘要:以CC2530单片机为核心器件,设计一个冷链环境信息采集系统,利用传感器技术对冷藏仓内的环境参数进行采集,上传到华为云物联网云平台,然后通过手机端或移动端进行显示,便于分析,观察冷链环境信息。

本文分享自华为云社区《基于CC2530_ZigBee+华为云IOT设计的冷链信息采集系统【玩转华为云】》,作者: DS小龙哥 。

1、前言

近年来,随着人们消费需求的不断提高,连锁超市、便利店、大卖场等商超不但提供了各种各样的新鲜食品,而且采用统一进货和冷链储藏的方式,从而不但使得商品质量有保证,而且购物环境良好,越来越成为人们购物的主要场所。超市作为冷链物流产品的末端,在分销以及零售过程中都对产品质量、运营成本和功耗等方面有着较高的要求,而冷链系统的压力参数作为保证这一品质的重要参数之一,实现智能压力检测和控制对于时刻掌握冷链的工作状态非常重要,可以保证运营的安全性和经济性。因此,如果能够设计一款针对冷链系统数据采集系统,就可以实现对冷链系统进行实时监控,达到经济性运营的目的,对提高企业经济效益具有非常重要的意义。

2、设计需求

以CC2530单片机为核心器件,设计一个冷链环境信息采集系统,利用传感器技术对冷藏仓内的环境参数进行采集,上传到物联网云平台,然后通过手机端或移动端进行显示,便于分析,观察冷链环境信息。

硬件选型:

(1)ESP8266-WIFI 用于与上位机进行通信,实现数据传输
(2)CC2530单片机,本身是51内核,与普通的51单片机编程一样,它内部多了一个ZigBee 模块,能实现ZigBee 组网。
(3)DHT11 温湿度传感器。这是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。
(4)蜂鸣器。当设置阀值超出标准时,可以发出警报提醒。

3、硬件选型

3.1 CC2530+WIFI模块

3.2 DHT11温湿度模块

3.3 蜂鸣器

4、物联网云端配置与应用

4.1 华为云IoTDA介绍

当前的设计中,用的物联网平台服务是华为云的设备接入服务(IoTDA),IoTDA提供海量设备连接上云、设备和云端双向消息通信、批量设备管理、远程控制和监控、OTA升级、设备联动规则等能力,并可将设备数据灵活流转到华为云其他服务。

使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。

设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。

业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

接下来就详细把整个物联网平台的使用流程进行介绍。

4.2 产品创建

地址: https://www.huaweicloud.com/

查看平台接入地址:

点击右上角创建产品:

根据自己的产品信息填充:

根据产品的传感器属性创建服务器的属性字段:

4.3 设备创建

详细创建流程,看下面的截图:

保存设备信息,接下来的MQTT登录需要使用。

{
"device_id": "62e732be3a884835598654f7_dev1",
"secret": "12345678"
}

4.4 MQTT三元组信息生成

在这里可以使用华为云提供的工具快速得到MQTT三元组进行登录。
https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#ZH-CN_TOPIC_0240834853__zh-cn_topic_0251997880_li365284516112

工具的页面地址:
https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
根据提示填入信息,然后生成三元组信息即可。 这里填入的信息就是在创建设备的时候生成的信息。

ClientId 62e732be3a884835598654f7_dev1_0_0_2022080102
Username 62e732be3a884835598654f7_dev1
Password 13483ebeadd786ea107527a3c92c5463a8f3c71377cd33276143ffe2fb85c1dc

4.5 MQTT主题订阅与发布格式

//订阅主题: 平台下发消息给设备
$oc/devices/62e732be3a884835598654f7_dev1/sys/messages/down
//设备上报数据
$oc/devices/62e732be3a884835598654f7_dev1/sys/properties/report
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
{"services": [{"service_id": "server_id","properties":{"温度":23.4}},{"service_id": "server_id","properties":{"湿度":80.5}}]}

4.6 设备模拟登录测试

4.7 应用侧开发接口介绍

在设备上云之后,为了能方便管理设备,方便用户设备入网,都需要开发一款手机APP或者微信小程序、桌面软件等,进行数据交互,设备管理。

华为云IOT提供了应用侧开发的API对接接口,这里就介绍一下使用应用侧开发的流程。这个API接口里常用的接口包括:产品创建、设备创建、设备属性获取、设备删除、查询设备等管理接口,可以通过API主动获取产品下面某个设备的属性,要求设备上报最新的数据过来。整个开发过程,都是基于HTTP协议的API接口进行交互,不依赖开发环境,不依赖开发语言。 不管是桌面软件,还是手机APP、微信小程序、web网页等,核心代码基本都是一样,都是HTTP协议交互。下面的例子里,我是采用C++编写的,采用QT框架库完成整个开发,了解了整个思路,你就可以采用自己熟悉的语言完成相同的功能。

官方帮助文档:https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html

5、CC2530程序设计

5.1 IAR环境搭建

完整的安装整个配套环境,需要安装以下的软件,具体的版本型号也介绍了,直接百度搜索就能找到;最简单的办法是,淘宝搜索一下CC2530的开发板,店铺里一般都有配套的资料包下载,里面基本都包含了下面这些软件,直接白嫖就行:

安装集成开发环境: IAR-EW8051-8.10.1。
安装仿真器“SmartRF4EB”的驱动程序。
安装代码烧写工具: Setup_SmartRF_Programmer_1.10.2。
安装 TI 的 Zigbee 协议栈: ZStack-CC2530-2.5.1a。

安装过程截图请看另外的文档。

5.2 硬件原理图

5.3 IAR程序工程图

5.4 DHT11.c代码

#include "uart.h"
/*
函数功能:串口0初始化
*/
void Init_Uart0(void)
{
PERCFG&=~(1<<0); //串口0的引脚映射到位置1,即P0_2和P0_3
P0SEL|=0x3<<2; //将P0_2和P0_3端口设置成外设功能
U0BAUD = 216; //32MHz的系统时钟产生115200BPS的波特率
U0GCR&=~(0x1F<<0);//清空波特率指数
U0GCR|=11<<0; //32MHz的系统时钟产生115200BPS的波特率
U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器
U0CSR |= 0x3<<6; //选择UART模式,使能接收器
}
/*
函数功能:UART0发送字符串函数
*/
void UR0SendString(u8 *str)
{
while(*str!='\0')
{
U0DBUF = *str; //将要发送的1字节数据写入U0DBUF
while(UTX0IF == 0);//等待数据发送完成
UTX0IF = 0; //清除发送完成标志,准备下一次发送
str++;
}
}
/*
函数功能: 模仿printf风格的格式化打印功能
*/
char USART0_PRINT_BUFF[200]; //格式化数据缓存数据
void USART0_Printf(const char *format,...)
{
char *str=NULL;
/*1. 格式化转换*/
va_list ap; // va_list---->char *
va_start(ap,format); //初始化参数列表
vsprintf(USART0_PRINT_BUFF,
format,
ap); //格式化打印
va_end(ap); //结束参数获取
/*2. 串口打印*/
str=USART0_PRINT_BUFF;//指针赋值
while(*str!='\0')
{
U0DBUF=*str; //发送一个字节的数据
str++; //指针自增,指向下一个数据
while(UTX0IF == 0);//等待数据发送完成
UTX0IF = 0; //清除发送完成标志,准备下一次发送
}
}

5.5 ESP8266.c代码

#include "esp8266.h"
uint lenU1 = 0;
uchar tempRXU1;
uchar RecdataU1[MAXCHAR];
//"AT+CIPSEND=0,10\r\n" //长度10
//返回">" 之后就可以正常发送数据了
//发送成功返回 "SEND OK"
//发送数据
void ESP8266_SendData(char *p,int len)
{
int i=0;
char buff[50];
sprintf(buff,"AT+CIPSEND=0,%d\r\n",len);
clearBuffU1();
Uart1_Send_String(buff); //发送指令
DelayMs(1000); //等待
for(i=0;i<len;i++)
{
Uart1_Send_Char(p[i]);
}
//等待发送完成
DelayMs(1000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
}
/****************************************************************************
* 名 称: SetWifi()
* 功 能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void SetWifi(void)
{
P0DIR |= 0x40; //P0.6定义为输出
IGT = 0; //高电平复位
DelayMs(500);
IGT = 1; //低电平工作
}
/*
设置WIFI为AP模式+TCP服务器
*/
void SetESP8266_AP_TCP_Server()
{
clearBuffU1();
Uart1_Send_String("AT\r\n");
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("ATE0\r\n");
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CWMODE=2\r\n");
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+RST\r\n");
DelayMs(2000);
DelayMs(2000);
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("ATE0\r\n");
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CWSAP=\"wifi_cc2530\",\"12345678\",1,4\r\n");
DelayMs(2000);
DelayMs(2000);
DelayMs(2000);
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CIPMUX=1\r\n");
DelayMs(2000);
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CIPSERVER=1,8089\r\n");
DelayMs(2000);
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CIFSR\r\n");
DelayMs(2000);
DelayMs(2000);
RecdataU1[lenU1]='\0';
UR0SendString(RecdataU1);
}
unsigned char dataRecv;
unsigned char Flag = 0;
/*===================UR1初始化函数====================*/
void Init_Uart1()
{
PERCFG = 0x00;//位置1 P0.4/P0.5口
P0SEL |= 0x30;//P0.4,P0.5用作串口(外部设备功能)
U1CSR |= 0x80;//设置为UART方式
U1GCR |= 11;//BAUD_E
U1BAUD |= 216;//BAUD_M 波特率设为115200
UTX1IF = 0; //UART1 TX中断标志初始置位0
U1CSR |= 0X40; //允许接收
IEN0 |= 0x88; // 开总中断,UART1接收中断
}
void clearBuffU1(void)
{
int j;
for(j=0;j<MAXCHAR;j++)
{
RecdataU1[j]=0x00;
}
lenU1=0;
}
/*******************************************************************************
串口1发送一个字节函数
*******************************************************************************/
void Uart1_Send_Char(char Data)
{
U1CSR &= ~0x40; //禁止接收
U1DBUF = Data;
while(UTX1IF == 0);
UTX1IF = 0;
U1CSR |= 0x40; //允许接收
}
/*******************************************************************************
串口1发送字符串函数
*******************************************************************************/
void Uart1_Send_String(char *Data)
{
while(*Data!='\0')
{
Uart1_Send_Char(*Data);
Data++;
}
}
/****************************************************************
串口接收一个字符: 一旦有数据从串口传至CC2530, 则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX1_VECTOR
__interrupt void UART1_ISR(void)
{
if(lenU1<81)
{
tempRXU1 = U1DBUF;
RecdataU1[lenU1]=tempRXU1;
URX1IF = 0; // 清中断标志
lenU1++;
}
}

6、总结

随着业务的发展,越来越多的企业选择结合物联网技术来实现自身效益增长。相比企业自建MQTT集群,使用华为云IoT服务低成本构建物联网解决方案,在能力、成本、运维、安全、生态等诸多方面具有突出优势。 广泛支持IoT主流的接入协议及私有协议,满足各类设备和接入场景要求;与主流模组、芯片预集成,实现多网络、多协议接入,简化设备接入难度,实现小时级设备极简接入。

点击关注,第一时间了解华为云新鲜技术~

CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统的更多相关文章

  1. 基于STM32+华为云IOT设计智能称重系统

    摘要:选择部署多个重量传感器和必要的算法.通过WiFi 通信模块.GPS定位模块,采集车辆称重数据一地理位置信息,并通过网络发送至云平台,设计图形化UI界面展示称重.地图位置等重要信息,实现对称重系统 ...

  2. 华为云MVP熊保松谈物联网开发:华为云IoT是首选,小熊派是神器

    摘要:在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间,也得乘风破浪跟上新技术的节奏. 在AI.5G的技术驱动下,物联网行业的发展愈加如火如荼,开发者在技术的快速更迭间 ...

  3. 聊聊如何在华为云IoT平台进行产品开发

    摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...

  4. 基于华为云IoT Studio自助生成10万行代码的奥秘

    华为IoT小助手们搬好板凳.备好笔记本.听了HDC.Cloud的几场华为云技术架构师的直播讲课,感觉获益匪浅却又似懂非懂,直后悔自己没有好好打下基础.为了避免再次出现这样的情况,小助手偷偷跑去找了华为 ...

  5. 基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一

    [摘要]仓储管理存在四大细分场景:出入库管理.盘点.分拣和货物跟踪.本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践. 仓储 ...

  6. 直击Huawei Mate 40产线背后的华为云IoT智能制造

    摘要:数字孪生?在数字世界找到物理世界的设备! 本文分享自华为云社区<[云驻共创]Huawei Mate 40产线直击之华为云IoT智能制造助力工厂数字化转型>,原文作者:启明. Part ...

  7. OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?

    摘要:本文主要介绍基于OpenHarmony 3.0版本来对接华为云IoT设备接入IoTDA,以小熊派BearPi-HM_Nano开发板为例,使用huaweicloud_iot_link SDK对接华 ...

  8. 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载

    ArchSummit全球架构师峰会是InfoQ中国团队推出的重点面向高端技术管理者.架构师的技术会议,54%参会者拥有8年以上工作经验.ArchSummit聚焦业界强大的技术成果,秉承"实践 ...

  9. Modbus的设备怎么对接华为云 使用金鸽BL100只需要5步

    BL100是一款高性价比的Modbus转MQTT网关支持一键对接阿里云.华为云. BL100将Modbus串口设备的数据上传至华为云只需要简单五步 第一步.首先将Modbus的设备通过RS485接上M ...

随机推荐

  1. 使用pdfcrack & crunch暴力破解PDF密码

    crunch是密码字典生成器,可以根据指定的字符来生成组合密码字典. pdfcrack是Linux下一个PDF暴力破解密工具,可以使用crunch生成的密码字典来暴力破解PDF文件的密码. 注:没有强 ...

  2. 基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. 『忘了再学』Shell基础 — 28、AWK中条件表达式说明

    目录 1.AWK的条件表达 2.条件表达式说明 (1)BEGIN (2)END (3)关系运算符 (4)说明AWK中条件表达式的执行过程 (5)AWK中使用正则表达式 (6)A~B练习 1.AWK的条 ...

  4. TDSQL|三篇论文入选国际顶会SIGMOD,厉害了腾讯云数据库

    好消息!6月13日,腾讯云数据库三篇论文再次入选数据库行业顶会SIGMOD,被SIGMOD 2022 Research Full Paper(研究类长文)收录. 本次被收录的研究成果中,新型数据结构设 ...

  5. kruskal 及其应用

    kruskal 最小生成树 kruskal 是一种常见且好理解的最小生成树(MST)算法. 前置知识 并查集和路径压缩 生成树 在有 n 的顶点的无向图中,取其中 n-1 条边相连,所得到的树即为生成 ...

  6. Ubuntu-apt-get出错

    ubuntu apt-get的时候出现: E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission ...

  7. 基于JavaFX图形界面演示的迷宫创建与路径寻找

    事情的起因是收到了一位网友的请求,他的java课设需要设计实现迷宫相关的程序--如标题概括. 我这边不方便透露相关信息,就只把任务要求写出来. 演示视频指路: 视频过审后就更新链接 完整代码链接: 网 ...

  8. QT工程构建目录下,将生成的中间文件和可执行文件分离

    在QT工程中,当我们选择了构建目录后,编译生成程序后,总会发现在debug目录下会有混淆着各类文件,如下图 很多时候,我们又仅仅只需要可执行文件或者自定义的动态链接库.如下图 当然,如果不觉得麻烦,有 ...

  9. NC16539 [NOIP2013]表达式求值

    NC16539 [NOIP2013]表达式求值 题目 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 输入仅有一行,为需要你计算的表达式,表达式中只包含数字.加法运 ...

  10. vue 项目知识

    Vue使用 Vue 源码解析 Vue SSR 如何调试Vue 源码 如何学习开源框架---> 从它的第一次commit 开始看 国外的文章 大致了解写框架的过程(英文关键字) 找到关键---&g ...