2020年5月1日劳动节

为什么要说一下这个日期,因为我上一次玩(学)G510模组是去年2019年5月1日,由于种种原因吧,一直也没有机会再次操作,而且不幸的一件事情就是,我还把上次搞的代码搞丢了,也没有备份,当时也是比这大神的分享搞的,https://blog.csdn.net/gizwits_csdn/article/details/79569061,遇到了一些问题,也解决了,但是感觉还是有点问题,今天可能是机缘巧合我又在相似的时间做了相同的事情。

为什么要用G510呢

因为我觉得既然是远程的控制就因该能实现真正意义上的远程,WiFi环境下的远程也不是不可以,但是我想的是要把它能做成一个差不多的产品去打磨,我们学技术的最终不是要服务生活吗?刚好我看到亲戚家水泵机房的控制可以尝试用G510去改造,先简单介绍一下我的想法吧

  1. 要实现真正意义上的远程控制
  2. 要具备控制三相交流电机的能力
  3. 要比较的可靠和稳定
  4. 要有比较安全的措施
  5. 即使是达不到大规模生产也要用PCB制成板子
  6. 功能上实现8路继电器的控制,每一路的有效工作时间,具备手动和自动两种模式。

步入正题,开始接入机智云

首先我们要先有这个模块,我的模块是淘宝上一个和机智云合作的公司买的,有两种版本,其中一个版本是透传的版本,一个是AT标准版本,我买的是AT标准版本,这个其实有一个问题,就是AT版本无法直接接入机智云(我说的是无法用那种无脑的方式接入),我们需要下载机智云官方的固件。如何下载官方哪里有很多资料,可以自行去找一下,需要注意的是,我们通信的串口并不是,下载程序的串口。

我选择是最简单的一种模式就是利用MCU+通讯模组的方案移植自动生成的代码工程到自己的开发板工程,我的开发版是直接使用的正点原子开发板(我可不是有钱,板子是我嘉立创参加活动白嫖的,我之所以用开发板是因为我没有其他的啊,对主要是因为我穷)

创建数据点,自动生成对应平台的代码



下载后解压,把下面的Gizwits 和Utils 文件夹复制到自己的工程里

其实这个工程直接可以打开,但是是用hal库写的,对hal不是很熟悉,因为原来的工程是标准库,所以选择改少的。

除此之外我们还要粘贴两个文件夹一个TIMER和一个USART3两个分别是定时器的配置和串口3的配置,通信用串口3调试用串口1。
这个是参考 唯恋殊雨 博主的博客整理的,一个实现了ms的定时中断
一个实现了串口的初始化配置

#include "timer.h"
#include "gizwits_product.h"//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//定时器 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//       //通用定时器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_timTIM_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();}
}
#include "usart3.h"
#include "gizwits_product.h"//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口3驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2014/3/29
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//     //串口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   PB10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                     //PB10GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                   //复用推挽输出GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //初始化PB10//USART3_RX    PB11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                          //浮空输入GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //初始化PB11USART_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);       //初始化串口3USART_Cmd(USART3, ENABLE);                      //使能串口 //使能接收中断USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  //开启中断   //设置中断优先级NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器}

把添加进来的文件进行修改


这里要包含工程所需的文件头

把没有用的函数我们给他删除或者屏蔽

在user handle里面填入自己要处理的代码

屏蔽没有用到的或者已经被从新写过的函数,并修改串口的代码

/*** @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;
//}/*** @brief  Period elapsed callback in non blocking mode * @param  htim : TIM handle* @retval None*/
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{//  if(htim==&htim2)
//  {//          keyHandle((keysTypedef_t *)&keys);
//          gizTimerMs();
//  }
//}/**
* @brief Timer TIM3 init function* @param none
* @return none
*/
//void timerInit(void)
//{//  HAL_TIM_Base_Start_IT(&htim2);
//}/*** @brief  This function handles USART IDLE interrupt.*/
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
//{
//    if(UartHandle->Instance == USART2)
//    {
//              gizPutData((uint8_t *)&aRxBuffer, 1);//        HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//开启下一次接收中断
//    }
//}  /**
* @brief USART init function* Serial communication between WiFi modules and device MCU
* @param none
* @return none
*/
//void uartInit(void)
//{//  HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//开启下一次接收中断
//}/**
* @brief Serial port write operation, send data to WiFi module
*
* @param buf      : buf address
* @param len      : buf length
*
* @return : Return effective data length;-1,return failure
*/
int32_t uartWrite(uint8_t *buf, uint32_t len)
{uint8_t crc[1] = {0x55};uint32_t i = 0;if(NULL == buf){return -1;}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){USART_SendData(USART3,0x55);while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕 }}#ifdef PROTOCOL_DEBUGGIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);for(i=0; i<len; i++){GIZWITS_LOG("%02x ", buf[i]);if(i >=2 && buf[i] == 0xFF){GIZWITS_LOG("%02x ", 0x55);}}GIZWITS_LOG("\n");
#endifreturn len;
}  

最后再main函数重新写这连两个函数

最后再while(1)里调用自己写的函数和更新数据点,官方建议加个一分钟10次的频率延时,保证数据下发和上传进行完毕。
编译修改错误后可以下载调试。

这里其实有个坑

