找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7935|回复: 7
打印 上一主题 下一主题
收起左侧

手机端APP通过Wifi TCP控制LED呼吸灯状况的stm32源码

  [复制链接]
跳转到指定楼层
楼主
keil 手机TCP控制灯光 stm32f103
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: 3. 手机端APP通过Wifi控制开发板
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  RS232是一个国际通用标准的串行数据通信接口,用于两个设备直接数据交换。本例程使用USART
外设功能,实现stm32向PC端发送数据,并等待接收来着PC端的信息中断,然后再回传信息给PC端。
  YS_F1Pro开发板上集成一个ESP8266 WiFi模块,只需要通过USART即可与之通信,开发板设计
通过跳线帽即可选择USART2与之连接。
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP3        PB0           LED1               已接入
  JP4        PG6           LED2               已接入
  JP5        PG7           LED3               已接入
  JP6        PD3         DATA(AM2302)         已接入
  CN10       PA2         RXD(WIFI)            已接入
  CN10       PA3         TXD(WIFI)            已接入
  
【3】操作及现象
  保证JP1、JP2、JP3..JP6和CN10端子上的8个跳线帽插入正确。参考文档
《硬石YS-F1Pro开发板软件设计手册(手机通过ESP8266控制开发板).pdf》。
修过本例程中main.c文件中有关WiFi账号、密码,以及要连接的服务器IP(自己电脑IP)和端口(8000),
编译程序。然后使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口,在
电脑端打开串口调试助手工具,选择对应端口,设置参数为115200 8-NO-1,下载程序之后,在串口调
试助手窗口可接收到信息。等待ESP8266正确连接上网络后在网络调试助手接口接收到数据。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/




