由于对wifi模块的控制需要,在网上找了许多资料,发现wifi模块通过单片机进行通讯的代码不多,也有一些存在着错误,于是便自己写了一个wifi控制舵机和灯的程序,记录下来

stm32通过wifi模块实现手机远程控制灯与舵机内容包括:

  • 所需要的元器件
    • 整体思路
    • 连线图
    • 完成效果
    • wifi模块初始化
    • 代码解析
      • 遇到的问题
      • 总结

所需要的元器件

  • stm32单片机
  • usb-ttl模块
  • stlink
  • wifi模块8066
  • 舵机

整体思路

1.stm32先进行wifi模块初始化,发送AT指令使得wifi模块进入sta模式,自动发送wifi名称与密码连接至手机的热点,接入TCP,并开启通透传递模式。
2.通过手机发送led信号让wifi模块接收到信息,并返回单片机,在串口2上显示,并翻转单片机上的led灯,返回连接成功信息到手机上。
3.通过手机发送舵机信号让wifi模块接收到信息,返回单片机,在串口2上显示,并控制连接在单片机上的舵机转动,返回连接成功信息到手机上。

连线图

stm32通过uart1与wifi连接,
stlink连接stm32,
usb-ttl连接stm32的uart2,
舵机连接tim4来实现用脉冲控制舵机转动角度。

完成效果

使程序能够自行连接给定的WIFI热点和服务器并实现双向通信,通过wifi模块完成手机对stm32外设(灯和舵机)的控制

wifi模块初始化

wifi模块的初始化中,有几个指令是不可缺少的:

  • AT测试
  • AT+CWMODE=1设置工作模式
  • AT+CWJAP=“热点名称”,“热点密码”
  • AT+CIPSTART=“TCP”,“服务器地址”,端口号

代码解析

  • 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);
}
  • 发送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);
}
  • 舵机控制代码
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);    //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);}}}

遇到的问题

  1. 刚开始wifi模块初始化自动加载的时候会出问题,之后发现是初始化代码里缺少了通透模式的设定,使得无法通过wifi连续传递信息
  2. 写代码的时候容易把函数写在主程序后,有时候keil会报错,解决方法是创建一个新的c程序,在主函数里include这个程序的头文件,之后引用就不会出现这样的问题了
  3. 串口发送与接收十分重要,有时候可以用来检测wifi模块是否能连接上stm32

总结

希望自己以后可以码代码的时候更加细致,这样能让工程不会因为一些很小的bug而崩溃。

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

  1. [CubeMX]stm32通过wifi模块手机控制麦轮小车

    由于机器人比赛用到了麦轮小车,自己又使用wifi模块写过程序,因此做了一个可以用手机APP控制的小车, 同时使用FreeRTOS实现多任务处理,使得stm32的实时性更高. stm32通过8266wi ...

  2. 通过LY-WIFI-1智能WiFi模块实现手机APP控制LED灯————uno端

    uno端 android端完成后,开始实现uno端,主要工作就是接板子和上传代码到单片机.在编写代码前,我们先来了解一下wifi传感器的常用命令 1.wifi传感器常用AT指令 2.针脚接线 1.wi ...

  3. 关于wifi模块连接路由器远程控制的一些问题

    问题一,wifi模块可以连接路由器,是不是就能实现远程控制呢? 回答:wifi模块可以连接路由器,说明实现路由器的局域网控制没有问题. 问题二:在远程控制的过程中,我可以自己在家里面搭建服务器实现吗? ...

  4. 51单片机通过WIFI模块ESP8266控制LED灯

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621 一.系统方案 手机APP通过ESP8266 WIFI模块与51单片机通信 ...

  5. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  6. 最近学习了用stm32连接wifi模块,过程比较坎坷,这里记录一下学习过程

    这里用到开发板为stm32f103,wifi模块为ESP8266,实验目的是PC机建立一个TCP server,ESP8266作为Client加入到此网络中,要求每次开发板启动时自动完成对Wifi模块 ...

  7. WIFI模块连接手机

    配置WIFI模块AP: AT+CWSAP="ESP8266","12345678",3,4 设置AP的ssid为"ESP8266",密码12 ...

  8. 1.2、通过WiFi模块连接手机控制小灯的亮灭(AT指令)

    #include<reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit LED = P0^1;u8 dat; ...

  9. 单片机AT指令控制WiFi模块联网及远程控制LED灯

最新文章

  1. java定义一个盒子类box_定义一个Box(盒子)类,在该类定义中包括数据成员: length(长),width(宽)和height(...
  2. jquery ajax html方法吗,jQuery ajax方法
  3. vivado常规操作之烧写bit文件_固化mcs文件_调试界面debug之ila与vio的操作
  4. 用过C#的朋友可能认为它是一种十分安全的语言,其实C#也可以做到经典的缓冲区溢出。 本文章将用一个实例来描述C#究竟是如何发生缓冲区溢出的! 首先建立一个C# Console工程,并开启工程的“允许
  5. 一种基于语音识别的机器人语义识别系统的制作方法
  6. go设置后端启动_Vue 之前后端分离的跨域
  7. 现有Android项目中集成Flutter/Flutter混合开发实战(一)
  8. kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
  9. 机器学习-cs229-逻辑回归
  10. Mac怎么创建加密文件夹
  11. 中国龙与西方龙的区别
  12. Burp Suite爆破Basic认证密码
  13. Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane),TextArea右键菜单 组件使用案例
  14. 3d打印【遇到的问题】--卷边、倒塌、slic3r
  15. 判断是否是手机号码的方法
  16. WAP(wml)开发教程10--WAP网站服务器配置
  17. python自动化工具之pywinauto(三)_自动化工具之三:pywinauto
  18. 什么是Arduino
  19. 大学物理学下——静电场05高斯定理
  20. ET文件和XLS之间的转化

热门文章

  1. 黎曼猜想历史进展-大事记
  2. KL15和汽车钥匙档位
  3. 高等几何——射影变换5
  4. 教你5分钟做成一个ASP论坛
  5. Android 获取ROM版本号
  6. 2022年中国一体化压铸行业概览:*引领潮流,*或成资本新宠
  7. Python之列表、矩阵、数组的相互转换
  8. 【R语言】package ‘xxx‘ is not available for this version of R
  9. 迅雷下载百度云引发的“事故”
  10. 扰动法(数值法)求雅克比矩阵