草庐IT

STM32智能家居,ONENET获取数据及下发指令,代码已开源!!!

ProMonkeyZ 2023-04-08 原文

前言

使用onenet平台进行远程传输数据和远程控制开发板,但由于onenet官方给的代码只对他家的开发板比较友好,对于初学者来说修改这些代码相对麻烦,所以我就分享STM32C8T6接入onenet云平台的代码,这款单片机是我们做课程设计中比较常用,以后大家在我这份代码的基础上进行修改即可,希望可以帮到大家。
假设你已经有了onenet账号,以及创建了一个MQTT协议的产品,并在产品中添加一个设备。

一、环境介绍

(1)单片机采用:STM32F103C8T6或者F1其他系列单片机
(2)上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。
(3)开发软件:keil5
(4)硬件连接功能:ESP8266接在STM32的串口上。通过AT指令与ESP8266进行通信。

二、功能说明

通过OneNet物联网服务器实现设备数据远程上传、下发,实现数据交互(不清楚OneNet物联网服务器功能的可以百度一下进入官网看简介)。之前的OneNet服务器不支持标准MQTT协议登录的,现在官网更新之后支持标准的MQTT协议,此设计使用STM32+ESP8266使用标准MQTT协议登录Onenet服务器,实现数据交互。实现步骤OneNet官方提供了很详细的文档,可以参考一下。

1.单片机可以采集温湿度、光照度数据,通过OLED显示结果
2.可通过按键控制灯和蜂鸣器开关
3.单片机通过WIFI上传数据至ONENET平台
4.ONENET平台可下发指令控制单片机做出相应动作

下图是单片机实物图,包括esp826,温湿度传感器,光照传感器,RGB灯,按键以及蜂鸣器。


下图是onenet平台的监控界面

三、STM32代码修改

(1)数据上传部分代码:
这部分代码就是将我们的数据上传的ONENET云平台,
这里的数据流有:temperatureValue、humidityValue、lamp、key,这里的名字要和onenet平台上的名字相同
需要上传的数据:温度,湿度,光照度,灯的开关值
如果想要上传新的数据流,就复制memset、 sprintf、strcat三个函数的代码,写上你的数据流名称和需要上传的数据。

unsigned char OneNet_FillBuf(char *buf)
{
	char text[32];
	memset(text, 0, sizeof(text));
	strcpy(buf, ",;");
	
	memset(text, 0, sizeof(text));
	sprintf(text, "temperatureValue,%d;", temp);  //温度值
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "humidityValue,%d;", humi); //湿度值
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "lamp,%d;", Light);    //光照度值
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "key,%d;", key_velue);   //红灯开关
	strcat(buf, text);
	
	memset(text, 0, sizeof(text));
	sprintf(text, "key1,%d;", key1_velue);  //蓝灯开关 
	strcat(buf, text);
	
	return strlen(buf);
}

(2)命令下发部分代码:
主要看后面的if-esle if代码,关键是看你元件属性里的EDP命令内容。这里就在if语句里面对LED灯进行了远程控制。如果想要下发新的命令,可以再写一个else if语句。

	dataPtr = strchr(req_payload, ':');					//搜索':'
	if(dataPtr != NULL && result != -1)					//如果找到了
	{
		dataPtr++;
		while(*dataPtr >= '0' && *dataPtr <= '9')		//判断是否是下发的命令控制数据
		{
			numBuf[num++] = *dataPtr++;
		}
		num = atoi((const char *)numBuf);			 //转为数值形式
		if(strstr((char *)req_payload, "open"))		 //搜索"key"
		{
//			printf("open = %d\r\n", num);            //num就是key:{V}中V的值
			key_velue = num;                		 //更新数据到云平台
			PAout(5) =! num;                 	     //控制LED灯,低电平点亮
		}
		else if(strstr((char *)req_payload, "led1"))
		{
			key1_velue = num;                		 //更新数据到云平台
			PAout(6) =! num;                 			 //控制LED灯,低电平点亮
		}	
	}

