日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

stm32通过wifi模块实现手机远程控制灯与舵机

發(fā)布時(shí)間:2024/1/1 编程问答 83 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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模塊初始化
    • 代碼解析
      • 遇到的問(wèn)題
      • 總結(jié)

所需要的元器件

  • 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)

代碼解析

  • wifi模塊初始化代碼
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); }
  • 發(fā)送AT指令部分代碼
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); }
  • 舵機(jī)控制代碼
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); } }
  • 定時(shí)器中斷
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); //LEDHAL_UART_Transmit(&huart1, (uint8_t *)"success", 7, 0xFFFF); //return }if(find_str("SERVO")){if(m==0){MG996R_Set_Angle(-40); //SERVOm++; } HAL_UART_Transmit(&huart1, (uint8_t *)"success", 7, 0xFFFF); //return } }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); //LED}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ò),歡迎將生活随笔推薦給好友。