生活随笔
收集整理的這篇文章主要介紹了
stm32通过wifi模块实现手机远程控制灯与舵机
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
由于對(duì)wifi模塊的控制需要,在網(wǎng)上找了許多資料,發(fā)現(xiàn)wifi模塊通過(guò)單片機(jī)進(jìn)行通訊的代碼不多,也有一些存在著錯(cuò)誤,于是便自己寫(xiě)了一個(gè)wifi控制舵機(jī)和燈的程序,記錄下來(lái)
stm32通過(guò)wifi模塊實(shí)現(xiàn)手機(jī)遠(yuǎn)程控制燈與舵機(jī)內(nèi)容包括:
- 所需要的元器件
- 整體思路
- 連線(xiàn)圖
- 完成效果
- wifi模塊初始化
- 代碼解析
所需要的元器件
- stm32單片機(jī)
- usb-ttl模塊
- stlink
- wifi模塊8066
- 舵機(jī)
整體思路
1.stm32先進(jìn)行wifi模塊初始化,發(fā)送AT指令使得wifi模塊進(jìn)入sta模式,自動(dòng)發(fā)送wifi名稱(chēng)與密碼連接至手機(jī)的熱點(diǎn),接入TCP,并開(kāi)啟通透?jìng)鬟f模式。
2.通過(guò)手機(jī)發(fā)送led信號(hào)讓wifi模塊接收到信息,并返回單片機(jī),在串口2上顯示,并翻轉(zhuǎn)單片機(jī)上的led燈,返回連接成功信息到手機(jī)上。
3.通過(guò)手機(jī)發(fā)送舵機(jī)信號(hào)讓wifi模塊接收到信息,返回單片機(jī),在串口2上顯示,并控制連接在單片機(jī)上的舵機(jī)轉(zhuǎn)動(dòng),返回連接成功信息到手機(jī)上。
連線(xiàn)圖
stm32通過(guò)uart1與wifi連接,
stlink連接stm32,
usb-ttl連接stm32的uart2,
舵機(jī)連接tim4來(lái)實(shí)現(xiàn)用脈沖控制舵機(jī)轉(zhuǎn)動(dòng)角度。
完成效果
使程序能夠自行連接給定的WIFI熱點(diǎn)和服務(wù)器并實(shí)現(xiàn)雙向通信,通過(guò)wifi模塊完成手機(jī)對(duì)stm32外設(shè)(燈和舵機(jī))的控制
wifi模塊初始化
wifi模塊的初始化中,有幾個(gè)指令是不可缺少的:
- AT測(cè)試
- AT+CWMODE=1設(shè)置工作模式
- AT+CWJAP=“熱點(diǎn)名稱(chēng)”,“熱點(diǎn)密碼”
- AT+CIPSTART=“TCP”,“服務(wù)器地址”,端口號(hào)
代碼解析
int
wifi_init()
{uint8_t ret
=0;ret
= Send_AT_commend("AT", "OK", 100);if(!ret
)return -1;ret
= Send_AT_commend("AT+CWMODE=1", "OK", 100);if(!ret
)return -2;wifi_str();ret
= Send_AT_commend(temp
, "OK", 9000); if(!ret
)return -3;server_str();ret
= Send_AT_commend(temp
, "OK", 3000); if(!ret
)return -4; ret
= Send_AT_commend("AT+CIPMODE=1", "OK", 100);if(!ret
)return -5;return 1;
}uint8_t
wifi_str()
{int i
=0;while(temp
[i
])temp
[i
++]=0x00;strcat(temp
,"AT+CWJAP=");strcat(temp
,"\"");strcat(temp
,NAME);strcat(temp
,"\",\"");strcat(temp
,PWD);strcat(temp
,"\"");
}
uint8_t
server_str()
{int i
=0;while(temp
[i
])temp
[i
++]=0x00;strcat(temp
,"AT+CIPSTART=\"TCP\",\"");strcat(temp
,ADDR);strcat(temp
,"\",");strcat(temp
,PORT);
}
uint8_t
Send_AT_commend(char
*at_commend
, char
*re_commend
, uint16_t time_out
)
{uint8_t i
=0;for(i
=0;i
<3;i
++){clear_buf();HAL_UART_Transmit(&huart1
, (uint8_t
*)at_commend
, strlen(at_commend
), 0xFFFF);HAL_UART_Transmit(&huart1
, (uint8_t
*)"\r\n", 2, 0xFFFF); HAL_Delay(time_out
);if(find_str(re_commend
))return 1;i
++;}return 0;
}
void clear_buf()
{uint16_t i
;for(i
=0;i
<2000;i
++)my_re_buf1
[i
]=0x00;HAL_UART_Receive_IT(&huart1
,my_re_buf1
,1);
}
void MG996R_Set_Angle(int16_t angle
)
{if ((-90 <= angle
) && (angle
<= 90)){CCR_value
= (10. / 9) * angle
+ 150; }__HAL_TIM_SET_COMPARE(&htim11
, TIM_CHANNEL_1, CCR_value
);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef
*huart
)
{if(huart
==&huart1
){ HAL_UART_Receive_IT(&huart1
,&my_re_buf1
[++pt_w1
],1); } }
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef
*htim
)
{int i
=0,len
=0;if(htim
==&htim4
){while(pt_r1
<pt_w1
){while(pt_r1
<pt_w1
)HAL_UART_Transmit(&huart2
,&my_re_buf1
[pt_r1
++],1,1000); HAL_UART_Transmit(&huart2
,(uint8_t
*)"\r\n",2,1000); if(find_str("LED")){HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); HAL_UART_Transmit(&huart1
, (uint8_t
*)"success", 7, 0xFFFF); }if(find_str("SERVO")){if(m
==0){MG996R_Set_Angle(-40); m
++; } HAL_UART_Transmit(&huart1
, (uint8_t
*)"success", 7, 0xFFFF); } }if(pt_r1
>=pt_w1
){pt_w1
=pt_r1
=0;HAL_UART_AbortReceive_IT(&huart1
);HAL_UART_Receive_IT(&huart1
,my_re_buf1
,1);}while(send_buf
[i
])send_buf
[i
++]=0x00; while(pt_r2
<pt_w2
){HAL_UART_Transmit(&huart1
,&my_re_buf2
[pt_r2
++],1,1000); HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); }if(pt_r2
>=pt_w2
){pt_w2
=pt_r2
=0;HAL_UART_AbortReceive_IT(&huart2
); HAL_UART_Receive_IT(&huart2
,my_re_buf2
,1);}}}
遇到的問(wèn)題
剛開(kāi)始wifi模塊初始化自動(dòng)加載的時(shí)候會(huì)出問(wèn)題,之后發(fā)現(xiàn)是初始化代碼里缺少了通透模式的設(shè)定,使得無(wú)法通過(guò)wifi連續(xù)傳遞信息寫(xiě)代碼的時(shí)候容易把函數(shù)寫(xiě)在主程序后,有時(shí)候keil會(huì)報(bào)錯(cuò),解決方法是創(chuàng)建一個(gè)新的c程序,在主函數(shù)里include這個(gè)程序的頭文件,之后引用就不會(huì)出現(xiàn)這樣的問(wèn)題了串口發(fā)送與接收十分重要,有時(shí)候可以用來(lái)檢測(cè)wifi模塊是否能連接上stm32
總結(jié)
希望自己以后可以碼代碼的時(shí)候更加細(xì)致,這樣能讓工程不會(huì)因?yàn)橐恍┖苄〉腷ug而崩潰。
總結(jié)
以上是生活随笔為你收集整理的stm32通过wifi模块实现手机远程控制灯与舵机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。