基于Stm32和Esp8266的阿里云物联网设计(智能药箱)

基于Stm32和Esp8266的阿里云物联网设计(智能药箱)

本系统以STM32为核心,利用温湿度传感器,光敏传感器,语音模块,物联网时钟,Wi-Fi模块Esp8266共同实现完成的。



前言

提示:这里可以添加本文要记录的大概内容:

本系统以STM32为核心,利用温湿度传感器,光敏传感器,语音模块,物联网时钟,Wi-Fi模块Esp8266共同实现完成的。

在这里插入图片描述
在这里插入图片描述


一、硬件模块

  1. stm32f103c8t6单片机
    在这里插入图片描述
  2. esp8266模块
    在这里插入图片描述
  3. DHT11
    在这里插入图片描述
  4. 光敏传感器
    在这里插入图片描述
  5. ASR-PRO语音模块
    在这里插入图片描述
  6. 0.96OLED
    在这里插入图片描述
  7. st-link,ch340串口模块、线材、面包板灯等

二、接线

1. esp8266接线

esp8266模块-----------------------------stm32模块
GND引脚---------------------------------GND引脚
3V3引脚-----------------------------------3V3引脚
Rx引脚--------------------------------------A9引脚(Tx)
Tx引脚-------------------------------------A10引脚(Rx)

2. DHT11接线

DHT11模块-----------------------------stm32模块
GND引脚---------------------------------GND引脚
VCC引脚-----------------------------------3V3引脚
DATA引脚----------------------------------B15引脚

3. 光敏传感器接线

DHT11模块-----------------------------stm32模块
GND引脚---------------------------------GND引脚
VCC引脚-----------------------------------3V3引脚
DO引脚-------------------------------------A0引脚

4. 语音模块接线

AS-PRO模块-----------------------------stm32模块
GND引脚---------------------------------GND引脚
VCC引脚-----------------------------------5V引脚
A1引脚-------------------------------------A2引脚
A2引脚-------------------------------------A3引脚

外设接线
喇叭正负对应SPK+和SPK-
麦克风正负对应MIC+和MIC-

烧录接线
AS-PRO模块----------------------------CH340模块
GND引脚---------------------------------GND引脚
VCC引脚-----------------------------------5V引脚
PB5引脚------------------------------------Rx引脚
PB6引脚------------------------------------Tx引脚

具体参考链接:天问ASRPRO资料汇总

5. OLED屏幕接线

OLED模块-----------------------------stm32模块
GND引脚---------------------------------GND引脚
VCC引脚----------------------------------3V3引脚
SCL引脚------------------------------------8引脚
SDA引脚------------------------------------9引脚

三、ESP8266固件烧录

参考教程链接: 开源 单片机通过ESP8266连接阿里云(1)固件烧录

1. 下载固件

固件链接: MQTT透传AT固件(固件号:1471)
在这里插入图片描述

2. 下载烧录软件

烧录软件链接: 烧录WiFi固件工具:ESP_DOWNLOAD_TOOL
在这里插入图片描述

3. 固件烧录

在这里插入图片描述

4. 固件测试

通过串口调试助手在波特率为115200, 发送如下指令

#设置模式
AT+CWMODE=1
#复位
AT+RST
# 连接WIFI 第一项为自己的WIFI名字 第二项为WIFI密码
AT+CWJAP="WIFI","12345678"
# 查看现在的时间
AT+CIPSNTPTIME?
AT+CIPSNTPCFG=1,8,"ntp.aliyun.com"

均能正常返回OK则说明固件烧录成功
在这里插入图片描述

四、串口调试助手调试ESP8266

1. 查看连接设备的MQTT参数

在这里插入图片描述

2. 发送MQTT用户信息

# 格式: AT+MQTTUSERCFG=0,1,"NULL","username","passwd",0,0,""
AT+MQTTUSERCFG=0,1,"NULL","ESP-xxxxxxxx","723xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",0,0,""

