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

/**

******************************************************************************

* 文件名程: main.c

* 作    者: 硬石嵌入式开发团队

* 版    本: V1.0

* 编写日期: 2015-10-04

* 功    能: WiFi(ESP8266)底层驱动实现

******************************************************************************

* 说明:

* 本例程配套硬石stm32开发板YS-F1Pro使用。

* 版权归硬石嵌入式开发团队所有,请勿商用。

******************************************************************************

*/

/* 包含头文件 ----------------------------------------------------------------*/

#include "stm32f1xx_hal.h"

#include "usart/bsp_debug_usart.h"

#include "ESP8266/bsp_esp8266.h"

#include "beep/bsp_beep.h"

#include "led/bsp_led.h"

#include "stdlib.h"

#include

#include "GeneralTIM/bsp_GeneralTIM.h"

/* 私有类型定义 --------------------------------------------------------------*/

/* 私有宏定义 ----------------------------------------------------------------*/

#define User_ESP8266_ApSsid                       "yingshi"              //要连接的热点的名称

#define User_ESP8266_ApPwd                        "yingshi123"           //要连接的热点的密钥

#define User_ESP8266_TcpServer_IP                 "192.168.3.4"       //要连接的服务器的 IP

#define User_ESP8266_TcpServer_Port                "1234"                  //要连接的服务器的端口

/* 私有变量 ------------------------------------------------------------------*/

static uint8_t PWM_start=0;

static uint8_t First_stemp=0;

static uint8_t Second_stemp=0;

static uint8_t stop_stemp=0;

static uint8_t Third_temp=0;

/* 扩展变量 ------------------------------------------------------------------*/

extern __IO uint8_t ucTcpClosedFlag;

/* 私有函数原形 --------------------------------------------------------------*/

/* 函数体 --------------------------------------------------------------------*/

/**

* 函数功能: 系统时钟配置

* 输入参数: 无

* 返 回 值: 无

* 说    明: 无

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct;

RCC_ClkInitTypeDef RCC_ClkInitStruct;

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟

HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz

HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);

// HAL_RCC_GetHCLKFreq()/1000    1ms中断一次

// HAL_RCC_GetHCLKFreq()/100000         10us中断一次

// HAL_RCC_GetHCLKFreq()/1000000 1us中断一次

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器

/* 系统滴答定时器时钟源 */

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* 系统滴答定时器中断优先级配置 */

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

/**

* 函数功能: 主函数.

* 输入参数: 无

* 返 回 值: 无

* 说    明: 无

*/

int main(void)

{

uint8_t ucStatus;

uint8_t pCH;

/* 复位所有外设,初始化Flash接口和系统滴答定时器 */

HAL_Init();

/* 配置系统时钟 */

SystemClock_Config();

LED_GPIO_Init();

BEEP_GPIO_Init();

/* 通用定时器初始化并配置PWM输出功能 */

GENERAL_TIMx_Init();

/* 初始化串口并配置串口中断优先级 */

MX_DEBUG_USART_Init();

ESP8266_Init();

ESP8266_Init();

printf("正在配置 ESP8266 ......\n" );

if(ESP8266_AT_Test())

{

printf("AT test OK\n");

}

printf("\n< 1 >\n");

if(ESP8266_Net_Mode_Choose(STA))

{

printf("ESP8266_Net_Mode_Choose OK\n");

}

printf("\n< 2 >\n");

while(!ESP8266_JoinAP(User_ESP8266_ApSsid,User_ESP8266_ApPwd));

printf("\n< 3 >\n");

ESP8266_Enable_MultipleId(DISABLE);

while(!ESP8266_Link_Server(enumTCP,User_ESP8266_TcpServer_IP,User_ESP8266_TcpServer_Port,Single_ID_0));

printf("\n< 4 >\n");

while(!ESP8266_UnvarnishSend());

printf("配置 ESP8266 完毕\n");

__HAL_UART_ENABLE_IT(&husartx_esp8266, UART_IT_IDLE);

/* 无限循环 */

while (1)

{

ESP8266_ReceiveString(ENABLE);

if(strEsp8266_Fram_Record .InfBit .FramFinishFlag )

{

strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ]  = '\0';

printf ( "\r\n%s\r\n", strEsp8266_Fram_Record .Data_RX_BUF );

/*将接收到的字符串转成整形数*/

pCH=atoi(strEsp8266_Fram_Record .Data_RX_BUF);

switch(pCH)

{

case 0:

PWM_start=1;

First_stemp=1;

Third_temp++;

break;

case 1:

PWM_start=1;

Second_stemp=1;

break;

case 2:

PWM_start=1;

stop_stemp=1;

break;

}

}

if(PWM_start==1)

{

PWM_start=0;

HAL_TIM_Base_Start_IT(&htimx);

HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_3);

}

HAL_Delay(100);

if(ucTcpClosedFlag)                                             //检测是否失去连接

{

ESP8266_ExitUnvarnishSend();                                    //退出透传模式

do ucStatus = ESP8266_Get_LinkStatus();                         //获取连接状态

while(!ucStatus);

if(ucStatus==4)                                             //确认失去连接后重连

{

printf("正在重连热点和服务器 ......\n");

while(!ESP8266_JoinAP(User_ESP8266_ApSsid,User_ESP8266_ApPwd));

while(!ESP8266_Link_Server(enumTCP,User_ESP8266_TcpServer_IP,User_ESP8266_TcpServer_Port,Single_ID_0));

printf("重连热点和服务器成功!!!\n");

}

while(!ESP8266_UnvarnishSend());

}

}

}

/**

* 函数功能: 串口接收完成回调函数

* 输入参数: 无

* 返 回 值: 无

* 说    明:无

*/

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)

{

if(strEsp8266_Fram_Record.InfBit.FramLength

{

strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit.FramLength]=esp8266_rxdata;

strEsp8266_Fram_Record.InfBit.FramLength++;

HAL_UART_Receive_IT(&husartx_esp8266,&esp8266_rxdata,1);

}

}

/**

* 函数功能: 非阻塞模式下定时器的回调函数

* 输入参数: htim:定时器句柄

* 返 回 值: 无

* 说    明: 无

*/

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

static uint8_t period_cnt = 0;                /* 用于计算周期数 */

static uint8_t PWM_data = 0;

period_cnt++;

/* 若输出的周期数大于20,输出下一种脉冲宽的PWM波 */

if(period_cnt >= 10)

{

/* 根据PWM表修改定时器的比较寄存器值 */

htimx.Instance->CCR3 = PWM_data;

//第一种情况,设定百分之十的亮度

if((First_stemp==1)&&(Third_temp==1))

{

PWM_data++;

if( PWM_data >=  255*0.1)

{

First_stemp=0;

PWM_data=255*0.1;

}

}

//第二种情况,设定百分之七十的亮度

if(Second_stemp==1)

{

PWM_data++;

if( PWM_data >=  255*0.7)

{

Third_temp=1;

Second_stemp=0;

PWM_data=255*0.7;

}

}

//第三种情况,在百分之七十的基础上回到百分之十的亮度

if((Third_temp==2)&&(First_stemp==1))

{

PWM_data--;

if( PWM_data<=  255*0.1)

{

Third_temp=0;

First_stemp=0;

PWM_data=0;

PWM_data=255*0.1;

}

}

//第四种情况,停止显示

if(stop_stemp==1)

{

PWM_data=0;

if( PWM_data == 0)

{

Third_temp=0;

stop_stemp=0;

PWM_data=0;

}

}

/* 重置周期计数标志 */

period_cnt=0;

}

}

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

你可能感兴趣的:(C#,Android,wifi控制灯)