stm32+SIM7000C+dht11,把采集到的数据实时上传到阿里云平台,具体实现过程与代码
时间: 2024-03-07 12:49:53 浏览: 144
这是一个比较复杂的项目,需要涉及到硬件、网络、云平台等多个方面。以下是一个简单的实现过程和示例代码供参考:
1. 硬件连接:将STM32、SIM7000C、DHT11连接起来。STM32通过串口与SIM7000C进行通信,从而实现上传数据。DHT11通过GPIO口与STM32连接,用于采集温湿度数据。
2. 编写STM32程序:使用Keil等IDE编写STM32的程序,包括串口通信、DHT11数据采集、SIM7000C网络通信等部分。示例代码如下:
```c
#include "stm32f10x.h"
#include "dht11.h"
#include "sim7000c.h"
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
uint8_t ch=USART_ReceiveData(USART1);
USART_SendData(USART1,ch);
SIM7000C_Receive(ch);
}
}
int main(void)
{
USART1_Init();
DHT11_Init();
SIM7000C_Init();
while(1)
{
float temp,humi;
DHT11_Read_Data(&temp,&humi);
SIM7000C_Send_Data(temp,humi);
delay_ms(5000);
}
}
```
3. 编写SIM7000C程序:使用AT指令控制SIM7000C,实现与阿里云平台的通信。示例代码如下:
```c
#include "sim7000c.h"
#define APN "CMNET"
static uint8_t buf[512];
void SIM7000C_Receive(uint8_t ch)
{
//接收处理
}
void SIM7000C_Send_AT(void)
{
SIM7000C_Send_Cmd("AT\r\n");
}
void SIM7000C_Send_CGATT(void)
{
SIM7000C_Send_Cmd("AT+CGATT?\r\n");
}
void SIM7000C_Send_CGDCONT(void)
{
sprintf((char *)buf,"AT+CGDCONT=1,\"IP\",\"%s\"\r\n",APN);
SIM7000C_Send_Cmd((char *)buf);
}
void SIM7000C_Send_CSTT(void)
{
sprintf((char *)buf,"AT+CSTT=\"%s\"\r\n",APN);
SIM7000C_Send_Cmd((char *)buf);
}
void SIM7000C_Send_CIICR(void)
{
SIM7000C_Send_Cmd("AT+CIICR\r\n");
}
void SIM7000C_Send_CIFSR(void)
{
SIM7000C_Send_Cmd("AT+CIFSR\r\n");
}
void SIM7000C_Send_CIPSTART(void)
{
SIM7000C_Send_Cmd("AT+CIPSTART=\"TCP\",\"iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883\r\n");
}
void SIM7000C_Send_CIPSEND(int len)
{
sprintf((char *)buf,"AT+CIPSEND=%d\r\n",len);
SIM7000C_Send_Cmd((char *)buf);
}
void SIM7000C_Send_Data(float temp,float humi)
{
//连接网络
SIM7000C_Send_CGATT();
delay_ms(1000);
SIM7000C_Send_CGDCONT();
delay_ms(1000);
SIM7000C_Send_CSTT();
delay_ms(1000);
SIM7000C_Send_CIICR();
delay_ms(1000);
SIM7000C_Send_CIFSR();
delay_ms(1000);
//连接服务器
SIM7000C_Send_CIPSTART();
delay_ms(1000);
//发送数据
int len=sprintf((char *)buf,"{\"temp\":%.1f,\"humi\":%.1f}\r\n",temp,humi);
SIM7000C_Send_CIPSEND(len);
delay_ms(1000);
SIM7000C_Send_Cmd((char *)buf);
delay_ms(1000);
//关闭连接
SIM7000C_Send_Cmd("AT+CIPCLOSE\r\n");
}
void SIM7000C_Send_Cmd(char *cmd)
{
USART_SendString(USART1,cmd);
}
```
4. 配置阿里云平台:在阿里云平台上创建设备、产品、Topic等,获取Access Key、Secret Key等信息。
5. 编写云函数:使用阿里云函数计算服务,编写云函数,用于接收SIM7000C上传的数据,并将数据保存到阿里云数据库中。示例代码如下:
```python
import json
import time
import pymysql
db = pymysql.connect(
host='xxxxx',
user='xxxxx',
password='xxxxx',
port=3306,
database='xxxxx'
)
def handler(event, context):
data = json.loads(event['payload'])
temp = data['temp']
humi = data['humi']
ts = int(time.time())
cursor = db.cursor()
sql = "INSERT INTO `tb_data` (`temp`, `humi`, `ts`) VALUES (%s, %s, %s)"
cursor.execute(sql, (temp, humi, ts))
db.commit()
return {
"message": "success"
}
```
以上是一个简单的实现过程和示例代码,具体实现过程可能会因为硬件、网络等方面的不同而有所差异。
阅读全文