通过网络调试,上位机电脑控制下位机单片机板载灯的亮灭
单片机先说:“你好,我在!”
电脑听到后,才愿意说:“那好,开灯吧!”
单片机收到“开灯”命令,就把 LED 灯点亮。
为什么必须发送温湿度“伪数据”(比如 "t:21.5 h:32.0"),WiFi 模块(ESP8266)才能正常接收 LEDA_ON / LEDA_OF 指令并控制 LED?
while(1)
{DHT11_TEST();if(ucharT_data_H !=0) {sprintf(buf, "t:%d.%d h:%d.%d", ...);HAL_UART_Transmit(&huart2, (uint8_t*)buf, 13, 2000); // 发真实数据(可能失败)}HAL_UART_Transmit(&huart2, (uint8_t*)"t:21.5 h:32.0", 13, 2000); // 固定发“伪数据”if(UsartType2.receive_flag) {// 处理 LEDA_ON / LEDA_OF}
}
mian函数具体代码
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** <h2><center>© Copyright (c) 2023 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"
#include "adc.h"
#include "lcd.h"
#include "esp8266.h"
#include "dht11.h"
#include "bsp.h"
#include "stm32f0xx_hal.h"
#include "key.h"
/**/
//音频对照
#define H7 262 //高音 xi //音乐的高低频率 做成了一个宏。
#define H6 286 //高音 la
#define H5 311
#define H4 349
#define H3 392
#define H2 440
#define H1 494
#define Z7 523 //中音xi
#define Z6 587 //中音la
#define Z5 659
#define Z4 698
#define Z3 784
#define Z2 880
#define Z1 987
#define L7 1046 //低音xi
#define L6 1174 // 低音la
#define L5 1318
#define L4 1396
#define L3 1567
#define L2 1760
/**/uint8_t revData[100];
uint8_t esp8266RevData[200]; //存储接收的数据void SystemClock_Config(void);
int rectangle(int x, int y, int l, int w, int color);
void beep_init();
void beep(int freq, int ms);
void WIFI_Init();
void Light_Init();/*** @brief The application entry point.* @retval int*/
int main(void)
{char buf[50]={0};// 硬件初始化HAL_Init();//设置系统时钟 SystemClock_Config();//GPIO初始化MX_GPIO_Init();//GPIO写入函数 引脚组 引脚号 值HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7,GPIO_PIN_SET);//屏幕Lcd_Init();//清除屏幕 rgba//Lcd_Clear(0xf000);Lcd_Clear(YELLOW);//wifi初始化WIFI_Init();//连接wifi 如果成功 在屏幕上 显示ip地址if(initEsp8266()){Gui_DrawFont_GBK16(10,10,BLACK,YELLOW,StationIPV4);}while(1){//收集温度湿度数据DHT11_TEST();if(ucharT_data_H !=0){//将收集到的数据 存放到字符串当中sprintf(buf,"t:%d.%d h:%d.%d",ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L);//Gui_DrawFont_GBK16(10,10,BLACK,YELLOW,buf);//发送数据 位置 数据 长度 最大延时HAL_UART_Transmit(&huart2,(uint8_t*)buf,13,2000);}HAL_UART_Transmit(&huart2,(uint8_t*)"t:21.5 h:32.0",13,2000);//如果单片机接收到了消息if(UsartType2.receive_flag){Gui_DrawFont_GBK16(10,70,RED,YELLOW,UsartType2.usartDMA_rxBuf);if(strstr(UsartType2.usartDMA_rxBuf,"LEDA_ON")!=0)HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_RESET);if(strstr(UsartType2.usartDMA_rxBuf,"LEDA_OF")!=0)HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_SET);//清空消息以便下次接收memset(UsartType2.usartDMA_rxBuf,0,sizeof(UsartType2.usartDMA_rxBuf));UsartType2.Usart_rx_len=0;}}
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}
void Light_Init()
{MX_DMA_Init(); //ADC数据读取用到了DMAMX_ADC_Init(); //初始化ADCHAL_ADC_Start_DMA(&hadc,(uint32_t*)ADC_DMA_Value,ADC_NUM);//开始转换ADC
}
void Error_Handler(void)
{/* USER CODE END Error_Handler_Debug */
}
void WIFI_Init()
{MX_DMA_Init(); MX_USART1_UART_Init();MX_USART2_UART_Init();MX_ADC_Init(); HAL_ADC_Start_DMA(&hadc,(uint32_t*)ADC_DMA_Value,ADC_NUM);UsartType1.dmaSend_flag =0;UsartType2.dmaSend_flag =0;__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); HAL_UART_Receive_DMA(&huart2,a_Usart2_RxBuffer,RXLENGHT); }
void beep_init()
{GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void myDelay(int n)
{int i, j;for(i = 0; i < n; i++){for(j = 0; j < 5; j++){;}}
}
void beep(int freq, int ms) //freq 频率 ms 声音播放时间
{int i;for(i = 0; i < ms * 1000 / freq / 2; i++){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7, GPIO_PIN_RESET);myDelay(freq);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7, GPIO_PIN_SET);myDelay(freq); }
}
#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
先在keil中设置好port

图1.1 esp8266.h文件的设置
使用网络调试助手检测是否可以正常开闭板载小灯,如图显示,在发送LEDA_ON的数据时,小灯打开,在发送LEDA_OF的数据时,小灯熄灭


图 发送数据LEDA_ON 图1.1 发送数据LEDA_OF
3.3 实物整体测试
在上位机qt中点击开灯,则板载灯亮起,点击关灯,则板载灯熄灭