我们用的是G510模组,它的绑定方法需要扫描二维码才可以绑定,这个二维码好多情况下也不管用,我用的旧版本有的时候可以有的时候不可以,但是只要模块能上线,电脑上是可以看到的,我发新有的时候反应的确实比较慢,我决定上线的时间非常长。

绑定好后就可以用机智云的app控制自己的单片机了

我自己实验的效果链接https://www.bilibili.com/video/BV1yg4y1z7Fy
记录学习的过程,本身就是一个提高,不断学习,不断进步,日积月累向一个合格的工程师方向努力(感觉这个时间会很久)

初出茅庐的小李第19篇博客之广和通G510模块接入机智云平台相关推荐

  1. 初出茅庐的小李第3篇博客《5G物联网及NB-IoT技术详解》读书笔记1

    初出茅庐的小李第3篇博客 <5G物联网及NB-IoT技术详解>读书笔记1 在Mculover666那里白嫖了一本书,不要问我咋白嫖的,我也不知道- 为什么要写这样的笔记? 因为我白嫖的时候 ...

  2. 初出茅庐的小李第113篇博客项目笔记之机智云智能浇花器实战(2)-基础Demo实现

    初出茅庐的小李第112篇博客项目笔记之机智云智能浇花器实战(1)-基础Demo实现 接(1) 继电器实现 继电器原理图 继电器采用的是5V继电器,控制端是RELAY-1 继电器代码实现 #includ ...

  3. 初出茅庐的小李第39篇博客之转载一篇有关unistd.h的介绍文章

    转载一篇文章 mask一下好找 unistd.h在unix中类似于window中的windows.h! #ifdef WIN32 #include <windows.h> #else #i ...

  4. 初出茅庐的小李第114篇博客项目笔记之机智云智能浇花器实战(3)-基础Demo实现

    机智云智能浇花器实战(3)-基础Demo实现 链接:机智云智能浇花器实战(2)-基础Demo实现 BH1750光照传感器原理图 BH1750传感器代码 #include "bh1750.h& ...

  5. 初出茅庐的小李第73篇博客之offsetof(type, member-designator)使用

    offsetof(type, member-designator) 这是一个宏定义包含在<stddef.h>里,它的作用是用来计算一个结构成员相对于结构开头的字节偏移量. 说到这里我先来补 ...

  6. 初出茅庐的小李第86篇博客之Modbus协议总结

    Modbus协议来源 Modbus协议的由来 Mod,取自英文单词" Modicon",Modicon 中文翻译为莫迪康,是美国一家自动化公司的名字,现在这家公司被法国的施耐德电气 ...

  7. 初出茅庐的小李第59篇博客之测试Modbus协议的继电器

    1, Modbus RTU指令详解 发送: FF 05 00 00 FF 00 99 E4 字段 含义 注释 FF 设备地址 范围1-255,默认255 05 功能码 写单个线圈 00 00 继电器地 ...

  8. 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

    旋转编码器的引脚 CLK(A相) DATA(B相) SWITCH VCC GND 工作原理 旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thre ...

  9. 初出茅庐的小李第115篇博客之智能浇花器实战分享(4)

    机智云智能浇花器实战分享(下) 机智云平台如何创建数据点: 机智云官方网站:机智云|物联网云平台,AIoT开发云平台,Aiot软件开发平台.AIoT开发云平台.工业物联网解决方案 (gizwits.c ...

最新文章

  1. phpstorm 2017.1激活
  2. How to not show unnecessary zeros when given integers but still have float answers when needed
  3. Centos7修改主机名
  4. php禁用cookie后session设置方法分析
  5. oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网
  6. 机器学习在美团配送系统的实践:用技术还原真实世界
  7. c++中vector用法(涵盖算法题中知识点)
  8. qint64转字符串
  9. 教育中的“产出/产能平衡”原则
  10. C# 提取字符串中的数字,去除字符串中的重复字符逗号分隔
  11. 分布式消息系统jafka快速起步(转)
  12. 从用户端到后台系统,严选分销教会我这些事
  13. Java 邮政EMS快递面打印实现 笔记
  14. 删除2345输入法和智能云输入法这两个狗屁玩意的注册表
  15. 计算机怎么移动游戏,Uplay游戏怎么搬移 Uplay游戏搬移方法介绍
  16. pdf和word等文档添加水印
  17. unet医学肺部ct图分割简单记录
  18. 和府捞面全新品牌“小面小酒”在福州开业,下一批新店落地天津、淄博
  19. Python3-豆瓣电影影片差评和影片封面照片的爬取
  20. ProtoBuf 官方文档翻译

热门文章

  1. MDN要点记录--CSS
  2. oracle SQL认证考试,sql认证(sql server认证考试)
  3. lucas定理、拓展lucas定理学习小结
  4. 计算机科学期刊论文格式,计算机科学期刊投稿论文模板
  5. 《疯狂Java讲义》(第5版) 作者李刚(待重新排版)
  6. Linux快速查看文件内容中包含的字符
  7. R语言快速制作学术论文三线表
  8. MMO手游地图同步方案的分析与总结
  9. MPS | 简单易用的工业电源模块
  10. 在线聊天室的消息单聊的实现——springboot整合WebSocket(二)