温湿度阈值联网控制

温湿度阈值联网控制

引言

目的:

我们不管使用哪种协议, 哪种解决方案, 我们就目前的情况来看, 我们刚开始是使用 手动修改temp_th和 humi_th的方式, 来实现温湿度阈值的控制.但是对于投入到实际使用的话, 我们还需要使用更方便的联网控制, 所以我们首先利用Onenet的解决方案.

讲解方法:

我们其实构建也是按照就班, 能构建出来一个工程, 但是构建完后, 有些代码就是固定的, 所以, 我们只需要知道,再次新建一个工程后, 我们修改哪里, 大致流程是哪些, 我们能够在原有的基础上, 复制黏贴即可.

详细构建:

详细的联网构建步骤(这里是跳转详细的从零构建,我们这里是在原有基础上改):

https://blog.csdn.net/qq_57484399/article/details/140651413

源码下载:

构建完成的最小温湿度阈值工程:

https://ww0.lanzoul.com/ixRys26qkmhe

基础上构建工程

(1)我们在原有联网工程上, 构建Onenet联网工程, 首先下载 构建好的基本例程, 解压

https://ww0.lanzoul.com/imskP25ct2de

image-20240806154845902

(2)在这个目录下, 拿到这个构建好的最小联网例程

image-20240806154955357

(3)双击这个,打开工程,

image-20240806155135046

wifi和Onenet配置

(4)联网使用的是 ESP8266-01S , 对应的 RX 连 PA2, TX连 PA3 , 对应的gnd连gnd, 3.3v连gnd。

(5)我们现在只讨论联网修改温湿度阈值, 并上传服务器, 还有服务器下发阈值信息, 单片机本地修改阈值.

(6) 大概流程就是, 初始化ESP8266-01s, 配置wifi热点 ,然后链接Onenet服务器, 上传温湿度和温湿度阈值.

image-20240806155937602

下发信息的大概流程就是, 服务器下发阈值, 单片机检测到后, 使用cjson拆包, 然后得到服务器下发的阈值.

image-20240806155957008

创建产品

(7) 还是那句话, 我们只谈如何复制黏贴, 如何在最小例程上, 进行可行性使用.

(8)我们要把变量上传, 就首先需要在Onenet服务器上创建产品

跳转:

配置链接:https://blog.csdn.net/qq_57484399/article/details/140962964

修改工程,快速配置

(9)我们单片机配置wifi, 就要把变量去对标 服务器的功能标识符

<1>先编译一下最小联网示例, 方便跳转

image-20240806182658587

<2> 然后我们先调整一下, 服务器的 key值, 方便和服务器对接

点击左侧的onenet.c

image-20240806182751658

<3>分别进行对标

image-20240806182932990

把这个标识符, 赋值给下图所示位置

image-20240806182853631

<4> 这样服务器的key就配置好了, 我们是通过wifi链接的,wifi密码在esp8266.c里面

image-20240806183231477

(10)我们现在和服务器对接已经完成了, 下面直接去配置Onenet的标识符变量: 在main函数里的while, OneNet_SenData();这个就是发送函数, 我们按下f12, 跳转

image-20240806183416277

(11)往下翻, 接着f12

image-20240806183600203

(12)就看到了,这里标识符, 我们接着对应修改, 注意事项

<1>引入上传变量

image-20240511150947170

<2>严格按照下面格式进行填写:

image-20240511151358103

<3>强调: 最后一项,后面没逗号, 之前都有逗号

image-20240511151503105

<4>我们可以复制三行代码, 然后改动

	memset(text, 0, sizeof(text));
	sprintf(text, "\"temp_th\":{\"value\":%d},", temp_th);
	strcat(buf, text);

<5>注意这里, 我们这里要看注意事项, 这里是有逗号的, 所以我们不能放在最后一项, 我们修改对应的标识符就行了

下面是我们修改好的

	memset(text, 0, sizeof(text));
	sprintf(text, "\"temp_th\":{\"value\":%d},", temp_th);
	strcat(buf, text);

	memset(text, 0, sizeof(text));
	sprintf(text, "\"humi_th\":{\"value\":%d}", humi_th);
	strcat(buf, text);

image-20240806185952187

<6>注意, 因为这个是onenet.c文件,所以我们要引入全局变量

extern int temp_th;
extern int humi_th;

此函数代码摘录:

extern int temp_th;
extern int humi_th;
unsigned char OneNet_FillBuf(char *buf)
{
	
	char text[48];
	
	memset(text, 0, sizeof(text));
	
	strcpy(buf, "{\"id\":\"123\",\"params\":{");
	
	memset(text, 0, sizeof(text));
	sprintf(text, "\"temp_th\":{\"value\":%d},", temp_th);
	strcat(buf, text);

	memset(text, 0, sizeof(text));
	sprintf(text, "\"humi_th\":{\"value\":%d}", humi_th);
	strcat(buf, text);

	strcat(buf, "}}");
	
	return strlen(buf);

}

