一、环境介绍
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 #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]='