单片机源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * 文件名程: main.c
  4.   * 作    者: 硬石嵌入式开发团队
  5.   * 版    本: V1.0
  6.   * 编写日期: 2015-10-04
  7.   * 功    能: WiFi(ESP8266)底层驱动实现
  8.   ******************************************************************************
  9.   * 说明:
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
  11.   * 版权归硬石嵌入式开发团队所有,请勿商用。
  12.   ******************************************************************************
  13.   */
  14. /* 包含头文件 ----------------------------------------------------------------*/
  15. #include "stm32f1xx_hal.h"
  16. #include "usart/bsp_debug_usart.h"
  17. #include "ESP8266/bsp_esp8266.h"
  18. #include "beep/bsp_beep.h"
  19. #include "led/bsp_led.h"
  20. #include "stdlib.h"
  21. #include <string.h>
  22. #include "GeneralTIM/bsp_GeneralTIM.h"

  23. /* 私有类型定义 --------------------------------------------------------------*/
  24. /* 私有宏定义 ----------------------------------------------------------------*/
  25. #define User_ESP8266_ApSsid                       "yingshi"              //要连接的热点的名称
  26. #define User_ESP8266_ApPwd                        "yingshi123"           //要连接的热点的密钥

  27. #define User_ESP8266_TcpServer_IP                 "192.168.3.4"       //要连接的服务器的 IP
  28. #define User_ESP8266_TcpServer_Port                "1234"                  //要连接的服务器的端口

  29. /* 私有变量 ------------------------------------------------------------------*/
  30. static uint8_t PWM_start=0;
  31. static uint8_t First_stemp=0;
  32. static uint8_t Second_stemp=0;
  33. static uint8_t stop_stemp=0;
  34. static uint8_t Third_temp=0;
  35. /* 扩展变量 ------------------------------------------------------------------*/
  36. extern __IO uint8_t ucTcpClosedFlag;

  37. /* 私有函数原形 --------------------------------------------------------------*/
  38. /* 函数体 --------------------------------------------------------------------*/
  39. /**
  40.   * 函数功能: 系统时钟配置
  41.   * 输入参数: 无
  42.   * 返 回 值: 无
  43.   * 说    明: 无
  44.   */
  45. void SystemClock_Config(void)
  46. {
  47.   RCC_OscInitTypeDef RCC_OscInitStruct;
  48.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  49.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
  50.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  51.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  52.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  53.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  54.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
  55.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  56.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  57.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  58.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
  59.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
  60.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz
  61.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
  62.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

  63.         // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
  64.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次
  65.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
  66.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器
  67.   /* 系统滴答定时器时钟源 */
  68.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  69.   /* 系统滴答定时器中断优先级配置 */
  70.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  71. }

  72. /**
  73.   * 函数功能: 主函数.
  74.   * 输入参数: 无
  75.   * 返 回 值: 无
  76.   * 说    明: 无
  77.   */
  78. int main(void)
  79. {  
  80.   uint8_t ucStatus;  
  81.   uint8_t pCH;
  82.   
  83.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  84.   HAL_Init();
  85.   /* 配置系统时钟 */
  86.   SystemClock_Config();

  87.   LED_GPIO_Init();
  88.   BEEP_GPIO_Init();
  89.   
  90.   /* 通用定时器初始化并配置PWM输出功能 */
  91.   GENERAL_TIMx_Init();
  92.   /* 初始化串口并配置串口中断优先级 */
  93.   MX_DEBUG_USART_Init();
  94.   
  95.   ESP8266_Init();
  96.   
  97.   ESP8266_Init();
  98.   printf("正在配置 ESP8266 ......\n" );
  99.   
  100.   if(ESP8266_AT_Test())
  101.   {
  102.     printf("AT test OK\n");
  103.   }
  104.   printf("\n< 1 >\n");
  105.         if(ESP8266_Net_Mode_Choose(STA))
  106.   {
  107.     printf("ESP8266_Net_Mode_Choose OK\n");
  108.   }  
  109.   printf("\n< 2 >\n");
  110.   while(!ESP8266_JoinAP(User_ESP8266_ApSsid,User_ESP8266_ApPwd));               
  111.         printf("\n< 3 >\n");
  112.   ESP8266_Enable_MultipleId(DISABLE);       
  113.         while(!ESP8266_Link_Server(enumTCP,User_ESP8266_TcpServer_IP,User_ESP8266_TcpServer_Port,Single_ID_0));       
  114.         printf("\n< 4 >\n");
  115.   while(!ESP8266_UnvarnishSend());       
  116.         printf("配置 ESP8266 完毕\n");
  117.   __HAL_UART_ENABLE_IT(&husartx_esp8266, UART_IT_IDLE);
  118.   /* 无限循环 */
  119.   while (1)
  120.   {
  121.     ESP8266_ReceiveString(ENABLE);
  122.     if(strEsp8266_Fram_Record .InfBit .FramFinishFlag )
  123.                 {
  124.             strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';
  125.       printf ( "\r\n%s\r\n", strEsp8266_Fram_Record .Data_RX_BUF );
  126.       /*将接收到的字符串转成整形数*/
  127.       pCH=atoi(strEsp8266_Fram_Record .Data_RX_BUF);
  128.        switch(pCH)
  129.        {
  130.          case 0:
  131.            PWM_start=1;
  132.            First_stemp=1;
  133.            Third_temp++;
  134.          break;
  135.          case 1:
  136.            PWM_start=1;
  137.            Second_stemp=1;
  138.          break;
  139.          case 2:
  140.            PWM_start=1;
  141.            stop_stemp=1;
  142.          break;
  143.        }         
  144.     }
  145.     if(PWM_start==1)   
  146.     {
  147.       PWM_start=0;
  148.       HAL_TIM_Base_Start_IT(&htimx);
  149.       HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_3);      
  150.     }      
  151.                 HAL_Delay(100);
  152.    
  153.     if(ucTcpClosedFlag)                                             //检测是否失去连接
  154.                 {
  155.                         ESP8266_ExitUnvarnishSend();                                    //退出透传模式                       
  156.                         do ucStatus = ESP8266_Get_LinkStatus();                         //获取连接状态
  157.                         while(!ucStatus);                       
  158.                         if(ucStatus==4)                                             //确认失去连接后重连
  159.                         {
  160.                                 printf("正在重连热点和服务器 ......\n");                               
  161.                                 while(!ESP8266_JoinAP(User_ESP8266_ApSsid,User_ESP8266_ApPwd));                               
  162.                                 while(!ESP8266_Link_Server(enumTCP,User_ESP8266_TcpServer_IP,User_ESP8266_TcpServer_Port,Single_ID_0));                               
  163.                                 printf("重连热点和服务器成功!!!\n");
  164.                         }                       
  165.                         while(!ESP8266_UnvarnishSend());                                       
  166.                 }
  167.   }
  168. }

  169. /**
  170.   * 函数功能: 串口接收完成回调函数
  171.   * 输入参数: 无
  172.   * 返 回 值: 无
  173.   * 说    明:无
  174.   */
  175. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
  176. {
  177.   if(strEsp8266_Fram_Record.InfBit.FramLength<(RX_BUF_MAX_LEN-1))     //预留1个字节写结束符
  178.   {
  179.     strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit.FramLength]=esp8266_rxdata;
  180.     strEsp8266_Fram_Record.InfBit.FramLength++;
  181.     HAL_UART_Receive_IT(&husartx_esp8266,&esp8266_rxdata,1);
  182.   }

  183. }

  184. /**
  185.   * 函数功能: 非阻塞模式下定时器的回调函数
  186.   * 输入参数: htim:定时器句柄
  187.   * 返 回 值: 无
  188.   * 说    明: 无
  189.   */
  190. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  191. {
  192.         static uint8_t period_cnt = 0;                /* 用于计算周期数 */
  193.   static uint8_t PWM_data = 0;
  194.   period_cnt++;
  195.   /* 若输出的周期数大于20,输出下一种脉冲宽的PWM波 */
  196.   if(period_cnt >= 10)                                                                               
  197.   {
  198.     /* 根据PWM表修改定时器的比较寄存器值 */
  199.     htimx.Instance->CCR3 = PWM_data;       
  200.     //第一种情况,设定百分之十的亮度
  201.     if((First_stemp==1)&&(Third_temp==1))
  202.     {
  203.       PWM_data++;
  204.       if( PWM_data >=  255*0.1)                                                               
  205.       {
  206.         First_stemp=0;
  207.         PWM_data=255*0.1;                                                               
  208.       }      
  209.     }
  210.     //第二种情况,设定百分之七十的亮度
  211.     if(Second_stemp==1)
  212.     {
  213.       PWM_data++;     
  214.       if( PWM_data >=  255*0.7)                                                               
  215.       {
  216.         Third_temp=1;
  217.         Second_stemp=0;
  218.         PWM_data=255*0.7;                                                               
  219.       }      
  220.     }
  221.     //第三种情况,在百分之七十的基础上回到百分之十的亮度
  222.     if((Third_temp==2)&&(First_stemp==1))
  223.     {
  224.       PWM_data--;
  225.       if( PWM_data<=  255*0.1)                                                               
  226.       {
  227.         Third_temp=0;
  228.         First_stemp=0;
  229.         PWM_data=0;
  230.         PWM_data=255*0.1;                                                               
  231.       }  
  232.     }
  233.     //第四种情况,停止显示
  234.     if(stop_stemp==1)
  235.     {
  236.       PWM_data=0;   
  237.       if( PWM_data == 0)                                                               
  238.       {
  239.         Third_temp=0;
  240.         stop_stemp=0;
  241.         PWM_data=0;                                
  242.       }      
  243.     }
  244.    
  245.    /* 重置周期计数标志 */
  246.    period_cnt=0;                                                                                       
  247.   }
  248. }


  249. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
复制代码

所有资料51hei提供下载:
3. 手机端APP通过Wifi控制LED呼吸灯状况.rar (7.43 MB, 下载次数: 137)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:472904 发表于 2019-1-25 17:21 | 只看该作者
顶!!!!!!!!!!!!!!!!
回复

使用道具 举报

板凳
ID:531037 发表于 2019-7-4 18:27 | 只看该作者
资料很不错,感谢大佬
回复

使用道具 举报

地板
ID:531037 发表于 2019-7-4 20:57 | 只看该作者
超级超级感谢,感谢
回复

使用道具 举报

5#
ID:280466 发表于 2019-7-23 16:12 | 只看该作者
App通过WiFi控制LED
回复

使用道具 举报

6#
ID:282095 发表于 2019-7-24 09:06 | 只看该作者
想问一下如何通过wift模块来进行控制
回复

使用道具 举报

7#
ID:549902 发表于 2019-12-16 15:34 | 只看该作者
请问这是单片机的吗
回复

使用道具 举报

8#
ID:63317 发表于 2020-5-23 19:57 | 只看该作者
谢谢分享资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表