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

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

一、ESP-8266 烧录固件

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

  • 机智云固件 GAgent 下载

地址链接

在这里插入图片描述

  • 查看 ESP-01S 的规格书

在这里插入图片描述

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

选择 conbine(四合一的文件)

在这里插入图片描述

  • 使用 ESP 官方 Flash 下载工具

地址链接

注意: 下载时GPIO0要接地

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

在这里插入图片描述

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

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

在这里插入图片描述


二、机智云创建产品


  • 在机智云官网注册账号

地址链接

  • 创建产品

在这里插入图片描述

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

  • 添加数据点

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

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

温度:

在这里插入图片描述

湿度:

在这里插入图片描述

按键布尔值:

在这里插入图片描述

  • 生成 MCU 工程代码

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

在这里插入图片描述

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

在这里插入图片描述

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


三、手机端安装机智云 APP


地址链接

扫码下载即可。

在这里插入图片描述


四、编写 DHT11 驱动


  • DHT11 简要介绍

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

数据格式如下:

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

举例:

在这里插入图片描述

  • 时序分析(附代码)

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

在这里插入图片描述

注意: 主机(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 的高电平后的数据接收。

在这里插入图片描述

  • MCU 接收 40 位数据

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

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

在这里插入图片描述

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

在这里插入图片描述

  • 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 调试

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

  • DHT11 DATA 引脚

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

  • LED 灯

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

在这里插入图片描述

  1. 配置时钟树

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

在这里插入图片描述

  1. 自动生成 CubeMX 工程

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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


六、采集数据的上发


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 名前缀和密码。

在这里插入图片描述

  1. 选择乐鑫模组

在这里插入图片描述

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

在这里插入图片描述

  1. 等待几秒钟时间

在这里插入图片描述

  1. 连接成功

在这里插入图片描述

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


九、测试


测试结果就不贴出来了。

欢迎大家来批评指正~~

  • 62
    点赞
  • 298
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
### 回答1: STM32ESP8266是目前比较常用的物联网设备,可以实现对传感器的数据采集、处理和传输。如果要将其接入到OneNET平台上,需要以下步骤: 1. 准备硬件:需要一块STM32开发板和一块ESP8266模块,以及一个温湿度传感器。 2. 搭建开发环境:使用Keil等集成开发环境进行代码编写和调试。开发环境需要支持STM32的C语言编程。 3. 编写程序:首先要实现STM32温湿度传感器之间的通信,采集数据并监测数据的变化。然后再使用STM32ESP8266之间的串口通信,将数据发送到OneNET平台。 4. 配置OneNET平台:打开OneNET官网,注册帐号并创建设备模板,将上传的数据添加到设备模板中。配置好硬件设备所属的产品和数据流,获取设备的Key和Topic。 5. 实现数据上传:使用AT指令控制ESP8266与OneNET服务器进行通信,将采集的数据上传到设备模板中。 总之,需要通过串口通信实现stm32esp8266之间的数据传输和控制,然后通过AT指令控制esp8266连接OneNET云平台并上传数据。需要充分理解OneNET平台的产品和设备模板、数据流等概念,并具备一定的开发经验和编程能力。 ### 回答2: 在将STM32ESP8266联合使用来接入onenet云平台中,需要遵循以下步骤。 第一步,选择合适的传感器来测量温湿度。通常可选择DHT11或DHT22等温湿度传感器。 第二步,在STM32上连接传感器,通过ADC模块读取传感器测得的温湿度数据,并将数据存储在内存中。 第三步,通过STM32ESP8266进行串口通信,将读取到的温湿度数据传输给ESP8266。 第四步,通过AT指令将数据通过ESP8266连接到onenet云平台。需要注意的是,需要在onenet平台中创建数据流,并获取到数据流ID、设备ID、以及密钥等信息。 第五步,将数据通过HTTP POST方式发送到onenet平台,实现数据上传。 最后,进行数据接入验证。可通过在onenet平台上查看数据流图表来确认数据是否上传成功。 总而言之,将STM32ESP8266联合使用来接入onenet温湿度,需要通过温湿度传感器获取数据,通过STM32ESP8266进行串口通信,并借助AT指令将数据上传到onenet平台。务必进行数据接入验证,以确保数据上传成功。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G.Chenhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值