STC8: 编写机智云通讯协议配合ESP8266模块连接机智云平台——实现温度采集上报和控制两路LED

目录

一、创建产品和数据点

二、给通讯模块烧写机智云固件

三、编写单片机程序与ESP8266-01模块通讯

四、用官方App调试

五、完整工程文件下载


毕业设计是实现一个可以远程访问控制的装置,手头有个STC8(STC8A8K64S4A12)的开发板和ESP8266-01模块。了解各大云平台之后,发现大多云平台都是MQTT协议直接接入,或者提供SDK包。

一开始直接入手连接阿里云平台,但可惜并不容易。原因有三点:

①首先是STC8毕竟是51单片机,用不了阿里云提供的SDK包,Keil C51只支持ANSI C;

②用不了SDK包还可以手撸MQTT,可惜MQTT库没发现适合51单片机的,自己写的话太费力;

③可以采用支持MQTT协议AT指令的WiFi模块,很可惜ESP8266没有MQTT的AT指令集,看官网貌似是ESP32支持MQTT协议AT指令。

于是,打算先连接机智云平台练练手。之后打算购买阿里云推荐的支持MQTT协议AT指令的EMW3080模块连接阿里云。


一、创建产品和数据点

机智云平台的设备接入方式比较特殊,采用的是先给通讯模块烧机智云的固件,然后单片机通过机智云设置的通讯协议与通讯模块通讯,通讯模块自行与机智云服务器通讯。

首先第一步,在机智云平台创建一个产品,产品分类随便选,填一个喜欢的产品名称。通讯方式采用WiFi方式(ESP8266-01模块),数据传输方式指的是单片机与ESP8266模块通讯时,上传是每次上传所有数据点(定长),还是每次可上传任意部分数据点(变长),根据个人测试,选择定长方案即可,变长方案做成后云端显示不正确(目前不清楚什么原因);功耗类型选择正常。

下一步,在产品中添加数据点,我做的是控制两个LED+实时读取DS18B20温度传感器温度数据+在超出单片机设置的温度上下限后,接收高温or低温报警信息。

需要注意的的是,机智云中数值型数据用的是无符号整数来表示,比如我设置的DS18B20温度是 -55 ~ 125,步长 0.125 ,那么温度是 -55 时,数据值应当是 0 ,温度是 125 时,数据值为 (125 - (-55)) / 0.125 = 1440,这一定程度的减轻了单片机的计算量。一般读取传感器数据时,单片机内部用无符号整数存储及运算,也就可以直接传递给通讯模块而不用sprintf函数加工为float型。

二、给通讯模块烧写机智云固件

按照官方文件说明操作就可以了。

ESP8266-01 :8M Flash不能烧错,官方文档:http://docs.gizwits.com/zh-cn/deviceDev/ESP8266%E4%B8%B2%E5%8F%A3%E7%83%A7%E5%86%99%E8%AF%B4%E6%98%8E.html

 烧好固件后把模块先放一边,开始编写单片机程序与模块进行通讯。

三、编写单片机程序与ESP8266-01模块通讯

除去采集传感器数据、控制LED的程序,主要待完成的是机智云通讯协议,才能与烧有机智云固件的WiFI模组通讯。

下载机智云的通讯协议文档,(根据当前产品数据点设置,机智云自动调整了上传数据点指令和云端下达控制指令的数据格式部分)。

阅读通讯协议文档后发现协议较为简单,通讯模组上电后就会不断发送 0x01 命令,向单片机请求设备信息,我们只需要在接收后按照指定格式回复各ProductKey、ProductSecret(在产品的基本信息处复制)等信息就可以。之后通讯模组会定时发送心跳包请求,单片机应当及时回复心跳包;单片机主动上传数据时发送0x05命令,收到通讯模组回应0x06命令表示模组已收到;

每个命令的格式参见协议文档开头(重要!)

#我们要实现的是不断监视串口发来的数据,收到一个完整的命令后,判断命令号是回复命令还是请求命令。

  • 如果接收到一个请求命令,单片机立即执行该请求,并发送回复命令;
  • 如果接收到一个回复命令,单片机查询是否为先前发送的请求命令的回复,如果不是,转为发送0x12通知模组该命令非法;
  • 如果当前传感器数据发生变化,需要上报数据(或其他需求如需要模组获取网络时间),单片机自动发送对应命令号的请求命令,发送请求命令后标识开始等待模组回复,每200ms没有接收到回复,重新发送请求命令,重新发送三次后放弃当前命令。
  • 在发送请求命令等待应答时不能再发送请求命令。
  • 当接收到模组发送的0x11命令时,说明模组收到了一条非法命令,单片机应当根据该命令流水号Sn值在自己回复or请求命令的历史记录中查询,查询到后重新发送该命令。命令历史记录需要记录最近发送的请求命令和若干条回复命令,通过队列不断入队新命令来完成存储。

 

下面示例(可跳过,直接在文末链接直接下载完整Keil5工程文件)

首先,串口1负责打印日志,串口4负责与模组通信(波特率必须是9600,机智云固件设定),定时器0负责产生1ms定时,供给系统时间。

串口4将接收到的数据放入缓冲区内,缓冲区环形存储,用两个下标作为指针维护,如果单片机来不及处理导致缓冲区写满,则亮绿色LED表明串口缓冲区已满,不再写入。

void UART4_ISR(void) interrupt 18
{
    if (S4CON & S4RI)
    {
        S4CON &= ~S4RI;
        LED_GREEN = 1;
        if ((uart4_idx2 + 1) % uart4_buffer_size == uart4_idx1) //串口缓冲区已满,放弃当前数据
        {                                                       //不能打印日志,可能导致堆栈错误
            LED_GREEN = 0;                                      //亮绿灯
  • 5
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值