(3)连接onenet需要修改的代码

#define ESP8266_WIFI_INFO		"AT+CWJAP=\"smarthome\",\"12345678\"\r\n"   //wifi名称及,密码
#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"183.230.40.39\",6002\r\n"   //onenet ip地址

下面是你在onenet创建时候的设备ID等

#define PROID		"451066"
#define AUTH_INFO	"1234"
#define DEVID		"757218324"

四、ONENET平台

ONENET创建设备

创建设备不细说,参考资料很多,大家自行搜索
需要注意:
1.不能选择物联网开发套件,而是选择多协议接入,这个代码是这样的
2.MQTT旧版新版都不影响,都能用
3.需要记住设备ID,产品ID和鉴权信息(鉴权信息随便设置)
4.联网方式是wifi,运营商是移动且没有操作系统

ONENET数据可视化创建

  1. 添加界面

由于新版本没有旧版操作方便,需要新建一个数据可视化界面,所以进入数据可视化界面后创建项目,随意拖一个仪表盘

在这个界面可以对仪表盘或者其他折线图进行样式、数据的更改。最重要的是需要获取到平台对应的数据,所以就需要添加对应的数据源,如上图所示。

  1. 添加数据源

需要注意的是:
1.数据源类行应为ONENET
2.名称可以随意写
3.产品ID,key,数据流以及设备都应该与之前创建的设备一一对应
如下图所示:

  1. 获取数据,显示在仪表盘上
    这里需要修改默认的代码,具体修改方式可以参考官方提供的文档:官方文档
    进入文档的可视化VIEW,选择你使用到的组件,根据提供的代码例程修改为自己的,例如修改仪表盘,如下图所示:

    这里的意思是,将平台所接收的所有温度数据获取到,判断数据长度,是否为最后一次数据,如果是就把最后一次数据赋值给仪表盘显示区域。数据可视化官方文档界面如下:

    至此,把所有的页面以及私有过滤器修改完毕后得到如图样式:

    在这个界面需要配置数据流,设备,以及数值的设置,这样一来,便可以获取到单片机上传的数据。下发指令与之类似,唯一的区别是,需要在界面配置下发的指令,比如{led:0}或者{led:1},在单片机这边需要判断接收的数据是否正常以及是否为所需要的数据,如果是需要的数据就做出相应的动作即可。

总结

首先感谢大家看到这里,简单总结一下
详细视频链接请参考:智能家居
注意:上述操作只是很简单的对接ONENET云平台中的操作,如果有误请各位朋友及时提出。大家可以在此基础上增加想要的功能,比如语音识别,语音播报之类的。现在某宝上有很多语音识别模块,虽然质量不是特别好,但是运用在这个小设计上是足够的,商家提供了丰富的接口协议,能够快速进行二次开发(能够操作语音模块)。
其次,将代码开源,有需要的朋友自行下载,实际操作一下才能体验到其中的乐趣:

链接:https://download.csdn.net/download/qq_42722796/87581806?spm=1001.2014.3001.5503

当然,在自己调试过程中遇到任何问题,欢迎大家和我沟通,我的联系方式:zaneAdmin

这次课设的作品,总体来说做的完成度一般,没有特别深入,做到了基本的控制、数据显示、物联网,整体实现了一个简单的家居系统,系统可能还有许多BUG没有解决,大家参考的时候酌情参考。当然这个项目后续可以拓展的点很多

1.增加OpenMv模块来实现人脸检测,这部分做到门锁中
2.增加语音识别模块来提供语音控制
3.增加外红遥控模块来控制空调、或者其他红外设备
4.增加火焰传感器来检测火情
5.UI界面可以进行二次美化

最后,写这个是为了记录一下做这个设计以来的想法,感谢大家阅览。

有关STM32智能家居,ONENET获取数据及下发指令,代码已开源!!!的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  7. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