初出茅廬的小李第19篇博客之廣和通G510模塊接入機智雲平臺

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_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();
	}
}

#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   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寄存器
	
}

把添加進來的文件進行修改

在這裏插入圖片描述
這裏要包含工程所需的文件頭
在這裏插入圖片描述
把沒有用的函數我們給他刪除或者屏蔽
在這裏插入圖片描述
在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_DEBUG
    GIZWITS_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");
#endif
		
		return len;
}  

最後再main函數重新寫這連兩個函數
在這裏插入圖片描述
最後再while(1)裏調用自己寫的函數和更新數據點,官方建議加個一分鐘10次的頻率延時,保證數據下發和上傳進行完畢。
編譯修改錯誤後可以下載調試。

這裏其實有個坑

我們用的是G510模組,它的綁定方法需要掃描二維碼纔可以綁定,這個二維碼好多情況下也不管用,我用的舊版本有的時候可以有的時候不可以,但是隻要模塊能上線,電腦上是可以看到的,我發新有的時候反應的確實比較慢,我決定上線的時間非常長。

綁定好後就可以用機智雲的app控制自己的單片機了

我自己實驗的效果鏈接https://www.bilibili.com/video/BV1yg4y1z7Fy
記錄學習的過程,本身就是一個提高,不斷學習,不斷進步,日積月累向一個合格的工程師方向努力(感覺這個時間會很久)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章