物联网应用开发--传感器数据上传新大陆云平台(STM32+SHT20温湿度+ESP8266+TCP)

实现目标

1、掌握新大陆云平台传感器的创建

2、熟悉STM32 +HAL与ESP8266模块之间的通信

3、具体实现目标:(1)创建2个传感器:温度传感器,湿度传感器;(2)上传开发板上的SHT20温湿度传感器数据至云平台。


前言

1、 上期已实现云平台创建的执行器对开发板上的蜂鸣器和LED的控制,详细请参考教程:https://blog.csdn.net/luojuan198780/article/details/138860797

2、关于温湿度传感器SHT20 的知识请参考教程:https://blog.csdn.net/luojuan198780/article/details/139030385

一、项目创建

本次项目整体:创建5个执行器(已建)+温湿度传感器(待建)

1.1   温度传感器创建

说明:湿度传感器除了名称和温度传感器一样

1.2   温度传感器创建后整体效果

二、开发板连接图

开发板P7四个跳键帽接法如下图:

说明:单片机的USART1用于调试信息打印;USART2用于与ESP8266模块通信。

三、STM32CubeMX 配置

3.1 GPIO配置

BEEP:初始电平为低电平,推挽输出;LED1-LED4:初始电平为高电平,推挽输出。

3.2 串口USART1配置

USART1:异步模式,波特率115200,功能:用于打印调试信息

3.3 串口USART2配置

USART2: 异步模式,波特率115200,开启DMA,开启中断。功能:用于与ESP8266通信

3.4  IIC 配置

(1)开启I2C,其它默认

(2)打开中断(USART2 、I2C1)

四、程序设计

说明:整个工程的代码量大,下面只列出整个工程中温湿度传感器数据上传函数。

4.1在CloudReference.h  修改wifi名称、密码以及设备标志、SecretKey

4.2  stm32App.c 中数据上传部分新增温湿度数据上传

if(TimeCount >= 1000)//10S发送一次数据
{
	TimeCount=0;
	SHT20_GetValue();
	printf( "Temperature:%0.1fC,Humidity:%0.1f%%\r\n",sht20_info.tempreture,sht20_info.humidity);                   
	ESP8266_SendSensor(sht20_info.tempreture,sht20_info.humidity);									
	ClrAtRxBuf();
}

4.3  打开 WiFiToCloud.h 文件重新声明修改后函数

//int8_t ESP8266_SendSensor(uint8_t sensor, char *TimeStr);
int8_t ESP8266_SendSensor(float sensor1,float sensor2);

4.4 修改WiFiToCloud.c文件中函数

修改ESP8266_SendSensor 函数形参个数,修改上传数据格式。

同时上传温湿度数据,数据类型为浮点型,具体格式见下:

sprintf((char *)TxetBuf,"{\"t\":3,\"datatype\":1,\"datas\":{\"temp\":\"%.1f\",\"hum\":\"%.1f\"},\"msgid\":001}",sensor1,sensor2);

协议文档下载:http://www.nlecloud.com/doc/resources.shtml 

 //传感器数据上传函数

int8_t ESP8266_SendSensor(float sensor1,float sensor2)
{
	uint8_t TryGo = 0;
	int8_t error = 0;
	uint8_t TxetBuf[MAX_AT_TX_LEN];
	memset(TxetBuf,0x00,MAX_AT_TX_LEN);//清空缓存
	sprintf((char *)TxetBuf,"{\"t\":3,\"datatype\":1,\"datas\":{\"temp\":\"%.1f\",\"hum\":\"%.1f\"},\"msgid\":001}",sensor1,sensor2);
	//printf("%s\r\n",TxetBuf);
	if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
	{//发送失败
		error=-1;
	}
	else
	{//发送成功
		for(TryGo = 0; TryGo<50; TryGo++)//最多等待时间50*10=500ms
		{
			if(strstr((const char *)AT_RX_BUF, (const char *)"\"status\":0") == NULL)//检查响应状态是否为"上报成功"
			{
				error = -1;
			}
			else
			{
				error = 0;
				break;
			}
			HAL_Delay(10);
		}
	}
	return error;
}

五、实验效果

设备在线后,打开“实时数据”开关,可以看见传感器数据上传。

六、仿真实现


总结

工程代码:https://download.csdn.net/download/luojuan198780/89330194

### 新大陆物联网云平台与MQTT集成使用指南 #### 一、准备工作 为了能够顺利连接新大陆物联网云平台并实现MQTT通信,需先完成如下准备事项: - 注册账号并登录至新大陆物联网云平台网站。 - 创建产品和设备,在平台上获取必要的认证信息(如ProductKey, DeviceName 和DeviceSecret),这些数据用于建立安全可靠的网络链接[^1]。 #### 二、配置ESP8266 WiFi模块 对于基于ESP8266的WiFi模块来说,可以通过Arduino IDE来编写程序代码。安装好对应的库文件之后,就可以利用提供的API函数轻松设置Wi-Fi参数以及初始化客户端对象以便后续操作。 ```cpp #include <ESP8266WiFi.h> // 这里填写自己的WiFi SSID和密码 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(115200); // 尝试连接到无线网络 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to the Wi-Fi network"); } ``` #### 三、接入阿里云IoT平台并通过MQTT协议通讯 当成功建立了稳定的互联网连接后,则可进一步尝试通过MQTT协议向阿里云物联网平台发送消息或接收来自云端的数据推送。这通常涉及到创建一个MQTT客户端实例,并调用特定的方法来进行订阅主题、发布消息等动作。 ```cpp #include <PubSubClient.h> #define BROKER_URL "tcp://iot-as-mqtt.cn-shanghai.aliyuncs.com:1883" #define PRODUCT_KEY "YourProductKey" #define DEVICE_NAME "YourDeviceName" #define DEVICE_SECRET "YourDeviceSecret" char client_id[64]; char username[64]; char password[128]; WiFiClient espClient; PubSubClient client(BROKER_URL, 1883, callback, espClient); void init_mqtt(){ snprintf(client_id,sizeof(client_id),"%s&%s",PRODUCT_KEY,DEVICE_NAME); snprintf(username,sizeof(username),"%s&%s",PRODUCT_KEY,DEVICE_NAME); snprintf(password,sizeof(password),"clientId%sdeviceName%sproductKey%stimestamp%d", CLIENT_ID,DEVICE_NAME,PRODUCT_KEY,time(NULL)); if (!client.connected()) { if (client.connect(client_id,username,password)) { Serial.println("connected."); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void loop() { if(!client.connected()){ init_mqtt(); } client.loop(); static unsigned long lastMsg = 0; const unsigned long interval = 10 * 1000; if(millis()-lastMsg>interval){ lastMsg=millis(); String topic="/sys/"+String(PRODUCT_KEY)+"/"+String(DEVICE_NAME)+"/thing/event/property/post"; StaticJsonDocument<200> doc; JsonObject payload = doc.to<JsonObject>(); payload["method"]="thing.event.property.post"; JsonArray params=payload.createNestedArray("params"); params.add(random(0,255)); char jsonBuffer[256]; serializeJson(doc,jsonBuffer); client.publish(topic.c_str(),jsonBuffer); } } ``` 上述示例展示了如何构建一个简单的MQTT客户端应用程序,该应用会定期向指定的主题发布随机数值作为模拟传感器读数。实际项目中可根据具体需求调整相应的逻辑处理部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面包板扎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值