我是靠谱客的博主 纯真白羊,最近开发中收集的这篇文章主要介绍STM32+SIM800C采用MQTT协议登录OneNet上传温湿度、MQ2烟雾浓度、GPS数据一、环境介绍二、硬件与需求三、核心代码四、创建应用,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、环境介绍
MCU: STM32F103C8T6
GSM模块: SIM800C
开发软件: Keil5
MQTT协议采用OneNet的旧版协议,登录OneNet控制台创建应用时要选择旧版本。
如果想使用新版本的标准MQTT协议连接OnetNet请参考这里: https://blog.csdn.net/xiaolong1126626497/article/details/107385118
完整源代码下载: https://download.csdn.net/download/xiaolong1126626497/18245757
二、硬件与需求
一块STM32F103C8T6最小系统板。
一块OLED显示屏
一个DHT11温湿度传感器
一个MQ-2可燃气体传感器
一个SIM800C模块
软件要求
采集DHT11温度、湿度数据、采集MQ-2烟雾传感器数据实时在OLED显示屏上显示、当烟雾浓度超过阀值时,可以通过SIM800C向指定手机号码发送短信。
并需要使用SIM800C连接GPRS网络,将温度、湿度、烟雾浓度上传到OneNet服务器进行可视化显示。
三、核心代码
3.1 main.c
//
// 功能描述 : 智能环境检测系统
// 时间 : 20190605
// 版本 : v3.3
// 版权所有,盗版必究。
//Copyright(C) DS小龙哥 2016 - 2020
///
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include <stdio.h>
#include "dht11.h"
#include "oled.h"
#include "adc.h"
#include "timer.h"
#include "sim800c.h"
#include "gps.h"
/*
DTH11接线说明:
VCC---3.3V
GND---GND
DAT---PA5
MQ-2接线说明:
VCC---3.3V
GND---GND
AO----PB0
使用IIC接口的OLED显示屏接线说明:
GND---GND
VCC---3.3V
SDA---PB7
SCL---PB6
使用SPI接口的OLED显示屏接线说明:
GND---GND
VCC---3.3V
D0-----PB5
D1-----PB6
RES----PB7
DC-----PB8
CS-----PB9
SIM800C接线说明:
GND----GND
PA2----SIM800C_RXD
PA3----SIM800C_TXD
CH340模块接线说明:
GND----GND
RX-----PA9
GPS接线说明: (波特率需要根据GPS模块实际情况进行修改)
GND----GND
VCC---3.3V
PB11----GPS_TX
*/
u8 dht11_temp,dht11_humi;
u32 time_cnt=0;
u32 OneNet_Sendtime=0;
u8 data_select=0; //发送的数据选择
u8 DisplayState=0;
char DisplayDataBuffer[20];
u16 MQ_2; //存放ADC的数据
void DisplayPage1(void); //第一页
void DisplayPage2(void); //第二页
//烟雾超标提示
u8 sim800c_buff[]="MQ-2 smoke exceeded";
char tmp_buffer[100];
double Longitude=103.718463; //经度
double latitude=36.107013; //纬度
int main(void)
{
u8 state;
USART_X_Init(USART1,72,115200); //串口初始化
printf("串口初始化完成!rn");
OLED_Init(); //OLED显示屏初始化
ADC1_Init();
if(DHT11_Init())printf("DHT11检测错误!rn");
TIM2_Init(72,20000);//辅助串口3接收,超时时间为20ms
USART_X_Init(USART2,36,9600); //可能的波特率(测试): 57600 、9600、115200
USART_X_Init(USART3,36,9600);//接GPS模块
TIM3_Init(72,20000);//辅助串口3接收,超时时间为20ms
//显示初始化信息
OLED_Clear_GRAM();
OLED_DisplayString(0,0,16,"System Init..");
OLED_Refresh_GRAM(); //刷新显存
//延时等待
printf("延时等待rn");
DelayMs(1000);
DelayMs(1000);
DelayMs(1000);
DelayMs(1000);
printf("开始初始化SIM800C rn");
//初始化SIM800C
OLED_DisplayString(0,16,16,"SIM800C Init..");
OLED_Refresh_GRAM(); //刷新显存
while(1)
{
state=SIM800C_InitCheck();
if(state==0)break;
DelayMs(1000);
printf("SIM800C初始化状态:%drn",state);
}
//设置文本模式
OLED_DisplayString(0,32,16,"SIM800C Text Set...");
OLED_Refresh_GRAM(); //刷新显存
while(1)
{
state=SIM800C_SetNoteTextMode();
if(state==0)break;
DelayMs(1000);
printf("设置文本模式状态:%drn",state);
}
//同步网络时间
//SIM800C_NtpUpdate();
//初始化GPRS
SIM800C_GPRS_Init();
while(1)
{
delay_ms(1);
time_cnt++;
OneNet_Sendtime++;
//记录时间
if(time_cnt>=100)
{
time_cnt=0;
DisplayState=!DisplayState;
printf("切换页面!rn");
}
//向云端发送一次数据(每次选择发送一种数据)
if(OneNet_Sendtime>=500) //单位ms
{
OneNet_Sendtime=0;
switch(data_select)
{
case 0:OneNet_HTTP_DataUpdate("T",dht11_temp);
break;
case 1:OneNet_HTTP_DataUpdate("H",dht11_humi);
break;
case 2:OneNet_HTTP_DataUpdate("MQ2",MQ_2);
break;
case 3:OneNet_HTTP_GPS_DataUpdate("GPS",Longitude,latitude);
break;
}
data_select++;
if(data_select>3)data_select=0;
}
//采集DHT11温湿度与MQ-2的数据
DHT11_Read_Data(&dht11_temp,&dht11_humi);
MQ_2=ADC1_GetCHx(8);
//串口打印数据
// printf("温度:%drn",dht11_temp);
// printf("湿度:%drn",dht11_humi);
// printf("MQ-2:%drn",MQ_2);
//判断烟雾是否超标,设置阀值
if(MQ_2>=2000)
{
//发送短信
if(SIM800C_SendNote((u8*)"13800138000",sim800c_buff,strlen((char*)sim800c_buff))==0)
printf("短信发送成功rn");
else
printf("短信发送失败rn");
}
//采用时间间隔切换页面
if(DisplayState)
{
DisplayPage2();
}
else
{
DisplayPage1();
}
//实时接收WIFI收到的数据
if(USART2_RX_FLAG)
{
USART2_RX_BUFF[USART2_RX_CNT]='