3. 发送MQTT ID信息

# 格式: AT+MQTTCLIENTID=0,"产品名.设备名|securemode=x\,signmethod=xxxxxxxx\,timestamp=xxxxxxxxxx|"
# 注意需要在对应位置的逗号","前面添加一个反斜杠"\"
AT+MQTTCLIENTID=0,"k0xxxxxx.ESP-01S|securemode=x\,signmethod=xxxxxx\,timestamp=xxxxxxxxxx|"

4. 发送MQTT URL信息

# 格式: AT+MQTTCONN=0,"mqttHostUrl",port,1
AT+MQTTCONN=0,"iot-xxxxxxxxxx.mqtt.iothub.aliyuncs.com",1883,1

均返回OK, 说明已经连接上阿里云, 在平台也可以看到设备上线

5. 发送数据到云端

Topic查看
在这里插入图片描述

# 格式 AT+MQTTPUB=0,"/sys/产品名/设备名/thing/event/property/post","{\"params\":{\"数据标签\":数据}}",1,0
AT+MQTTPUB=0,"/sys/k0txxxxxxx/ESP-01S/thing/event/property/post","{
   \"params\":{
   \"temperature\":25.0}}",1,0

四、stm32串口调试ESP8266

1. MQTT 参数

#define clientId "k0xxxxx.ESP-01S|securemode=x\\,signmethod=xxxxxxx\\,timestamp=xxxxxxxxxx|"
#define username "ESP-01S&k0xxxxxxxxxxxxxxx"
#define passwd "72xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define mqttHostUrl "iot-xxxxxxxxxxxxx.mqtt.iothub.aliyuncs.com"
#define port "1883"
#define post "/sys/k0xxxx/ESP-01S/thing/event/property/post"

#define WIFI_Name "WIFI"                   
#define WIFI_Pass "12345678"

2. MQTT 连接

注意相比于上面串口调试助手发送,在引号内(即字符串内)嵌套的 引号以及反斜杠 均需加转义字符即"表示"和\表示\

void ESP8266_Init(void)
{
   
	// 定义一个足够大的字符数组来存储合并后的字符串     
	char command[140];  
	memset(command, 0, sizeof(command));    //清空command数组

	//发送WIFI模式信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "WIFI_MODE");
	sprintf(command, "AT+CWMODE=1\r\n");
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK1", "OR1");

	//发送WIFI连接信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "WIFI_CONN");           
	sprintf(command, "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_Name, WIFI_Pass); 
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK2", "OR2");

	//发送MQTT连接用户信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "MQTT_USER");  
	sprintf(command, "AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\"\,\"%s\"\,0,0,\"\"\r\n",username,passwd);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK3", "OR3");
	
	//发送MQTT连接ID信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "MQTT_ID"); 
	sprintf(command, "AT+MQTTCLIENTID=0,\"%s\"\r\n",clientId);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK4", "OR4");

	//发送MQTT连接URL信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "MQTT_URL");
	sprintf(command, "AT+MQTTCONN=0,\"%s\",%s,1\r\n",mqttHostUrl,port);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK5", "OR5");

	//获取连接的时间服务器
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "TIME_CONN");
	sprintf(command, "AT+CIPSNTPCFG=1,8,\"ntp.aliyun.com\"\r\n");
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK6", "OR6");

	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "TIME_GET");
	Delay_s(1);

}

3. MQTT 发送

