前言:
经过一天的努力,终于弄懂了怎么接入机智云,写博客记录一下,防止自己以后会忘记。

功能简介:
使用32单片机和ESP8266-01S接入机智云,将传感器采集的光照数据上传到机智云APP,同时实现远程控制LED灯。

前期准备:
1、注册机智云账号
2、ESP8266烧写机智云的官方固件
3、在机智云上创建新产品
4、准备一个写有串口3、定时3的工程模板

主要硬件准备:
1、STM32C8T6最小系统板
2、ESP8266-01S模块
3、BH1750光照传感器

模块接线:
ESP8266-01S模块:
VCC–3.3V GND–GND TX–PB11 RX–PB10
BH1750光照传感器:
VCC–3.3V GND–GNG SCL–PB6 SDA–PB7 ADDR–不接

1、注册机智云账号
进入官网注册

2、ESP8266烧写机智云的官方固件
机智云固件下载地址

下载的资源如下:
用ESP8266-01S模块的烧写第2个固件

ESP8266烧录模式的接线:
建议大家可以买个ESP8266的下载烧录器,省去接线的麻烦。
如果是其他串口模块,烧录模式的接线如下:
将TX接到串口模块的RX上,
将RX接到串口模块的TX上,
EN和VCC接3.3V
GND和IO0接GND
其余脚无视即可。

使用ESPFlashDownloadTool_v3.6.4.exe软件烧写固件
双击运行软件后,选择第1个

导入8Mb的固件后,按下图配置,点START开始烧写

判断是否烧录成功:
出现有FF FF 00 05开头的数据,说明已经成功烧录机智云的固件

3、在机智云上创建新产品
进入开发者中心

右上角的+创建新产品

产品分类可以不改,填写产品名称,选择WiFi/移动网络方案,最后点击保存

点击保存后会自动来到这个页面,点击去添加数据点

新建数据点

LED开关的数据点如下:

再添加一个光照值的数据点

点击应用 保存数据点

先来测试一下创建的产品是否可以和机智云APP通信
下载官方的Demo APP进行虚拟设备测试和后面的实际设备测试
下载后安装、注册账号,这个账号不是我们在机智云官网开发者中心注册的账号,需要另外注册。

启动虚拟设备

点击显示二维码后,使用手机上的机智云APP扫码绑定

点击推送可以将平台的数据发给手机APP

手机APP界面

接下来是移植机智云的代码到开发板中
拷贝产品密钥

粘贴刚刚拷贝的产品密钥,硬件平台选STM32F103C8X,后点击生成代码包

下载代码

下载的压缩包如下:

解压后,将这两个文件夹拷贝到我们准备好的工程模板(带串口3和定时3)中

4、准备一个写有串口3、定时3的工程模板
已放入工程模板中

打开我们的工程模板,新增两组文件夹,后添加对应的源文件(.c)

添加头文件路径

编译代码后会出现两处错误

第1处错误修改:

第2处错误修改:

再次运行编译后出现10个错误

把报错的注释掉,同时将修改 dataPoint_t currentDataPoint;
main.c文件中添加对应的头文件和定义设备状态结构体

继续根据错误 注释和修改
将HAL_NVIC_SystemReset();更改为NVIC_SystemReset();

接下来将233行到291行的都注释掉
被注释的函数有

PUTCHAR_PROTOTYPE
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
void timerInit(void)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
void uartInit(void)


在int32_t uartWrite(uint8_t *buf, uint32_t len)函数里面注释掉for()循环,添加新的for循环

 for(i=0; i<len; i++)//添加{USART_SendData(USART3,buf[i]);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 if(i >=2 && buf[i] == 0xFF){//实现串口发送函数,将0x55发送到模组USART_SendData(USART3,0x55);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   }                }

再次编译后- 0 Error(s), 3 Warning(s)
警告可以不理,有强迫症的看下:
第1处警告
直接注释掉,没有用到这个变量

第2、3处警告
添加volatile关键字,防止编译器优化

继续优化代码
将void userHandle(void)放在main.c文件中

在userHandle()函数里添加需要上传到机智云平台的数据
我这里需要上传光照数据和LED1(PC13)状态值

//用户数据采集
void userHandle(void)
{//光照数据采集float light = LIght_Intensity();currentDataPoint.valueLight = light; //添加传感器数据采集//判断当前LED1开关量if(LED1==0)currentDataPoint.valueLEDSwitch = 1;   //开else currentDataPoint.valueLEDSwitch = 0;   //关}

串口3中断服务函数编写
添加gizPutData(&res, 1)函数,并且在文件上方加入对应的头文件#include “gizwits_product.h”

//串口3中断服务函数
void USART3_IRQHandler(void)
{u8 res;          if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据{     res =USART_ReceiveData(USART3);        gizPutData(&res, 1);//数据写入到缓冲区}
}

定时器3中断服务函数编写

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 gizTimerMs();}
}

在main.c文件中定义一个协议初始化函数Gizwits_Init()

