【STM32】基于物联网的远程温湿度监测系统 --- ESP8266 + 机智云

  • 一、ESP-8266 烧录固件
  • 二、机智云创建产品
  • 三、手机端安装机智云 APP
  • 四、编写 DHT11 驱动
  • 五、机智云工程代码移植
  • 六、采集数据的上发
  • 七、控制数据的下拉
  • 八、ESP-8266 配置入网
  • 九、测试


工程和 pcd 的链接放这里啦
链接:https://pan.baidu.com/s/1r3gKC3R_hFLWiIE3UTO_ow?pwd=fpuc
提取码:fpuc

一、ESP-8266 烧录固件

相关调试资料:ESP8266 AT 指令集

  • 机智云固件 GAgent 下载

地址链接

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据

  • 查看 ESP-01S 的规格书

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_stm32_02

  • 选择相应 Flash 大小的 bin 文件

选择 conbine(四合一的文件)

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_03

  • 使用 ESP 官方 Flash 下载工具

地址链接

注意: 下载时GPIO0要接地

按下图所示进行配置,配置完成后,点击START,稍等片刻即可。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_esp8266 温湿度数据采集数据库_04

至此,机智云固件已烧录完成。

当使用 USB-TTL 连接 ESP8266 后,可以发现 ESP8266 的蓝灯闪烁与之前相比更为频繁,且串口会一直打印以下数据。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_05


二、机智云创建产品


  • 在机智云官网注册账号

地址链接

  • 创建产品

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_06

下面的步骤可以参考:开发向导,这个很详细。

  • 添加数据点

产品开发的第一步是定义产品的功能,一个数据点可以定义为产品的某个功能,如开关等。

有关 DHT11 的相关参数信息可以参考:链接

温度:

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_07

湿度:

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_08

按键布尔值:

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_09

  • 生成 MCU 工程代码

选择相应的 MCU,这里我选择的是 STM32F103C8T6。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_10

Product Secret(产品密钥) 可以在产品的基本信息中找到,如下图。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_11

完成以上步骤,即完成了产品的配置。


三、手机端安装机智云 APP


地址链接

扫码下载即可。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_esp8266 温湿度数据采集数据库_12


四、编写 DHT11 驱动


  • DHT11 简要介绍

DHT11 器件采用简化的单总线通信,DATA 引脚用于微处理器与 DHT11 之间的通讯和同步,一次传送 40 位数据,高位先出。

数据格式如下:


8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位 (其中温、湿度小数部分为 0。) 8bit 校验位 = 8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据

举例:

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_13

  • 时序分析(附代码)

用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,信号发送如图所示。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_14

注意: 主机(MCU)从 DHT11 读取的温湿度数据总是前一次的测量值。

  • 总线空闲:

DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平,此时 DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。

  • MCU 发出请求信号:

MCU I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms,然后MCU I/O设置为输入状态。由于上拉电阻,MCU I/O 即 DHT11 的 DATA 数据线也随之变高,之后等待 DHT11 作出回答信号。

  • DHT11 发出应答信号:

当 DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 80us的低电平作为应答信号,紧接着输出 80us 的高电平通知 MCU 准备接收数据,MCU I/O 此时处于输入状态,检测到 DHT11 回应信号后,等待 80us 的高电平后的数据接收。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_物联网_15

  • MCU 接收 40 位数据

由 DHT11 的 DATA 引脚输出 40 位数据,MCU 根据 I/O 电平的变化来判断是 “0” 还是 “1” 。

位数据 “0” 的格式为: 50us 的低电平和 26-28us的高电平。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_16

位数据 “1” 的格式为: 50us 的低电平加 70us 的高电平。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_stm32_17

  • DHT11 发出结束信号

DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50us 后转为输入状态,由于上拉电阻存在,变为高电平。

// 本驱动采用 HAL 库,us 级延时使用通用定时器实现,对 IO 引脚的状态的改变采用位操作以及直接寄存器操作

// 复位DHT11
void DHT11_Rst(void)	   
{                 
    DHT11_IO_OUT(); 	//设置为输出
	DHT11_DQ_OUT = 0; 	//拉低
	HAL_Delay_ms(20);   //拉低至少18ms
	DHT11_DQ_OUT = 1; 	//拉高 
	HAL_Delay_us(30);   //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void) 	   
{   
	uint8_t retry = 0;
	DHT11_IO_IN();      //设置为输入	 
	while(DHT11_DQ_IN && retry < 100)	//DHT11会拉低40~80us
	{
		retry++;
		HAL_Delay_us(1);
	}	 
	if(retry >= 100)
		return 1;
	else 
		retry = 0;

	while(!DHT11_DQ_IN && retry < 100)	//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		HAL_Delay_us(1);
	}
	if(retry >= 100)
		return 1;	    
	return 0;
}

//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void) 			 
{
 	uint8_t retry = 0;
	while(DHT11_DQ_IN && retry < 100)//等待变为低电平
	{
		retry++;
		HAL_Delay_us(1);
	}
	retry = 0;
	while(!DHT11_DQ_IN && retry < 100)//等待变高电平
	{
		retry++;
		HAL_Delay_us(1);
	}
	delay_us(40);//等待40us
	if(DHT11_DQ_IN)
		return 1;
	else 
		return 0;		   
}

//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)    
{        
	uint8_t i,dat;
	dat = 0;
	for (i=0;i<8;i++) 
	{
			dat <<= 1; 
			dat |= DHT11_Read_Bit();
	}						    
	return dat;
}