void ESP8266_Send(char *property1, float Data1, char *property2, u8 Data2, char *property3, u8 Data3, char *property4, u8 Data4, char *property5, u8 Data5, char *property6, u8 Data6)
{
   	
	// 定义一个足够大的字符数组来存储合并后的字符串
	char command[260];
	memset(command, 0, sizeof(command)); 
	// 定义消息发送格式
	//sprintf(command, "AT+MQTTPUB=0,\"%s\",\"{\\\"params\\\":{\\\"%s\\\":%d.%d}}\",1,0\r\n", post, property, Data_int, Data_decimal);  //第四个参数设置为0表示不要响应
	sprintf(command, "AT+MQTTPUB=0,\"%s\",\"{\\\"params\\\":{\\\"%s\\\":%.1f\\, \\\"%s\\\":%d\\, \\\"%s\\\":%d\\, \\\"%s\\\":%d\\, \\\"%s\\\":%d\\, \\\"%s\\\":%d\\}}\",0,0\r\n", post, property1, Data1, property2, Data2, property3, Data3, property4, Data4, property5, Data5, property6, Data6);  //第四个参数设置为0表示不要响应
	// 发送消息
	Serial_SendString(command);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	// 释放内存空间
    free(command);

	// 在OLED上显示OK_S
	// OLED_ShowString(1,8,"OK_S");
}

4. MQTT 接收

u8 ESP8266_Received(u8 *hour_set, u8 *minute_set, u8 *temp_set, u8 *humi_set, u8 *hour_set2, u8 *minute_set2)
// void ESP8266_Received(u8 *hour_set, u8 *minute_set, u8 *second_set)
{
   

	char String[250];
	memset(String, 0, sizeof(String));    //清空String数组
	Serial_ReceiveString(String);
	// Serial2_SendString(String);             //发送串口2给电脑看指令情况
	//解析出属性名对应的值  例如解析出LEDSwitch的值 {"LEDSwitch":0},
	//查找PRO在String中的位置 例如查找字符串 "LEDSwitch" 在String中的位置, 返回指向第一次出现的位置的指针 即字符串第一个字符引号的位置
	char *params_start = strstr(String, "\"params\":{");

    if (params_start != NULL) {
   

		char *hour_start = strstr(params_start, "\"hour_set\":");
        if (hour_start != NULL) {
   
            int hour;
            sscanf(hour_start, "\"hour_set\":%d", &hour);
			*hour_set = hour;
        }

        char *minute_start = strstr(params_start, "\"minute_set\":");
        if (minute_start != NULL) {
   
            int minute;
            sscanf(minute_start, "\"minute_set\":%d", &minute);
			*minute_set = minute;
        }

		char *temp_set_start = strstr(params_start, "\"temp_set\":");
        if (temp_set_start != NULL) {
   
            int temp;
            sscanf(temp_set_start, "\"temp_set\":%d", &temp);
			*temp_set = temp;
        }

		char *humi_set_start = strstr(params_start, "\"humi_set\":");
        if (humi_set_start != NULL) {
   
            int humi;
            sscanf(humi_set_start, "\"humi_set\":%d", &humi);
			*humi_set = humi;
        }

		char *hour_start2 = strstr(params_start, "\"hour_set2\":");
        if (hour_start2 != NULL) {
   
            int hour2;
            sscanf(hour_start2, "\"hour_set2\":%d", &hour2);
			*hour_set2 = hour2;
        }

        char *minute_start2 = strstr(params_start, "\"minute_set2\":");
        if (minute_start2 != NULL) {
   
            int minute2;
            sscanf(minute_start2, "\"minute_set2\":%d", &minute2);
			*minute_set2 = minute2;
        }

		return 1;
    }
	return 0;
}

5. 完整源码

  1. Esp8266.h
#ifndef __ESP8266_H
#define __ESP8266_H

/*MQTT 连接参数*/
#define clientId "k0xxxxx.ESP-01S|securemode=x\\,signmethod=xxxxxxx\\,timestamp=xxxxxxxxxx|"
#define username "ESP-01S&k0xxxxxxxxxxxxxxx"
#define passwd "72xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#define mqttHostUrl "iot-xxxxxxxxxxxxx.mqtt.iothub.aliyuncs.com"
#define port "1883"
#define post "/sys/k0xxxx/ESP-01S/thing/event/property/post"

#define WIFI_Name "WIFI"                   
#define WIFI_Pass "12345678"


void ESP8266_Init_Send(char *command, char *OK, char *OR);                         //初始化发送函数
void ESP8266_Init(void);                                                           //初始化函数

