手把手实践丨基于STM32+华为云设计的智慧烟感系统
Posted 华为云开发者社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手实践丨基于STM32+华为云设计的智慧烟感系统相关的知识,希望对你有一定的参考价值。
摘要:当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。
本文分享自华为云社区《基于STM32+华为云设计的智慧烟感系统》,作者:DS小龙哥 。
一、概述
当前基于STM32和华为云,设计了一种智慧烟感系统,该系统可以检测烟雾,同时将检测到的数据上传到云端进行处理和分析。系统可用于家庭、办公室等需要安装烟雾报警器场所。
二、系统设计
2.1 系统硬件设计
【1】硬件平台
该系统主要使用STM32F103ZET6微控制器作为核心控制器,并搭配数码显示器、蜂鸣器、MQ4烟雾传感器、WiFi模块等作为辅助组件。
【2】系统连接
STM32F103ZET6微控制器通过GPIO连接数码显示器、蜂鸣器、MQ4烟雾传感器等外设。通过UART连接WiFi模块,将读取到的数据上传到云端。
【3】系统工作流程
系统在启动时,首先进行硬件初始化和WiFi连接操作。之后,通过烟雾传感器实时检测室内环境中的烟雾浓度,当烟雾浓度超出一定阈值时,蜂鸣器会发出警报,同时将警报信息上传到云端。在云端,系统可以对上传的数据进行处理和分析,如通过分析历史数据预测烟雾浓度的变化趋势等。
2.2 系统软件设计
【1】软件平台
系统的软件平台主要由STM32的HAL库和华为云平台的API组成。
【2】软件流程
系统在启动时,首先进行硬件初始化和WiFi连接操作。之后,通过HAL库读取MQ4烟雾传感器的数据,并根据数据判断是否触发烟雾警报。如果触发了烟雾警报,则蜂鸣器发出警报,并通过WiFi模块将警报信息上传到云端。在云端,系统通过华为云平台的API接口获取上传的数据,并进行处理和分析。
三、华为云IOT平台开发
在华为云IOT平台上,需要进行设备接入、数据模型定义、规则引擎配置和应用开发等四个核心模块的开发。其中,设备接入模块包括设备注册、获取设备证书、建立连接等步骤,以保障设备与云平台之间的安全通信;数据模型定义模块需要根据实际需求定义相应的数据模型,包括上传数据格式、设备属性和服务等。规则引擎配置模块需要完成实时消息推送、远程控制和告警等功能。应用开发模块则是将完整的智能井盖系统进行打包,为用户提供统一的操作接口。
华为云官网: https://www.huaweicloud.com/
打开官网,搜索物联网,就能快速找到 设备接入IoTDA。
3.1 物联网平台介绍
华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
3.2 开通物联网服务
地址: https://www.huaweicloud.com/product/iothub.html
开通标准版免费单元。
开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。
总结:
端口号: MQTT (1883)| MQTTS (8883) 接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com
根据域名地址得到IP地址信息:
Microsoft Windows [版本 10.0.19044.2846] (c) Microsoft Corporation。保留所有权利。 C:\\Users\\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com 正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据: 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=36ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 121.36.42.100 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 36ms,最长 = 37ms,平均 = 36ms C:\\Users\\11266>
MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。
3.3 创建产品
(1)创建产品
点击右上角创建产品。
(2)填写产品信息
根据自己产品名字填写,设备类型选择自定义类型。
(3)添加自定义模型
产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。
模型简单来说: 就是存放设备上传到云平台的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状态图等等,这些我们都可以单独创建一个模型保存。
3.4 添加设备
产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。
(1)注册设备
点击右上角注册设备。
(2)根据自己的设备填写
在弹出的对话框里填写自己设备的信息。根据自己设备详细情况填写。
(3)保存设备信息
创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。
3.5 MQTT协议主题订阅与发布
(1)MQTT协议介绍
当前的设备是采用MQTT协议与华为云平台进行通信。
MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。
MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。
华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
业务流程:
(2)华为云平台MQTT协议使用限制
(3)主题订阅格式
帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
对于设备而言,一般会订阅平台下发消息给设备 这个主题。
设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。
(4)主题发布格式
对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。
这个操作称为:属性上报。
帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
3.6 MQTT三元组
MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。
接下来介绍,华为云平台的MQTT三元组参数如何得到。
(1)MQTT服务器地址
要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。
帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。
根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)
华为云的MQTT服务器地址:121.36.42.100 华为云的MQTT端口号:1883
(2)生成MQTT三元组
华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。
下面是打开的页面:
3.7 参考案例
华为云平台部署开发也可以参考这里:
https://bbs.huaweicloud.com/blogs/381072
【基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)】
四、烟感核心代码
【1】MQ2传感器
以下是一个读取MQ2传感器数据,并转换为烟雾浓度的示例代码,
#include "stm32f10x.h" #include <stdio.h> int main(void) // 初始化ADC ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置ADC通道1的GPIO引脚 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // 启动ADC校准 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); // 读取ADC值 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t adc_value = ADC_GetConversionValue(ADC1); // 计算烟雾浓度 float voltage = (float)adc_value / 4096.0f * 3.3f; float density = (voltage - 0.4f) / 0.4f * 10000.0f; // 打印出烟雾浓度 printf("MQ2 Smoke Density: %.2f ppm\\n", density); float adc_average() const int num_discarded = 3; // 剔除的最大/最小值数量 float samples[20]; // 存储采样结果的数组 // 采集数据 for (int i = 0; i < num_samples; i++) samples[i] = ADC_GET(); // 对采样结果进行排序(升序) for (int i = 0; i < num_samples - 1; i++) for (int j = i + 1; j < num_samples; j++) if (samples[i] > samples[j]) float temp = samples[i]; samples[i] = samples[j]; samples[j] = temp; // 计算剩下的平均值 float sum = 0; for (int i = num_discarded; i < num_samples - num_discarded; i++) sum += samples[i]; return sum / (num_samples - 2 * num_discarded); // 返回计算结果
【2】MQ4传感器
以下是基于HAL库的STM32F103ZET6读取MQ4烟雾传感器的代码:
#include "gpio.h" /* MQ4传感器的引脚定义 */ #define MQ4_PORT GPIOA #define MQ4_PIN GPIO_PIN_0 /* MQ4传感器的校准电压 */ #define MQ4_RL_VALUE 10 // RL值为10kΩ #define MQ4_CALCULATE_RO_CLEAN(adcValue) ((float)(RL_VALUE*(4096-adcValue)/adcValue)) /* 获取MQ4传感器的数据 */ float get_mq4_value() uint32_t adc_value = HAL_ADC_GetValue(&hadc1); float ro = MQ4_CALCULATE_RO_CLEAN(adc_value); float sensor_volt = HAL_ADC_GetValue(&hadc2) * (3.3 /4096.0); float sensor_rsr = (3.3 - sensor_volt) / sensor_volt * ro; float mq4_ppm = pow(10, ((log10(sensor_rsr / 2.5) - 0.3420) / (-0.6162))); return mq4_ppm; /* 主函数 */ int main() HAL_Init(); MX_GPIO_Init(); MX_ADC1_Init(); MX_ADC2_Init(); /* 读取MQ4传感器数据 */ float mq4_value = get_mq4_value(); printf("MQ4传感器值:%.2f PPM\\r\\n", mq4_value); while (1);
在该示例代码中,我们用到了ADC1和ADC2来分别读取MQ4传感器的数据引脚和校准电压。函数get_mq4_value()中使用了MQ4传感器的电路计算公式,将读取的传感器数据转化成对应的PPM值。
五、系统优化设计
为了提高系统的准确性和实用性,采取以下优化方案:
【1】使用多个传感器
在实际应用中,可以通过使用多个烟雾传感器来提高系统的准确性。安装多个传感器,可以检测到更多的区域,从而更准确地判断室内是否有烟雾浓度超标的情况。
【2】使用专业的云平台
为了更好地管理和分析数据,可以选择一个专业的云平台,如华为云。使用云平台,可以更方便地对数据进行分析和处理,并实现更多的智能化管理功能。
【3】提高警报效果
为了更好地提高警报效果,除了使用蜂鸣器外,还可以考虑使用其他类型的报警器,如闪光灯、震动器等。这些报警器可以在不同场合下提供更好的报警效果。
【4】引入云服务
将数据上传到云端,不仅可以对数据进行分析和处理,还可以通过云平台提供的服务,如语音警报、邮件通知等方式及时向用户通报警情,让用户第一时间采取措施。
【5】实现远程控制
若在系统中加入控制模块,用户就可以在远程控制平台上通过云端控制系统,如关闭报警器、打开风扇等。对于需要海量数据处理和智能控制的复杂系统,基于云服务的远程控制就显得尤为重要。
六、总结
本文基于STM32和华为云平台,设计了一种智慧烟感系统。该系统可以检测烟雾浓度并上传数据到云端,通过云端进行分析和处理,实现报警和远程控制功能。通过不断地优化系统,可以不断提高系统的准确性和实用性,将其应用到更广泛的领域中。
动手实践丨手把手教你用STM32做一个智能鱼缸
摘要:本文基于STM32单片机设计了一款基于物联网的智能鱼缸。
本文分享自华为云社区《基于STM32+华为云IOT设计的物联网鱼缸【玩转华为云】》,作者: DS小龙哥 。
1. 前言
为了缓解学习、生活、工作带来的压力,提升生活品质,许多人喜欢在家中、办公室等场所养鱼。为节省鱼友时间、劳力、增加养鱼乐趣;为此,本文基于STM32单片机设计了一款基于物联网的智能鱼缸。该鱼缸可以实现水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能为一体的控制系统,鱼缸通过ESP8266连接华为云IOT物联网平台,并通过应用侧接口开发了上位机APP实现远程对鱼缸参数检测查看,并能远程控制。
从功能上分析,需要用到的硬件如下:
(1)STM32系统板
(2)水温温度检测传感器: 测量水温
(3)水质检测传感器: 测量水中的溶解性固体含量,反应水质。
(4)步进电机: 作为鱼饲料投食器
(5)RGB氛围灯: 采用RGB 3色灯,给鱼缸照明。
(6)抽水电动马达: 用来给鱼缸充氧,换水,加水等。
(7)ESP8266 WIFI:设置串口协议的WIFI,内置了TCP/IP协议栈,完善的AT指令,通过简单的指令就可以联网通信,但是当前采用的ESP8266没有烧写第三方固件,采用原本的原滋原味的官方固件,没有内置MQTT协议,代码里连接华为云物联网平台需要使用MQTT协议,所以在STM32代码里通过MQTT协议文档的字段结构自己实现了MQTT协议,在通过ESP8266的TCP相关的AT指令完成数据发送接收,完成与华为云IOT平台交互。
水产养殖水质常规检测的传感器有哪些?水产养殖水质常规检测的传感器有水质ph传感器、溶解氧传感器和温度传感器。
(1)水质ph传感器:
ph传感器是高智能化在线连续监测仪,由传感器和二次表两部分组成。可配三复合或两复合电极,以满足各种使用场所。配上纯水和超纯水电极,可适用于电导率小于3μs/cm的水质(如化学补给水、饱和蒸气、凝结水等)的pH值测量。
(2)溶解氧传感器:
氧气的消耗量与存在的氧含量成正比,而氧是通过可透膜扩散进来的。传感器与专门设计的监测溶氧的测量电路或电脑数据采集系统相连。 溶解氧传感器能够空气校准,一般校准所需时间较长,在使用后要注意保养。如果在养殖水中工作时间过长,就必须定期地清洗膜,对其进行额外保养。
在很多水产养殖中,每天测几次溶氧就可以了解溶氧情况。对池塘和许多水槽养殖系统。溶氧水平不会变化很快,池塘一般每天检测2~3次。 对于较高密度养殖系统,增氧泵故障发生可能不到1h就会造成鱼虾等大面积死亡。这些密度高的养殖系统要求有足够多的装备或每小时多次自动测量溶氧。
(3)温度传感器:
温度传感器有多种结构,包括热电偶、电阻温度传感器和热敏电阻。热电偶技术成熟,应用领域广,货源充足。选择热电偶必须满足温度范围要求,且其材料与环境相容。 电阻温度传感器(RTDs)的原理为金属的电阻随温度的改变而改变。大多电阻温度传感器(RTDs)由铂、镍或镍合金制成,其线性度比热电偶好,热切更加稳定,但容易破碎。 热敏电阻是电阻与温度具有负相关关系的半导体。热敏电阻比RTD和热电偶更灵敏,也更容易破碎,不能承受大的温差,但这一点在水产养殖中不成问题。
2. 硬件选型
2.1 STM32开发板
主控CPU采用STM32F103RCT6,这颗芯片包括48 KB SRAM、256 KB Flash、2个基本定时器、4个通用定时器、2个高级定时器、51个通用IO口、5个串口、2个DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片属于大容量类型,配置较高,整体符合硬件选型设计。当前选择的这款开发板自带了一个1.4寸的TFT-LCD彩屏,可以显示当前传感器数据以及一些运行状态信息。
2.2 杜邦线
2.3 PCB板
2.4 步进电机
2.5 抽水马达
2.6 水温检测传感器
测温采用DS18B20,DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
2.7 水质检测传感器
TDS (Total Dissolved Solids)、中文名总溶解固体、又称溶解性固体、又称溶解性固体总量、表明1升水肿容有多少毫克溶解性固体、一般来说、TDS值越高、表示水中含有溶解物越多、水就越不洁净、虽然在特定情况下TDS并不能有效反映水质的情况、但作为一种可快速检测的参数、TDS目前还可以作为有效的在水质情况反映参数来作为参考。常用的TDS检测设备为TDS笔、虽然价格低廉、简单易用、但不能把数据传给控制系统、做长时间的在线监测、并做水质状况分析、使用专门的仪器、虽然能传数据、精度也高、但价格很贵、为此这款TDS传感器模块、即插即用、使用简单方便、测量用的激励源采用交流信号、可有效防止探头极化、延长探头寿命的同时、也增加了输出信号的稳定性、TDS探头为防水探头、可长期侵入水中测量、该产品可以应用于生活用水、水培等领域的水质检测、有了这个传感器、可轻松DIY–套TDS检测仪了、轻松检测水的洁净程度。
2.8 ESP8266
■模块采用串口(LVTTL) 与MCU (或其他串口设备) 通信,内置TCP/IP协议栈,能够实现串口与WIFI之间的转换
■模块支持LVTTL串口, 兼容3…3V和5V单片机系统
■模块支持串 口转WIFI STA、串口转AP和WIFI STA+WIFI AP的模式,从而快速构建串口-WIFI数据传输方案
■模块小巧(19mm*29mm), 通过6个2.54mm间距排针与外部连接
3. 华为云IOT产品与设备创建
3.1 创建产品
链接:https://www.huaweicloud.com/product/iothub.html点击右上角窗口创建产品。
填入产品信息。
接下来创建模型文件:
创建服务。
创建属性。根据鱼缸设备的传感器属性来添加属性。
(1)LED氛围灯
(2)抽水电机
(3)水质传感器
(4)水温温度计
3.2 创建设备
地址: https://console.huaweicloud.com/iotdm/?reginotallow=cn-north-4#/dm-portal/device/all-device
点击右上角创建设备。
按照设备的情况进行填写信息。
设备创建后保存信息:
"device_id": "62cd6da66b9813541d510f64_dev1",
"secret": "12345678"
创建成功。
3.3 设备模拟调试
为了测试设备通信的过程,在设备页面点击调试。
选择设备调试:
3.4 MQTT三元组
为了方便能够以真实的设备登陆服务器进行测试,接下来需要先了解MQTT协议登录需要的参数如何获取,得到这些参数才可以接着进行下一步。
MQTT(Message Queuing Telemetry Transport)是一个基于客户端-服务器的消息发布/订阅传输协议,主要应用于计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备,适合长连接的场景,如智能路灯等。
MQTTS是MQTT使用TLS加密的协议。采用MQTTS协议接入平台的设备,设备与物联网平台之间的通信过程,数据都是加密的,具有一定的安全性。
采用MQTT协议接入物联网平台的设备,设备与物联网平台之间的通信过程,数据没有加密,如果要保证数据的私密性可以使用MQTTS协议。
在这里可以使用华为云提供的工具快速得到MQTT三元组进行登录。
工具的页面地址:
https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
根据提示填入信息,然后生成三元组信息即可。 这里填入的信息就是在创建设备的时候生成的信息。
DeviceId 62cd6da66b9813541d510f64_dev1
DeviceSecret 12345678
ClientId 62cd6da66b9813541d510f64_dev1_0_0_2022071609
Username 62cd6da66b9813541d510f64_dev1
Password a23fb6db6b5bc428971d5ccf64cc8f7767d15ca63bd5e6ac137ef75d175c77bf
3.5 平台接入地址
华为云的物联网服务器地址在这里可以获取:
https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT (1883) a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com
对应的IP地址是: 121.36.42.100
3.6 MQTT的主题订阅与发布格式
得到三元组之后,就可以登录MQTT服务器进行下一步的主题发布与订阅。
主题的格式详情:
https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html
设备消息上报 $oc/devices/device_id/sys/messages/up
平台下发消息给设备 $oc/devices/device_id/sys/messages/down
上传的消息格式:
"services": [
"service_id": "Connectivity",
"properties":
"dailyActivityTime": 57
,
"event_time": "20151212T121212Z"
,
"service_id": "Battery",
"properties":
"batteryLevel": 80
,
"event_time": "20151212T121212Z"
]
根据当前设备的格式总结如下:
ClientId 62cd6da66b9813541d510f64_dev1_0_0_2022071609
Username 62cd6da66b9813541d510f64_dev1
Password a23fb6db6b5bc428971d5ccf64cc8f7767d15ca63bd5e6ac137ef75d175c77bf
//订阅主题: 平台下发消息给设备
$oc/devices/62cd6da66b9813541d510f64_dev1/sys/messages/down
//设备上报数据
$oc/devices/62cd6da66b9813541d510f64_dev1/sys/properties/report
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
"services": ["service_id": "fish","properties":"LED":1,"service_id": "fish","properties":"motor":1,"service_id": "fish","properties":"水温":36.2]
3.7 MQTT客户端模拟设备调试
得到信息之后,将参赛填入软件进行登录测试。
数据发送之后,在设备页面上可以看到设备已经在线了,并且收到了上传的数据。
4. STM32程序设计
4.1 硬件连线
硬件连接方式:
1. TFT 1.44 寸彩屏接线
GND 电源地
VCC 接5V或3.3v电源
SCL 接PC8(SCL)
SDA 接PC9(SDA)
RST 接PC10
DC 接PB7
CS 接PB8
BL 接PB11
2. 板载LED灯接线
LED1---PA8
LED2---PD2
3. 板载按键接线
K0---PA0
K1---PC5
K2---PA15
4. DS18B20温度传感器接线
DQ->PC6
+ : 3.3V
- : GND
5. 步进电机
ULN2003控制28BYJ-48步进电机接线:
ULN2003接线:
IN-D: PB15 d
IN-C: PB14 c
IN-B: PB13 b
IN-A: PB12 a
+ : 5V
- : GND
6. 抽水电机
GND---GND
VCC---5V
AO----PA4
7. 水质检测传感器
AO->PA1
+ : 3.3V
- : GND
8. RGB灯
PC13--R
PC14--G
PC15--B
9. ATK-ESP8266 WIFI接线
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)
4.2 硬件原理图
4.3 汉字取模
4.4 程序下载
下载软件在资料包里。点击开始编程之后,点击开发板的复位键即可下载程序进去。
4.5 主要的信息连接代码
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include "mqtt.h"
#include "oled.h"
#include "fontdata.h"
#include "bh1750.h"
#include "iic.h"
#include "sht3x.h"
#define ESP8266_WIFI_AP_SSID "aaa" //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define ESP8266_AP_PASSWORD "12345678" //将要连接的路由器密码
//华为云服务器的设备信息
#define MQTT_ClientID "62cd6da66b9813541d510f64_dev1_0_0_2022071609"
#define MQTT_UserName "62cd6da66b9813541d510f64_dev1"
#define MQTT_PassWord "a23fb6db6b5bc428971d5ccf64cc8f7767d15ca63bd5e6ac137ef75d175c77bf"
//订阅与发布的主题
#define SET_TOPIC "$oc/devices/62cd6da66b9813541d510f64_dev1/sys/messages/down" //订阅
#define POST_TOPIC "$oc/devices/62cd6da66b9813541d510f64_dev1/sys/properties/report" //发布
4.6 ESP8266主要代码
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函数功能: ESP8266命令发送函数
函数返回值:0表示成功 1表示失败
*/
u8 ESP8266_SendCmd(char *cmd)
int RX_CNT=0;
u8 i,j;
for(i=0;i<10;i++) //检测的次数--发送指令的次数
USARTx_StringSend(USART3,cmd);
for(j=0;j<100;j++) //等待的时间
delay_ms(50);
if(USART3_RX_STA&0X8000)
RX_CNT=USART3_RX_STA&0x7FFF;
USART3_RX_BUF[RX_CNT]=\\0;
USART3_RX_STA=0;
if(strstr((char*)USART3_RX_BUF,"OK"))
return 0;
return 1;
/*
函数功能: ESP8266硬件初始化检测函数
函数返回值:0表示成功 1表示失败
*/
u8 ESP8266_Init(void)
//退出透传模式
USARTx_StringSend(USART3,"+++");
delay_ms(100);
//退出透传模式
USARTx_StringSend(USART3,"+++");
delay_ms(100);
return ESP8266_SendCmd("AT\\r\\n");
/*
函数功能: 一键配置WIFI为AP+TCP服务器模式
函数参数:
char *ssid 创建的热点名称
char *pass 创建的热点密码 (最少8位)
u16 port 创建的服务器端口号
函数返回值: 0表示成功 其他值表示对应错误值
*/
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
char *p;
u8 i;
char ESP8266_SendCMD[100]; //组合发送过程中的命令
/*1. 测试硬件*/
if(ESP8266_SendCmd("AT\\r\\n"))return 1;
/*2. 关闭回显*/
if(ESP8266_SendCmd("ATE0\\r\\n"))return 2;
/*3. 设置WIFI模式*/
if(ESP8266_SendCmd("AT+CWMODE=2\\r\\n"))return 3;
/*4. 复位*/
ESP8266_SendCmd("AT+RST\\r\\n");
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
/*5. 关闭回显*/
if(ESP8266_SendCmd("ATE0\\r\\n"))return 5;
/*6. 设置WIFI的AP模式参数*/
sprintf(ESP8266_SendCMD,"AT+CWSAP=\\"%s\\",\\"%s\\",1,4\\r\\n",ssid,pass);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
/*7. 开启多连接*/
if(ESP8266_SendCmd("AT+CIPMUX=1\\r\\n"))return 7;
/*8. 设置服务器端口号*/
sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\\r\\n",port);
if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
/*9. 查询本地IP地址*/
if(ESP8266_SendCmd("AT+CIFSR\\r\\n"))return 9;
//提取IP地址
p=strstr((char*)USART3_RX_BUF,"APIP");
if(p)
p+=6;
for(i=0;*p!=";i++)
ESP8266_IP_ADDR[i]=*p++;
ESP8266_IP_ADDR[i]=\\0;
//提取MAC地址
p=strstr((char*)USART3_RX_BUF,"APMAC");
if(p)
p+=7;
for(i=0;*p!=";i++)
ESP8266_MAC_ADDR[i]=*p++;
ESP8266_MAC_ADDR[i]=\\0;
//打印总体信息
printf("当前WIFI模式:AP+TCP服务器\\r\\n");
printf("当前WIFI热点名称:%s\\r\\n",ssid);
printf("当前WIFI热点密码:%s\\r\\n",pass);
printf("当前TCP服务器端口号:%d\\r\\n",port);
printf("当前TCP服务器IP地址:%s\\r\\n",ESP8266_IP_ADDR);
printf("当前TCP服务器MAC地址:%s\\r\\n",ESP8266_MAC_ADDR);
return 0;
/*
函数功能: TCP服务器模式下的发送函数
发送指令:
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
int RX_CNT=0;
u8 i,j,n;
char ESP8266_SendCMD[100]; //组合发送过程中的命令
for(i=0;i<10;i++)
sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\\r\\n",id,len);
USARTx_StringSend(USART3,ESP8266_SendCMD);
for(j=0;j<10;j++)
delay_ms(50);
if(USART3_RX_STA&0X8000)
RX_CNT=USART3_RX_STA&0x7FFF;
USART3_RX_BUF[RX_CNT]=\\0;
USART3_RX_STA=0;
if(strstr((char*)USART3_RX_BUF,">"))
//继续发送数据
USARTx_DataSend(USART3,data,len);
//等待数据发送成功
for(n=0;n<200;n++)
delay_ms(50);
if(USART3_RX_STA&0X8000)
RX_CNT=USART3_RX_STA&0x7FFF;
USART3_RX_BUF[RX_CNT]=\\0;
USART3_RX_STA=0;
if(strstr((char*)USART3_RX_BUF,"SEND OK"))
以上是关于手把手实践丨基于STM32+华为云设计的智慧烟感系统的主要内容,如果未能解决你的问题,请参考以下文章