//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败;2,校验和错误
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi)    
{        
 	uint8_t buf[5];
	uint8_t i;
	DHT11_Rst();
	if(DHT11_Check() == 0)
	{
		for(i = 0; i < 5; i++) 	//读取40位数据
		{
			buf[i] = DHT11_Read_Byte();
		}
		if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
		{
			*humi = buf[0];	
			*temp = buf[2];
		}
		else 
			return 2;	// 校验和错误
	}
	else 
		return 1;
	return 0;	    
}

//初始化DHT11的 IO口, 同时检测DHT11的存在
//返回1:不存在
//返回0:存在     	 
uint8_t DHT11_Init(void)
{
	DHT11_GPIO_Init();

	DHT11_Rst();
	return DHT11_Check();
}
  • 使用串口观察数据

将 printf 函数重定向至与 PC 相连的串口上。由于重定向相关函数已经包含在机智云生成的代码中(gizwits_product.c),我们直接使用 printf 进行数据打印即可。

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

以下为相关测试代码:

state = DHT11_Read_Data(&temperature, &humidity);
if(state == 2)
{
    printf("the checksum is error\n");
}
else if(!state)
{
    printf("temp = %d , humi = %d\n", temperature, humidity);
}
else
{
    printf("DHT11 is not answer\n");
}

若采集到的数据没有问题,即可将机智云协议相关代码移植进工程中。


五、机智云工程代码移植


前面我们有说到,在机智云平台创建产品完成后,生成了一个 MCU 的工程,这个工程是 CubeMX 所创建的,为了保持一致性,我们选择使用 HAL 库进行开发。

  • 创建一个新的 CubeMX 工程

芯片选型为:STM32F103RCTx

  • 配置相关外设
  1. SYS 配置为 SWD 调试

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_18

  1. 使能外部高速时钟,并配置为外部晶振

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_esp8266 温湿度数据采集数据库_19

  1. 配置 TIM3 相关参数,机智云的通信协议中会用到

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_stm32_20

  1. 配置 TIM2 相关参数,用于实现 us 级的延时

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_物联网_21

  1. 配置 USART1,用在 PC 端打印信息

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_物联网_22

  1. 配置 USART2,用于连接 ESP-8266

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_esp8266 温湿度数据采集数据库_23

  1. 配置所用到的 IO 口
  • 两个按键

两个按键的公共端配置为 推挽输出模式、低电平且下拉

两个按键的自由端配置为 输入模式、上拉

  • DHT11 DATA 引脚

配置为 推挽输出模式、高电平且上拉

  • LED 灯

配置为 推挽输出模式、低电平

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_24

  1. 配置时钟树

输入频率根据板子上的晶振频率填写,我们现在是 8 MHz。接着锁相环进行 9 倍频,使 AHB、APB1、APB2 桥的频率达到最高。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_25

  1. 自动生成 CubeMX 工程

最好对下面的选项进行勾选。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_esp8266 温湿度数据采集数据库_26

  • 将机智云平台生成的协议 demo 移植进入自己的工程
  1. 打开机智云工程文件夹,将其中的 Gizwits、Hal、Utils 文件夹复制到自己的工程文件夹中。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_27

  1. 在 Keil 中将复制的所有文件导入工程

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_物联网_28


esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_数据_29

  1. 修改 hal_key.c 中的初始化

语句中对应的IO 口和引脚号改为自己配置好的

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_30

完成上述步骤后,工程移植成功。


六、采集数据的上发


void gizwitsHandle(dataPoint_t *dataPoint)
  • 参数 dataPoint [in]:用户设备数据点。

该函数中完成了相应协议数据的处理即数据上报的等相关操作。

自定义相关代码如下:

void userHandle(void)
{
    DHT11_Read_Data(&temperature, &humidity);
	currentDataPoint.valuetemperature = temperature;//Add Sensor Data Collection
    currentDataPoint.valuehumidity = humidity;//Add Sensor Data Collection
}

七、控制数据的下拉


int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
  • 参数 info [in]:事件队列
  • 参数 data [in]:数据
  • 参数 len [in]:数据长度

用户数据处理函数,包括wifi状态更新事件和控制事件。

自定义相关代码如下:

case EVENT_LED:
    currentDataPoint.valueLED = dataPointPtr->valueLED;
    GIZWITS_LOG("Evt: EVENT_LED %d \n", currentDataPoint.valueLED);
    if(0x01 == currentDataPoint.valueLED)
    {
        //user handle
        PCout(15) = 1;	// led灯亮
    }
    else
    {
        //user handle   
        PCout(15) = 0;	// led灯灭
    }
    break;

八、ESP-8266 配置入网


有两种配网的方式

  • airlink
  • softap

这里我们选用 softap 模式进行配网。

步骤如下:

  1. 板子上电后,短按 按键2 进入 softap 模式

如果想要查询是否处于 softap 模式,可以将串口连接至 PC,查看打印出的相关信息。

  1. 进入机智云 APP 中选择 热点配置

填写要连接的路由器的账号和密码,以及ESP-8266发出的 WIFI 名前缀和密码。

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_物联网_31

  1. 选择乐鑫模组

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_物联网_32

  1. 按照提示,连接前缀为 XPG-GAgent- 的热点信号

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_单片机_33

  1. 等待几秒钟时间

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_stm32_34

  1. 连接成功

esp8266 温湿度数据采集数据库 esp8266 温度湿度固件_stm32_35

至此,即完成了 ESP-8266 softap 模式的配网。


九、测试


测试结果就不贴出来了。

欢迎大家来批评指正~~