//协议初始化
void Gizwits_Init(void)
{   TIM3_Init(9,7199);//1MS系统定时USART3_Init(9600);//WIFI初始化memset((uint8_t*)&currentDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化gizwitsInit();//缓冲区初始化
}

机智云平台下发开关灯命令的处理
文件上方写上LED的头文件

添加头文件

main.c文件

/**********************************************
STM32接入机智云--实现数据上传和命令下发
********************************************/
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "timer3.h"
#include "usart.h"
#include "bh1750.h"#include "gizwits_product.h"   //需要包含的头文件/* 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;//协议初始化
void Gizwits_Init(void)
{   TIM3_Init(9,7199);//1MS系统定时USART3_Init(9600);//WIFI初始化memset((uint8_t*)&currentDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化gizwitsInit();//缓冲区初始化
}//用户数据采集
void userHandle(void)
{//光照数据采集float light = LIght_Intensity();currentDataPoint.valueLight = light; //添加传感器数据采集//判断当前LED1开关量if(LED1==0)currentDataPoint.valueLEDSwitch = 1;   //开else currentDataPoint.valueLEDSwitch = 0;   //关}int main(void)
{u8 keyValue;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级delay_init();          //延时函数初始化USART1_Init(9600);LED_GPIO_Config();     //LED初始化KEY_GPIO_Config();      //按键初始化BH1750_Init();Gizwits_Init();printf("--------机智云-协议移植LED测试实验----------\r\n");printf("KB0:AirLink连接模式\t KB1:WIFI复位\r\n\r\n");while(1){userHandle(); //用户数据采集gizwitsHandle((dataPoint_t *)&currentDataPoint);//协议处理keyValue = KEY_Scan();  //扫描按键是否按下if(keyValue==KB0_Value)  //KB0按键按下{printf("WIFI进入AirLink连接模式\r\n");gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入}           if(keyValue==KB1_Value)  //KB1按键按下{  printf("WIFI复位,请重新配置连接\r\n");gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位}delay_ms(200);}
}

key.c文件

#include "key.h"
#include "delay.h"/*key初始化*/
void KEY_GPIO_Config(void)
{//定义结构体变量,注意:只能放在{后面GPIO_InitTypeDef GPIO_InitStruct;//配置时钟RCC_APB2PeriphClockCmd(KEY_GPIO_CLK, ENABLE);//配置引脚GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入模式GPIO_InitStruct.GPIO_Pin = KEY_GPIO_PIN;//GPIO_InitStruct.GPIO_Speed =  GPIO_Speed_50MHz;GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
}u8 KEY_Scan()
{if(KB0==0||KB1==0) //任意一个按键按下{delay_ms(5);if(KB0==0) {while(KB0==0);//等待手松开return KB0_Value; }else if(KB1==0){while(KB1==0);return KB1_Value; }//while(!GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN));  //等待手松开}return 0;
}

key.h文件

#ifndef __KEY_H_
#define __KEY_H_#include "stm32f10x.h"
#include "sys.h"#define KEY_GPIO_PIN (GPIO_Pin_0|GPIO_Pin_1)
#define KEY_GPIO_PORT GPIOB
#define KEY_GPIO_CLK RCC_APB2Periph_GPIOB//使用位操作定义
#define KB0 PBin(0)
#define KB1 PBin(1)//定义各个按键值
#define KB0_Value 1
#define KB1_Value 2void KEY_GPIO_Config(void);  //key初始化
u8 KEY_Scan(void);#endif

下载程序到单片机上
打开串口助手,方便我们看输出的信息
按下复位按键后输出如下:

用一台手机A充当路由器。设置好手机A热点:不含中文、2.4G频段、保证这个热点能够上网

使用另外一台手机B连接手机A开的热点,手机B要提前装好机智云APP。手机B打开机智云APP
连上热点后,手机B的操作如下:

输入WIFI密码,后点击下一步

ESP8266-01S的选择乐鑫

先按下单片机的PB0按键,让WIFI进入AirLink连接模式,再点击“我已完成上述操作”

按下PB0按键后进入AirLink连接模式,串口输出的信息:

耐心等待

成功连接到设备,点击进入

在此处可以远程控制LED1的开关和收到光照数据
自此设备上电就会自动连上刚刚设置的热点,不用再“一键配置”了。如果需要重新配置,按下PB1按键,即可重新配置连接。手机连上与设备相同的热点,就能在机智云APP上收到来自设备的数据和控制设备。

解释下AirLink模式

最后:
个人觉得机智云不是很方便,因为想要上传新的数据或者是添加其他控制,都要重新生成代码包、下载、移植、改错…,前面做的事又要做一部分。

需要源码的可以自行下载。代码下载链接
下载操作:

STM32接入机智云--实现数据上传和命令下发相关推荐

  1. 4G模块接入阿里云-实现数据上传和命令下发

    功能介绍: 使用4G模块EC600S和32单片机实现接入阿里云服务器,上传光照数据和下发命令控制LED灯(PC13),同时可以打电话.发短信. 前期准备: 1.首先你得有一个阿里云的账号,没有的话就注 ...

  2. STM32接入阿里云(FreeRTOS)-实现数据上传和命令下发

    功能介绍: 将传感器采集的数据上传到阿里云,同时可以下发控制板上的LED灯(PC13) 前期准备: 1.首先你得有一个阿里云的账号,没有的话就注册一个 2.在物联网平台创建产品和设备 主要硬件准备: ...

  3. CC2530接入OneNET-实现数据上传和命令下发

    前言: 之前物联网课设时就想用CC2530单片机和ESP8266-01S来实现数据上传和远程控制,当时在网上也找了很多资料,无果.本来是不想再碰这个的,由于我同学做毕设需要用到,所以再努力了一把,也终 ...

  4. C51接入OneNET-实现数据上传和命令下发

    功能介绍: 使用51单片机将温度数据上传到OneNET云平台,同时可以实现远程控制LED灯的功能. 前提准备: 1.有OneNET的账号 2.刷入 OneNET 提供的 ESP8266 固件参考文章 ...

  5. RaspberryPi+OneNET MQTT方式 数据上传和命令下发

    MQTT相关实验 第一节:Mosquitto 相关实验 第二节:域名解析和内网穿透实验 第三节:OneNET 相关实验 Gitee仓库地址: https://gitee.com/zhj0125/MQT ...

  6. 个人项目——STM32接入机智云教程

    STM32接入机智云工具包下载 机智云演示Demo 为了叙述我后面做的物联网项目,同时方便大家学习利用机智云进行物联网开发,我觉得有必要把接入机智云的教程细致的描述一下. 硬件准备 开发板使用正点原子 ...

  7. 【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节

    首先要吐槽一点,那就是网络上的这方面资料杂七杂八,而且很多都是一模一样的: 然后我作为一个学生,没有多大的本事,就是想实现最基本的功能,然后在此基础上慢慢拓展.所以那些十分庞大的工程或者一些IoT物联 ...

  8. NodeMCU(ESP-12E)+阿里云实现数据上传和控制继电器开锁

    源码及工具下载:https://github.com/RL-Y/NodeMCU-aliyun.git Arduino15:提取码:ythf :链接: https://pan.baidu.com/s/1 ...

  9. ESP8266接入阿里云物联网平台上传温湿度数据

    简介 本文章使用NodeMCU(ESP8266)开发板和SHTC3温湿度传感器接入阿里云物联网(IoT)平台,并上传读取到的温湿度数据.每秒读取一次温湿度数据,每30秒上传一次30秒内的温湿度的平均值 ...

  10. STM32接入机智云平台

    写博客作为学习记录,加深印象,可能写的不对,或者有些地方写的不全,欢迎在下评论哈,我会及时更正 传送门:博客汇总帖 如果ESP8266还没有烧录机智云固件,在我另一篇博客: ESP8266烧写机智云固 ...

最新文章

  1. java解密方法,java加密,解密方法
  2. 30年职场生涯的感悟[转]
  3. android 测试 大赛,轻量级android应用自动测试工具-2017全国大学生软件测试大赛.pdf...
  4. 设置ubuntu默认python3设置
  5. C#语法中String与string的区别
  6. c语言宏 转换字符串,c预处理程序-如何从C宏的值生成char字符串?
  7. 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置
  8. 谷歌不支持调用摄像头麦克风_谷歌突然推出Android 11开发者预览版 新版带来部分新功能和改进...
  9. 用最通俗易懂的方式打开区块链!
  10. WinAPI: waveInGetPosition - 获取当前输入设备的输入位置
  11. 安卓EventBus的使用方法
  12. html5显示特殊符号,HTML5特殊符号怎么显示-电脑自学网
  13. python math数学模块
  14. ionic -- 实现根据拼音字母搜索人员
  15. Installshield如何实现升级覆盖文件
  16. Android 中Goolgle 相关服务的移植[转]
  17. 按关键字爬取百度图片
  18. JS纯前端实现文件保存
  19. java如何实排班表时间算法_安卓自定义View-日历型排班表-CalendarScheduleView
  20. git remote prune

热门文章

  1. java毕业设计幼儿园管理系统Mybatis+系统+数据库+调试部署
  2. Linux卸载驱动方法
  3. 苹果手机微信语音没声音怎么回事_【云喇叭】微信+支付宝收款语音播报音箱一体机,播报声音大,嘈杂环境也听得见,自带流量卡可连WiFi,无需蓝牙,手机不在店里也播报...
  4. 电脑硬盘损坏如何修复?自己动手就能解决
  5. 使用Xftp6上传文件显示状态错误
  6. 软考-信息系统项目管理师-项目进度管理
  7. 封装继承多态还是封装抽象继承多态
  8. godot 以 WebAssembly 为目标平台编译导出模板
  9. python使用masscan扫描端口
  10. Android逆向之路---让我们试试另一种方法看漫画-(1)