机智云STM单片机连接ESP8266的温湿度采集(使用标准函数库)
前言基于机智云平台实现单片机所采集的数据通过ESP8266模块将采集到的温湿度数据上传到手机APP从而实现随时对项目数据的监控,本文着重记述机智云代码的移植。
硬件准备WIFI模块使用ESP8266
注意使用ESP8266之前要先刷机智云的官方固件,刷固件的过程不在这里详解本文主要讲述代码的移植和单片机和云平台的连接
机智云部分代码的生成
机智云公版APP下载
进入官网点击产品服务下载公版APP
打开机智云APP点击 ' + ' 号,点击AirLink模式(这里根据自己代码选择配网模式),进入后选择连接的WIFI热点(注意这个热点是手机连接的热点的密码和名称且该热点的频段必须是2.4GHz),选择乐鑫(wifi模块生产厂家)按下确定并配网,按下网按键后点击确定等待配网。
机智云官网:
https://www.gizwits.com/
点击登录或者注册登录云平台,进入开发者中心
编辑创建智能产品(只能产品类型的选择根据要做的项目自己设定)
新建数据点:
1.表示名只能用英文字母最好是显示名称的英文简写
2.指的是手机APP所呈现的名称是单片机所采集的数据的名称
3.只读数据不可以更改通常用于温湿度的读取,MPU6050,DHT11等传感器数据的读取显示...
4.数据类型指的是所采集数据的类型
编辑
生成单片机开发板代码:点击MCU开发
编辑
硬件平台选择开发板的对应型号(注意如果需要标准库的代码则需要勾选“其他平台”),Prodect Secret密码需要点击右上角获取。
生成代码包并下载将下载中的下图两个文件复制到我们所写好的温湿度采集代码的文件夹目录中
机智云代码移植串口部分:gizPutData(&value, 1);
写入函数:将wife串口接收到数据写入到缓存区中,而写入缓存区的函数为gizPutData(),简单来说该函数的作用是接收ESP8266所返回的数据,函数位置在gizwits_protocol.c文件下(注意返回值变量要一致)
编辑
注意引用文件gizwits_protocol.h
编辑
串口发送函数:在usartWrite()函数中,协议通信会用到这个函数,而这个函数会涉及数据帧数据的发送,这里需要我们提供串口的发送函数,usartWrite()函数具体位置在gizwits_product.c文件下
USART_SendData(UART, buf[i]);
while (USART_GetFlagStatus(UART, USART_FLAG_TXE)==RESET);
USART_SendData(UART,0x55);
while (USART_GetFlagStatus(UART, USART_FLAG_TXE)== RESET);
编辑
引用头文件#include "usart3.h"
编辑
定时器部分:gizTimerMs();
协议层的运行需要一个系统时间,事件单位为毫秒,所以我们需要实现毫秒定时器(必须是 1ms 的精确定时,若不准确,会影响到超时重发、定时上报等处理),gizTimerMs()函数具体位置在 gizwits_protocol.c 文件下
编辑
引用头文件#include "gizwits_product.h"
编辑
实现芯片复位函数:根据串口协议文档规定,模组可以发送命令 复位设备MCU,所以用户需要实现mcuRestart()接口完成设备的复位
__set_FAULTMASK(1);
NVIC_SystemReset();
编辑
添加标志位:WIFI_CON_M2M代表配网成功,而WIFI_DISCON_M2M代表未完成配网至标志位:
wifi_flag = 1;
wifi_flag= 0 ;
上行数据采集:
userHandle()
userHandle()函数位置在main.c中,它主要目的让开发者可以在这函数中实现对传感器等其他设备采集,然后将需要上传的数据存到其他设备状态结构体 currentDataPoint 结构体成员中(注意:上传数据要和产品的数据点是有关联的,不然上传也没有意义),设备状态结构体 currentDataPoint 变量定义在main.c中
主函数部分
#include "stm32f10x.h"
#include "led.h"
#include "jdq.h"
#include "key.h"
#include "sys.h"
#include "timer.h"
#include "delay.h"
#include "usart.h"
#include "usart3.h"
#include "iwdg.h"
#include "exti.h"
void Gizwits_Init(void)
{
TIM4_Int_Init(9, 7199);
usart3_init(9600); // wifi初始化 波特率必须为9600
memset((uint8_t *)¤tDataPoint, 0, sizeof(dataPoint_t));//清除结构体
gizwitsInit();//机智云初始化
}
/*******************************************************************************
** 函数名称: userHandle
** 功能描述: 这里用户需要实现除数据点采集以外的数据采集,该函数作用是将用户采集的数据上报
********************************************************************************/
void userHandle(void)
{
if(wifi_flag == 1)
{
temp = DS18B20_Get_wd();//将DS18B20读取值返回给temp
currentDataPoint.valuetemp = temp;
}
}
/*******************************************************************************
** 函数名称: Hardware_Init
** 功能描述:
********************************************************************************/
u8 fd;
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
usart_init(115200);
// LED_Init();
KEY_Init();
// Relay_init();
// beep_init();
void key_scanf(void)
{
if(KEY1 == RESET)
{
DelayMs(10);
if(KEY1 == RESET)
{
gizwitsSetMode(WIFI_AIRLINK_MODE);//配网
printf("\r\n AirLink mode ok \r\n");//成功则打印AirLink mode ok
}
while(!KEY1);
}
}
/*******************************************************************************
** 函数名称: main
** 功能描述:
********************************************************************************/
int main(void)
{
Hardware_Init();
Gizwits_Init();
printf("初始化完成 \r\n");
while(1)
{
key_scanf();
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint); ////协议处理每次上报上报结构体中的内容
}
}