void ESP8266_Time_Get(u8 *hour, u8 *minute, u8 *second);                           //获取时间函数

u8 Serial_ReceiveString_Flag(void);                                                //串口接收标志位

// void ESP8266_Send(char *property1, float Data1, char *property2, float Data2, char *property3, u8 Data3, char *property4, u8 Data4, char *property5, u8 Data5, char *property6, u8 Data6, char *property7, u8 Data7, char *property8, u8 Data8);     //发送函数

void ESP8266_Send(char *property1, float Data1, char *property2, u8 Data2, char *property3, u8 Data3, char *property4, u8 Data4, char *property5, u8 Data5, char *property6, u8 Data6);

u8 ESP8266_Received(u8 *hour_set, u8 *minute_set, u8 *temp_set, u8 *humi_set, u8 *hour_set2, u8 *minute_set2);                        //接收函数

// void ESP8266_Received(u8 *hour_set, u8 *minute_set, u8 *second_set);  
#endif

  1. Esp8266.c
#include "stm32f10x.h"                  // Device header
#include "Serial.h"
#include "Esp8266.h"
#include "Delay.h"
#include "OLED.h"
#include <string.h>




/*************************
 * 函数名称:ESP8266_Init
 * 函数功能:初始化ESP8266
 * 输入参数:无
 * 输出参数:无
 * 调用示例:ESP8266_Init();
 **************************/
void ESP8266_Init(void)
{
   
	// 定义一个足够大的字符数组来存储合并后的字符串     
	char command[140];  
	memset(command, 0, sizeof(command));    //清空command数组

	//发送WIFI模式信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "WIFI_MODE");
	sprintf(command, "AT+CWMODE=1\r\n");
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK1", "OR1");

	//发送WIFI连接信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "WIFI_CONN");           
	sprintf(command, "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_Name, WIFI_Pass); 
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK2", "OR2");

	//发送MQTT连接用户信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "MQTT_USER");  
	sprintf(command, "AT+MQTTUSERCFG=0,1,\"NULL\",\"%s\"\,\"%s\"\,0,0,\"\"\r\n",username,passwd);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK3", "OR3");
	
	//发送MQTT连接ID信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "MQTT_ID"); 
	sprintf(command, "AT+MQTTCLIENTID=0,\"%s\"\r\n",clientId);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK4", "OR4");

	//发送MQTT连接URL信息
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "MQTT_URL");
	sprintf(command, "AT+MQTTCONN=0,\"%s\",%s,1\r\n",mqttHostUrl,port);
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK5", "OR5");

	//获取连接的时间服务器
	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "TIME_CONN");
	sprintf(command, "AT+CIPSNTPCFG=1,8,\"ntp.aliyun.com\"\r\n");
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	ESP8266_Init_Send(command, "OK6", "OR6");

	OLED_ShowString(3,1, "                 ");
	OLED_ShowString(3,1, "TIME_GET");
	Delay_s(1);

}


/*************************
 * 函数名称:ESP8266_Time_Get
 * 函数功能:ESP8266的获取网络时间
 * 输入参数:u8 *hour, u8 *minute, u8 *second  时分秒
 * 输出参数:无
 * 调用示例:ESP8266_Time_Get(&hour, &minute, &second);
 **************************/

void ESP8266_Time_Get(u8 *hour, u8 *minute, u8 *second)
{
   
	//定义一个足够大的字符数组来存储合并后的字符串
	char command[140];
	memset(command, 0, sizeof(command));    //清空command数组
	//获取时间
	sprintf(command, "AT+CIPSNTPTIME?\r\n");
	Serial_SendString(command);             //发送串口1发给ESP8266
	// Serial2_SendString(command);             //发送串口2给电脑看指令情况
	//解析返回的时间
	//定义一个足够大的字符数组来存储接收到的字符串
	char String[170];
	memset(String, 0, sizeof(String))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值