基于STM32通过广和通通讯模组L610实时监测温度上报到腾讯云
时间: 2023-06-18 17:03:11 浏览: 129
实现这个功能,主要分为以下几个步骤:
1. 硬件准备
首先需要准备好STM32开发板和广和通通讯模组L610,并将它们连接起来。同时,还需要接入一个温度传感器来获取温度数据。
2. 编写STM32程序
使用STM32的开发工具,编写程序实现从温度传感器读取数据并通过L610模组发送到腾讯云。这个过程需要涉及到串口通信、AT指令等相关知识。
3. 创建腾讯云账号
在腾讯云官网上创建一个账号,并创建一个IoT Hub实例。
4. 配置设备接入
在IoT Hub实例中,配置设备接入,并生成设备证书和密钥。将这些信息保存到STM32程序中,以便在连接到腾讯云时使用。
5. 实现数据上传
使用MQTT协议,将从温度传感器读取到的数据上传到腾讯云。在腾讯云控制台中,可以查看设备上传的数据,并进行后续的处理和分析。
以上就是基于STM32通过广和通通讯模组L610实时监测温度上报到腾讯云的大致流程。具体实现过程中,还需要考虑一些细节问题,比如数据格式、通信协议等。
相关问题
基于STM32通过广和通通讯模组L610实时监测温度上报到腾讯云代码
以下是基于STM32通过广和通通讯模组L610实时监测温度上报到腾讯云的代码示例:
```c
#include "main.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdbool.h"
#include "usart.h"
#include "gpio.h"
#include "cmsis_os.h"
#include "dht11.h"
#include "sim800c.h"
#define SENSOR_PIN GPIO_PIN_6
#define SENSOR_PORT GPIOC
DHT11_Data_TypeDef temp_data; // 存储温湿度传感器数据的结构体
bool is_sensor_ready = false; // 温湿度传感器是否已准备好标志位
void DHT11_Read_Data(void const * argument)
{
while (1)
{
if (DHT11_Read(&temp_data) == DHT11_OK)
{
is_sensor_ready = true;
}
osDelay(2000);
}
}
void SIM800C_Init(void)
{
SIM800C_PWR_On();
osDelay(5000);
SIM800C_Send_AT_Command("ATE0\r\n");
osDelay(200);
}
void SIM800C_Connect_To_Network(void)
{
SIM800C_Send_AT_Command("AT+CREG?\r\n");
osDelay(2000);
SIM800C_Send_AT_Command("AT+CGATT=1\r\n");
osDelay(5000);
}
void SIM800C_Connect_To_Internet(void)
{
SIM800C_Send_AT_Command("AT+CIPSHUT\r\n");
osDelay(2000);
SIM800C_Send_AT_Command("AT+CIPMUX=0\r\n");
osDelay(200);
SIM800C_Send_AT_Command("AT+CIPMODE=0\r\n");
osDelay(200);
SIM800C_Send_AT_Command("AT+CSTT=\"CMNET\"\r\n");
osDelay(2000);
SIM800C_Send_AT_Command("AT+CIICR\r\n");
osDelay(5000);
}
bool SIM800C_Connect_To_Server(void)
{
SIM800C_Send_AT_Command("AT+CIPSTART=\"TCP\",\"api.yeelink.net\",\"80\"\r\n");
osDelay(2000);
if (strstr(SIM800C_Response_Buffer, "CONNECT OK") != NULL)
{
return true;
}
else
{
return false;
}
}
void SIM800C_Disconnect_From_Server(void)
{
SIM800C_Send_AT_Command("AT+CIPCLOSE\r\n");
osDelay(2000);
}
bool SIM800C_Send_HTTP_Request(char *url, char *api_key, char *data)
{
char http_request[256] = {0};
sprintf(http_request, "GET %s HTTP/1.1\r\nHost: api.yeelink.net\r\nU-ApiKey: %s\r\nContent-Length: %d\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n%s", url, api_key, strlen(data), data);
char http_request_length[16] = {0};
sprintf(http_request_length, "AT+CIPSEND=%d\r\n", strlen(http_request));
SIM800C_Send_AT_Command(http_request_length);
osDelay(200);
SIM800C_Send_AT_Command(http_request);
osDelay(2000);
if (strstr(SIM800C_Response_Buffer, "SEND OK") != NULL)
{
return true;
}
else
{
return false;
}
}
void Send_Temperature_Data_To_Yeelink(void const * argument)
{
while (1)
{
if (is_sensor_ready)
{
char temperature_data[64] = {0};
sprintf(temperature_data, "field1=%d.%d", temp_data.Temperature / 10, temp_data.Temperature % 10);
SIM800C_Connect_To_Server();
SIM800C_Send_HTTP_Request("/v1.0/device/12345/sensor/67890/datapoints", "abcdefg1234567", temperature_data);
SIM800C_Disconnect_From_Server();
is_sensor_ready = false;
}
osDelay(1000);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
osKernelInitialize();
SIM800C_Init();
DHT11_Init(SENSOR_PORT, SENSOR_PIN);
osThreadNew(DHT11_Read_Data, NULL, NULL);
SIM800C_Connect_To_Network();
SIM800C_Connect_To_Internet();
osThreadNew(Send_Temperature_Data_To_Yeelink, NULL, NULL);
osKernelStart();
while (1);
}
```
以上代码基于FreeRTOS操作系统,在CubeMX中生成的基本工程基础上进行开发。其中,DHT11_Read_Data函数通过DHT11_Read函数读取温湿度传感器数据,并将读到的数据存储在temp_data结构体中。Send_Temperature_Data_To_Yeelink函数将temp_data中的温度数据发送到腾讯云的Yeelink平台。SIM800C_Init初始化SIM800C模块,SIM800C_Connect_To_Network连接到网络,SIM800C_Connect_To_Internet连接到互联网,SIM800C_Connect_To_Server连接到腾讯云服务器,SIM800C_Send_HTTP_Request发送HTTP请求,SIM800C_Disconnect_From_Server断开与腾讯云服务器的连接。
基于STM32HAL库读取出的温度数据通过广和通通讯模组L610上传腾讯云的代码
以下是基于STM32HAL库读取出的温度数据通过广和通通讯模组L610上传腾讯云的代码示例:
```c
#include "stm32f1xx_hal.h"
#include "stdio.h"
#include "string.h"
#include "stdbool.h"
#define TEMPERATURE_READ_INTERVAL_MS 1000 // 读取温度的时间间隔
#define L610_UART_HANDLE huart1 // L610通讯模组串口句柄
#define L610_RESET_GPIO_PORT GPIOA // L610通讯模组复位引脚所在的GPIO端口
#define L610_RESET_GPIO_PIN GPIO_PIN_0 // L610通讯模组复位引脚所在的GPIO引脚
UART_HandleTypeDef L610_UART_HANDLE; // L610通讯模组串口句柄
// 重置L610通讯模组
void L610_Reset(void) {
HAL_GPIO_WritePin(L610_RESET_GPIO_PORT, L610_RESET_GPIO_PIN, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(L610_RESET_GPIO_PORT, L610_RESET_GPIO_PIN, GPIO_PIN_SET);
HAL_Delay(5000); // 等待L610通讯模组重启
}
// 发送AT指令并等待响应
bool L610_SendATCommandAndWaitForResponse(char* command, char* expectedResponse) {
char rxBuffer[128];
HAL_UART_Transmit(&L610_UART_HANDLE, (uint8_t*)command, strlen(command), 1000);
HAL_UART_Receive(&L610_UART_HANDLE, (uint8_t*)rxBuffer, strlen(expectedResponse), 5000);
if (strncmp(rxBuffer, expectedResponse, strlen(expectedResponse)) == 0) {
return true;
} else {
return false;
}
}
// 连接到腾讯云
bool ConnectToTencentCloud(char* iotProductId, char* iotDeviceName, char* iotDeviceSecret) {
char command[256];
char rxBuffer[128];
// 设置L610通讯模组工作模式为透传模式
if (!L610_SendATCommandAndWaitForResponse("AT+CIPMODE=1\r\n", "OK\r\n")) {
return false;
}
// 连接到腾讯云
sprintf(command, "AT+CIPSTART=\"TCP\",\"%s.%s.iotcloud.tencentdevices.com\",\"1883\"\r\n", iotProductId, iotDeviceName);
HAL_UART_Transmit(&L610_UART_HANDLE, (uint8_t*)command, strlen(command), 1000);
HAL_UART_Receive(&L610_UART_HANDLE, (uint8_t*)rxBuffer, strlen("CONNECTED\r\n"), 5000);
if (strncmp(rxBuffer, "CONNECTED\r\n", strlen("CONNECTED\r\n")) != 0) {
return false;
}
// 发送MQTT连接请求
uint8_t mqttConnectPacket[] = {0x10, 0x0E, 0x00, 0x04, 'M', 'Q', 'T', 'T', '4', 0x04, 0x01, 0xF4, 0x00, 0x06, 't', 'x', 'x', 'x', 'x', 'x', 0x01, 0x00};
mqttConnectPacket[22] = strlen(iotDeviceName);
memcpy(mqttConnectPacket + 23, iotDeviceName, strlen(iotDeviceName));
mqttConnectPacket[23 + strlen(iotDeviceName)] = 0x00;
mqttConnectPacket[24 + strlen(iotDeviceName)] = strlen(iotDeviceSecret);
memcpy(mqttConnectPacket + 25 + strlen(iotDeviceName), iotDeviceSecret, strlen(iotDeviceSecret));
HAL_UART_Transmit(&L610_UART_HANDLE, mqttConnectPacket, 25 + strlen(iotDeviceName) + strlen(iotDeviceSecret), 1000);
HAL_UART_Receive(&L610_UART_HANDLE, (uint8_t*)rxBuffer, 4, 5000);
if (rxBuffer[0] != 0x20 || rxBuffer[1] != 0x02 || rxBuffer[3] != 0x00) {
return false;
}
return true;
}
// 上传温度数据到腾讯云
bool UploadTemperatureToTencentCloud(float temperature) {
char command[256];
char rxBuffer[128];
// 发送MQTT消息
uint8_t mqttPublishPacketHeader[] = {0x30, 0x00, 0x00, 0x05, 0x74, 0x65, 0x6D, 0x70, 0x00};
uint8_t mqttPublishPacketPayload[10];
uint16_t mqttPublishPacketPayloadLength = sprintf((char*)mqttPublishPacketPayload, "%.2f", temperature);
mqttPublishPacketHeader[1] = 5 + mqttPublishPacketPayloadLength;
HAL_UART_Transmit(&L610_UART_HANDLE, mqttPublishPacketHeader, 9, 1000);
HAL_UART_Transmit(&L610_UART_HANDLE, mqttPublishPacketPayload, mqttPublishPacketPayloadLength, 1000);
HAL_UART_Receive(&L610_UART_HANDLE, (uint8_t*)rxBuffer, 4, 5000);
if (rxBuffer[0] != 0x40 || rxBuffer[1] != 0x02 || rxBuffer[3] != 0x00) {
return false;
}
return true;
}
int main(void) {
float temperature;
char iotProductId[] = "your_iot_product_id";
char iotDeviceName[] = "your_iot_device_name";
char iotDeviceSecret[] = "your_iot_device_secret";
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
// 配置L610通讯模组复位引脚
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = L610_RESET_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(L610_RESET_GPIO_PORT, &GPIO_InitStruct);
// 配置L610通讯模组串口
L610_UART_HANDLE.Instance = USART1;
L610_UART_HANDLE.Init.BaudRate = 115200;
L610_UART_HANDLE.Init.WordLength = UART_WORDLENGTH_8B;
L610_UART_HANDLE.Init.StopBits = UART_STOPBITS_1;
L610_UART_HANDLE.Init.Parity = UART_PARITY_NONE;
L610_UART_HANDLE.Init.Mode = UART_MODE_TX_RX;
L610_UART_HANDLE.Init.HwFlowCtl = UART_HWCONTROL_NONE;
L610_UART_HANDLE.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&L610_UART_HANDLE);
// 重置L610通讯模组
L610_Reset();
// 连接到腾讯云
if (!ConnectToTencentCloud(iotProductId, iotDeviceName, iotDeviceSecret)) {
return -1;
}
while (true) {
// 读取温度
temperature = ... // 从传感器或芯片中读取温度数据
// 上传温度到腾讯云
if (!UploadTemperatureToTencentCloud(temperature)) {
return -1;
}
HAL_Delay(TEMPERATURE_READ_INTERVAL_MS);
}
}
```
其中需要根据自己的情况修改代码中的宏定义和变量,如:
- `L610_UART_HANDLE`:L610通讯模组串口句柄,需要根据实际使用的串口进行修改。
- `L610_RESET_GPIO_PORT` 和 `L610_RESET_GPIO_PIN`:L610通讯模组复位引脚所在的GPIO端口和引脚,需要根据实际使用的GPIO进行修改。
- `iotProductId`、`iotDeviceName` 和 `iotDeviceSecret`:腾讯云IoT产品、设备名称和设备密钥,需要根据自己的腾讯云IoT配置进行修改。
- `temperature`:需要根据实际使用的传感器或芯片进行读取温度数据的代码编写。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![PDF](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)