<7> 那我们上传温湿度阈值的操作就完成了

(13)下面我们操作下发改变阈值, 跟我走

① 先编译运行一下工程, 方便我们跳转

image-20240806190402050

② 然后我们跳转

image-20240806190432633

③ 这里就是cjson处理函数, 我们接受到服务器发来的数据,我们通过拆包, 就可以获得具体数值, 然后我们赋值给我们本地变量就可以了.

<1>下面是固定化套路, 复制黏贴即可, 找到规律,实现功能.

定义拆包的变量, 一个是temp_h, 一个是 humi_th

	//这里定义 cjson格式的变量名,例如 *led_jason
	cJSON *temp_th_jason, *humi_th_jason;

image-20240806190723278

<2> 拆包, 通过标识符, 锁定数值

image-20240806190910308

<3>判断拆包是否为空 , 然后赋值本地变量

image-20240806191016554

				if(temp_th_jason != NULL)
				{
					temp_th = temp_th_jason->valueint;
				}
				if(humi_th_jason != NULL)
				{
					humi_th = humi_th_jason->valueint;
				}

修改完成的函数摘录:

//==========================================================
//	函数名称:	OneNet_RevPro
//
//	函数功能:	平台返回数据检测
//
//	入口参数:	dataPtr:平台返回的数据
//
//	返回参数:	无
//
//	说明:		
//==========================================================

void OneNet_RevPro(unsigned char *cmd)
{
	char *req_payload = NULL;
	char *cmdid_topic = NULL;
	
	unsigned short topic_len = 0;
	unsigned short req_len = 0;
	
	unsigned char qos = 0;
	static unsigned short pkt_id = 0;

	unsigned char type = 0;
	short result = 0;
	//原始数据 -> cjson数据
	cJSON *raw_jason;
	// cjson中摘出标识符变量
	cJSON *params_jason;
	//这里定义 cjson格式的变量名,例如 *led_jason
	cJSON *temp_th_jason, *humi_th_jason;
	type = MQTT_UnPacketRecv(cmd);
	//UsartPrintf(USART_DEBUG, "688\r\n");
	switch(type)
	{
		case MQTT_PKT_PUBLISH:																//接收的Publish消息
//			UsartPrintf(USART_DEBUG, "689\r\n");
			result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
			
			if(result == 0)
			{
				UsartPrintf(USART_DEBUG, "topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",
																	cmdid_topic, topic_len, req_payload, req_len);
				
				//将原始字符串信息,转化成cjson格式
				raw_jason = cJSON_Parse(req_payload);//解析原始字符串数据到raw_jason
				//从raw_jason中提取params字符段到params_jason
				params_jason = cJSON_GetObjectItem(raw_jason,"params");
				//然后再从params_jason中提取要操作的器件,

				temp_th_jason = cJSON_GetObjectItem(params_jason,"temp_th");
				
				humi_jason = cJSON_GetObjectItem(params_jason,"humi_th");
				
				//判断对应cjson 标识符变量 是否为空, 不空,则代表有对应的下发信息

				if(temp_th_jason != NULL)
				{
					temp_th = temp_th_jason->valueint;
				}
				if(humi_th_jason != NULL)
				{
					humi_th = humi_th_jason->valueint;
				}
				cJSON_Delete(raw_jason);
			}
			
		case MQTT_PKT_PUBACK:														//发送Publish消息,平台回复的Ack
//			UsartPrintf(USART_DEBUG, "111\r\n");
			if(MQTT_UnPacketPublishAck(cmd) == 0)
//				UsartPrintf(USART_DEBUG, "Tips:	MQTT Publish Send OK\r\n");
		break;
		case MQTT_PKT_SUBACK:																//发送Subscribe消息的Ack
//			UsartPrintf(USART_DEBUG, "222\r\n");
			if(MQTT_UnPacketSubscribe(cmd) == 0)
				UsartPrintf(USART_DEBUG, "Tips:	MQTT Subscribe OK\r\n");
			else
				UsartPrintf(USART_DEBUG, "Tips:	MQTT Subscribe Err\r\n");
		break;
		default:
//			UsartPrintf(USART_DEBUG, "333\r\n");
			result = -1;
		break;
	}
	ESP8266_Clear();									//清空缓存
	if(result == -1)
		return;
	if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
	{
		MQTT_FreeBuffer(cmdid_topic);
		MQTT_FreeBuffer(req_payload);
	}
}

至此, 我们上传下发阈值信息的工程就完成了, 我们把温湿度阈值设置成全局变量, 然后我们通过调用此文件, 就可以访问全局变量, 然后修改了。

我们其余工程, 全在此工程上构建, 即可。对于详细的工程构建完成, 把之前的最小例程加上, 然后调试就可以了, 后面专一出一讲,讲解如何快速 移植联网工程和测试。

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值