一、基于STM32+ESP8266+机智云的物联网demo(含源码)
一、基于STM32+ESP8266+机智云的物联网demo1、在机智云上创建项目和数据集2、WIFI模块烧写固件3、移植到MCU上①、在STM32上移植②、在IMX6ULL上移植1、在机智云上创建项目和数据集2、WIFI模块烧写固件3、移植到MCU上①、在STM32上移植②、在IMX6ULL上移植...
一、基于STM32+ESP8266+机智云的物联网demo
1、在机智云上创建项目和数据集
①、进入机智云官网,点击进入开发者模式;
机智云官网链接
②、进入开发者模式后,注册账号并登录;
③、点击创建新产品;
然后生成代码包:
2、WIFI模块烧写固件
①、选择固件烧写工具
②、设置对应的密钥
③、固件烧写
WIFI模 | VCC | GND | TXD | RXD |
---|---|---|---|---|
MCU—STM32 | VCC | GND | PB11 | PB10 |
USB to TTL模块 | VCC | GND | RXD | TXD |
如果买了正点原子的开发板和WiFi模块可以使用如下连接方式下载固件
④、配置好密钥后开始下载密钥
3、移植到MCU上
在STM32上移植
①、在工程中添加定时器驱动、串口3驱动
②、定时器驱动代码
定时器源文件
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
#include "stm32f10x_tim.h"
void TIM3_Int_Init(u16 arr,u16 psc);
#endif
定时器头文件
#include "timer.h"
#include "gizwits_product.h"
//
//定时器 驱动代码
//
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
gizTimerMs();
}
}
③、串口3驱动代码
串口3源文件
#ifndef __USART3_H
#define __USART3_H
#include "sys.h"
//
//串口3驱动代码
//
void usart3_init(u32 bound); //串口3初始化
#endif
串口3头文件
#include "usart3.h"
#include "gizwits_product.h"
//
//串口3驱动代码
//
//串口3中断服务函数
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART3);
gizPutData(&res, 1);//数据写入到缓冲区
}
}
//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
USART_DeInit(USART3); //复位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
USART_InitStructure.USART_BaudRate = bound; //波特率一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_Cmd(USART3, ENABLE); //使能串口
//使能接收中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开启中断
//设置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
}
②、在工程中添加Gizwits、Utils文件并修改
#include <stdio.h>
#include <string.h>
#include "gizwits_product.h"
//1、第一处添加
#include "usart3.h" //第一处添加
static uint32_t timerMsCount;
//2、第二处修改
/** Current datapoint */
extern dataPoint_t currentDataPoint;
extern u8 wifi_sta; //第二处修改
//3、将此函数注释
//void userHandle(void)
//{
// /*
// */
//
//}
//4、在第267-280行代码处添加四行代码用于循坏发送
for(i=0; i<len; i++)
{
//USART_SendData(UART, buf[i]);//STM32 test demo
//Serial port to achieve the function, the buf[i] sent to the module
//此处添加下列两行代码
USART_SendData(USART3,buf[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET)//循坏发送,直到发送完毕
if(i >=2 && buf[i] == 0xFF)
{
//Serial port to achieve the function, the 0x55 sent to the module
//USART_SendData(UART, 0x55);//STM32 test demo
//此处添加下列两行代码
USART_SendData(USART3, 0x55);//STM32 test demo
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
}
}
主函数代码
//
// 文 件 名 : main.c
// 版 本 号 : v2.0
// 作 者 : Kevin
// 生成日期 : 2021-1-3
// 最近修改 :
// 功能描述 :演示例程(STM32F103系列)
// 修改历史 :
// 日 期 :
// 作 者 : Kevin
//******************************************************************************/
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
#include "key.h"
#include "timer.h"
#include "gizwits_product.h"
#include "usart3.h"
#include "usart.h"
/* 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;
//WIFI连接状态
//wifi_sta 0: 断开
// 1: 已连接
u8 wifi_sta=0;
//协议初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系统定时
usart3_init(9600);//WIFI初始化
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
gizwitsInit();//缓冲区初始化
}
int main(void)
{
// float t=0;
// u8 t=0;
u8 wifi_con=0;//记录wifi连接状态 1:连接 0:断开
uart_init(115200); //串口初始化为115200
delay_init();
LED_Init();//LED初始化
LCD_Init();//LCD初始化
KEY_Init(); //初始化与按键连接的硬件接口
LED=0;
Gizwits_Init(); //协议初始化 要在定义
printf("--------传感器监测----------\r\n");
while(1)
{
if(wifi_con!=wifi_sta)
{
wifi_con=wifi_sta;
wifi_con?printf("connect"):printf("close"); //三元运算符如果成立则:打印connect否则:close
}
if(currentDataPoint.valuedeng == 0)
{
LED = 1;
}
else
{
LED = 0;
}
gizwitsHandle((dataPoint_t *)¤tDataPoint); //协议处理
key = KEY_Scan(0);
if(key==KEY0_PRES)//KEY0按键
{
printf("WIFI进入SOFTAP_MODE连接模式\r\n");
gizwitsSetMode(WIFI_SOFTAP_MODE);//WIFI_SOFTAP_MODE模式接入可以进这个函数修改模式
}
}
}
重点说明几处,也是创建项目必不可少的几个地方
设备连接
然后就会进入配对模式,显示设备配对成功。
4、总结
写这篇博客的意义在于总结一下自己玩 WiFi上云平台的过程,记得自己是2019年8月份的时候玩WiFi模块的,当时花了几天一直没有连上云平台,刚好最近有位朋友也遇到了这种问题,就总结一下,以后以免出现同样的问题;
遇到过的玄学问题:
1、设置第一次连接成功后在同一WiFi坏境下出现连接不成功的问题;
2、设置在不同WiFi坏境下连接不成功
3、有的手机能够连接上设备,有的手机不能连接设置
4、最后设置成了SOFTAP_MODE模式,直接去连接设备生成的WiFi,这样就避免了以上的坑,所有用SOFTAP_MODE很重要;不然你可能会崩溃!
后面也会写一些上onenet、华为云的文档;推荐一个讲STM32上机智云平台讲的比较细的视频教程:机智云(MCU方案)。
关于固件下载工具以及工程源码可在:Kevin的学习站 中获取,输入关键字:机智云 即可!
更多推荐
所有评论(0)