7.进一步完善程序【七天物联网智能家居训练营】

2023-05-16

本文是百问网七天物联网智能家居训练营学习笔记,官网链接。

1 增加UDP发送函数

再来回顾下UDP发送的流程:
在这里插入图片描述
对于AT指令来说,只是使用的具体指令不同而已。和TCP发送函数非常类似,代码如下:


// 向ESP8266发送UDP数据
uint8_t ESP8266_Send_UDP(char *data)
{
	// 1.准备发送的指令
	char buf[256] = {0};
	uint8_t len = strlen(data);
	sprintf(buf, "AT+CIPSEND=%d\r\n", len);
	// 2.发送指令
	if (ESP8266_SendCommand(buf, "OK", 500) == 0)
	{
		// 3.发送数据
		ESP8266_SendCommand(data, "OK", 1000);
		return 0;
	}
	return 1;
}

可以看到代码还是非常简单的。

2 增加手工输入wifi账号和密码的功能

我们可以通过在开机时检测用户按键,如果用户在开机的2秒内按下按键,我们就允许用户通过串口输入wifi名称和wifi密码,然后使用输入的wifi名称和密码进行相关处理,具体的代码如下:

// 更新WIFI连接信息
void Key_Update_WIFI(char *cmd, uint16_t time)
{
	char ch = 0;
	char len = 0;
	char ssid_buf[20] = "100ask";
	char pwd_buf[20] = "100ask100ask";
	char wifi_buf[100] = "AT+CWJAP_DEF=\"";
	
	// 1.设置等待时间
	HAL_Delay(time);
	
	// 2.检测按键是否按下(是否需要更新WIFI)
	if (Key_GetFlag() == 1)
	{
		// 2.1获取WIFI账号
		memset(ssid_buf, 0, 20);
		
		printf("Please enter SSID:");
		while(ch != '\r')
		{
			ch = getchar();
			if(ch > ' ')
			{
				printf("%c",ch);
				ssid_buf[len] = ch;
				len++;
			}
		}
		
		// 2.1获取WIFI密码
		ch = 0;
		len = 0;
		memset(pwd_buf, 0, 20);
		
		printf("\r\nPlease enter Password:");
		while(ch != '\r')
		{
			ch = getchar();
			if(ch > ' ')
			{
				printf("%c",ch);
				pwd_buf[len] = ch;
				len++;
			}
		}
	}
	
	// 3.组合指令
	strcat(wifi_buf, ssid_buf);
	strcat(wifi_buf, "\",\"");
	strcat(wifi_buf, pwd_buf);
	strcat(wifi_buf, "\"");
	
	memcpy(cmd, wifi_buf, strlen(wifi_buf));
}

最后,main函数如下:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();

  /* Initialize interrupts */
  MX_NVIC_Init();
  /* USER CODE BEGIN 2 */
  
  //uint16_t data_len = 0;
  uint8_t wifi_data[200] = {0};
  uint8_t rx_data[200] = {0};
  //uint8_t tx_data[200] = "AT\r\n";
  
  // 0.检测是否更新WIFI信息
  Key_Update_WIFI((char *)wifi_data, 2000);
  
  // 1.启动串口2接收(中断方式)
  USART2_StartRx();
  
  // 2.串口2发送AT指令,启动TCP服务
  //USART2_Transmit(tx_data, sizeof(tx_data), 500);
  ESP8266_SendCommand("AT+RST", "OK", 500);
  HAL_Delay(1000);
  ESP8266_SendCommand("AT+CWMODE=1", "OK", 500);
  ESP8266_SendCommand((char *)wifi_data, "OK", 5000);
  //ESP8266_SendCommand("AT+CWJAP=\"100ask\",\"100ask100ask\"", "OK", 5000);
  //ESP8266_SendCommand("AT+CIPMUX=1", "OK", 500);
  //ESP8266_SendCommand("AT+CIPSERVER=1,9999", "OK", 500);
  ESP8266_SendCommand("AT+CIPSTART=\"UDP\",\"192.168.1.1\",9999,9999,2", "OK", 500);
  ESP8266_SendCommand("AT+CIFSR", "OK", 500);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	// 3.1 按键按下,发送门铃信号
	if (Key_GetFlag() == 1)
	{
		//ESP8266_Send_TCP("{\"data\":\"doorbell\",\"status\":\"1\"}");
		ESP8266_Send_UDP("{\"data\":\"doorbell\",\"status\":\"1\"}");
	}
	
	
	// 3.2 收到数据,控制灯
	if (USART2_Receive(rx_data)) //接收到数据
	{
		if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"0\""))
		{
			printf("led off\n\r");
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
			USART2_ClearBuf();
			memset(rx_data, 0, 200);
		}
		else if (strstr((char *)rx_data, "\"dev\":\"led\",\"status\":\"1\""))
		{
			printf("led on\n\r");
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
			USART2_ClearBuf();
			memset(rx_data, 0, 200);
		}
	}
  }
  /* USER CODE END 3 */
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7.进一步完善程序【七天物联网智能家居训练营】 的相关文章

  • 从零学习VINS-Mono/Fusion源代码(三):IMU预积分公式推导

    本节学习IMU预积分 xff0c 推导离散时间下的IMU预积分公式 xff0c 并解读相应代码 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff1a
  • 从零学习VINS-Mono/Fusion源代码(六):后端优化

    本节解析VINS后端优化 xff0c 包括优化变量 残差约束的构建 xff0c ceres求解器等 VINS Mono Fusion代码学习系列 xff1a 从零学习VINS Mono Fusion源代码 xff08 一 xff09 xff
  • TX2配置RealSense D455相机SDK和ros驱动

    TX2配置RealSense D455相机SDK和ros驱动 1 SDK安装2 RealSense ros安装3 bug及解决3 1 realsense viewer显示usb2 13 2 Could not found ddynamic
  • C++中:和::的含义与区别

    前言 xff1a 相信大多数读者和我一样在C 43 43 中总是分不清 xff1a 和 xff1a xff1a 的区别 xff0c 现在 xff0c 咱们就彻底解决它 一 1 类作用域操作符 指明了成员函数所属的类 如 xff1a M f
  • Nuttx驱动(一)简介

    第一次写Nuttx系统的驱动 xff0c 用惯了rt thread FreeRTOS等RTOS或裸机的驱动编写 写Nuttx驱动感觉好蹩脚 xff0c 顺便记录一下 xff08 by the way 先完成 xff0c 再完善 xff09
  • Nuttx驱动(二)实例

    接上一篇文章 xff0c 这篇主要是nuttx驱动编写实践部分 基础部分请移驾 Nuttx驱动 xff08 一 xff09 简介 Nuttx驱动例程 在该例程中 xff0c 假设有这么一个设备 xff1a 有3个IO输出和一个IO输入的RG
  • 【转】CAN总线学习笔记(1)- CAN基础知识

    依照瑞萨公司的 CAN入门书 的组织思路来学习CAN通信的相关知识 xff0c 并结合网上相关资料以及学习过程中的领悟整理成笔记 好记性不如烂笔头 xff0c 加油 xff01 1 CAN的一些基本概念 1 1 什么是CAN总线 CAN 是
  • git如何找回本地被覆盖的代码

    1 方法1 git reflog 查看提交记录 xff0c 找到对应的commitId git reset hard 版本号 就回到当时的那个版本 xff08 git reset hard HEAD 64 n xff09 2 git pul
  • PID入门及无人机实战

    一 PID的理论知识 大家可以搜索 PID控制算法的C语言实现 绝对的好东西 很好的入门材料 下图就是从上面摘下来的PID控制流程图 二 利用温控讲解单环PID 我们可以在电路板上焊几个电阻进行加热 xff08 PWM控制加热速度 xff0
  • 无人机姿态解算_互补滤波(1)

    一 基础知识 1 坐标系 xff1a 遵循右手定则 1 1 大地坐标系 xff08 地球坐标系 xff09 xff1a 北 xff08 x轴 xff09 东 xff08 y轴 xff09 地 xff08 z轴 xff09 xff0c 地就是
  • C++从入门到进阶的系列书籍推荐

    目录 1 C 43 43 入门书籍 1 1 C语言程序设计 xff08 谭浩强 xff09 1 2 C 43 43 Primer中文版 xff08 第5版 xff09 2 VC 43 43 MFC书籍 2 1 VC 43 43 深入详解 x
  • 无人机姿态解算_扩展卡尔曼滤波(2)

    一 扩展卡尔曼滤波 KF和EKF的公式对比 xff08 基本没差别 xff09 二 扩展卡尔曼五个公式 利用扩展卡尔曼滤波估计四元数 下图是论文中的截图 可以和前面的卡尔曼滤波估计高度文章的那五个公式对应一下 观测矩阵的确定 三 代码的实现
  • 无人机高度估计_卡尔曼滤波

    一 卡尔曼滤波公式 线性系统的离散状态空间表达式 xff1a 这是卡尔曼五个标准公式的基础 式叫做系统状态方程 xff1a xk k时刻系统状态变量值 Ak 状态转移矩阵 Bk 控制矩阵 uk 1 k 1时刻系统的输入 wk 1 k 1时刻
  • 日常记录4_pixhawk电流计的使用

    1 实物图以及连接 注意事项 接电流计的时候 xff0c 先别给电流计通电 xff0c 要先接负载 xff08 即接到飞机那一端 xff09 再给电流计供电 xff0c 不然空载的时候 xff0c 电池给电流计的电流会很大 xff0c 导致
  • Android中的ListView

    文章目录 1 ListView概述2 适配器2 1 ArrayAdapter2 2 SimpleAdapter2 3 BaseAdapter 1 ListView概述 下面看一下ListView的应用场景 xff1a 2 适配器 先看下适配
  • Android中的ViewPager2

    文章目录 1 ViewPager2简介1 1 ViewPager2应用场合1 2 ViewPager2应用背景 2 应用案例2 1 图片轮播2 2 导航 1 ViewPager2简介 1 1 ViewPager2应用场合 ViewPager

随机推荐

  • Qt界面语言国际化

    文章目录 1 Qt界面语言国际化1 1 操作步骤 1 Qt界面语言国际化 1 1 操作步骤 操作步骤如下 xff1a 生成TS文件 xff08 LUPDATE xff09 编辑TS文件 xff08 LINGUIST xff09 发布TS文件
  • Qt工程pro文件配置详解

    文章目录 1 pro文件常用配置1 1 注释1 2 CONFIG1 3 DEFINES1 4 FORMS1 5 HEADERS1 6 INCLUDEPATH1 7 LIBS1 8 QT1 9 SOURCES1 10 TRANSLATIONS
  • Qt配置GUI程序控制台输出

    文章目录 1 Qt配置GUI程序控制台输出 1 Qt配置GUI程序控制台输出 下面看一下如何控制GUI程序控制台输出 xff1a 在 在 pro 文件中添加 xff1a CONFIG 43 61 console 选择 xff1a 项目 gt
  • 列表框QListWidget 类

    文章目录 1 QListWidget 简介2 QListWidget 常用操作2 1 添加操作2 2 删除操作 1 QListWidget 简介 Qt 提供 QListWidget 类列表框控件用来加载并显示多个列表项 QListWidge
  • Qt中的QSpinBox

    文章目录 1 QSpinBox1 1 QSpinBox 简介1 2 QSpinBox的主要属性 1 QSpinBox 1 1 QSpinBox 简介 QSpinBox 类提供了一个微调框部件 QSpinBox 允许用户选择一个值 xff0c
  • C/C++面试题1

    目录 1 C 面向对象的三大特性是什么 谈谈你对这三大特性的认识 2 include 和 include filename
  • QCheckBox

    文章目录 1 QCheckBox1 1 QCheckBox简介 1 QCheckBox 1 1 QCheckBox简介 QCheckBox 继承自 QAbstractButton xff0c 它提供了一个带文本标签的复选框 QCheckBo
  • QSlider

    文章目录 1 QSlider1 1 QSlider 简介 1 QSlider 1 1 QSlider 简介 QSlider 部件提供了一个垂直或水平滑动条 滑块是一个用于控制有界值的典型部件 它允许用户沿水平或垂直方向移动滑块 xff0c
  • QComboBox

    文章目录 1 QComboBox1 1 QComBox简介 1 QComboBox 1 1 QComBox简介 QComboBox 是下拉列表框组件类 xff0c 它提供一个下拉列表供用户选择 xff0c 也可以直接当作一个 QLineEd
  • QTreeWidget

    文章目录 1 QTreeWidget1 1 QTreeWidget简介 1 QTreeWidget 1 1 QTreeWidget简介 在 Qt 中的树形控件称为 QTreeWidget xff0c 而控件里的树形节点称为 QTreeWid
  • QMouseEvent

    文章目录 1 QMouseEvent1 1 特别说明 2 通过QMouseEvent事件实现窗口移动 1 QMouseEvent 1 1 特别说明 QMouseEvent没啥要注意的 xff0c 就是对于mouseMoveEvent xff
  • 1.基础概念【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 ARM 我们经常听所ARM xff0c 其实ARM有两种含义 xff1a ARM是一家公司 xff0c ARM也是一种处理器架构 RISC是精简指令集 xff0c 旨在
  • 2.单片机开发模式【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 单片机上手思路 对于一款新单片机 xff0c 我们可以采取如下思路进行上手 xff1a 去芯片原厂官网 xff0c 下载资料 xff0c 主要是获取数据手册和参考手册
  • 3.时钟与GPIO【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 时钟系统 首先我们要知道时钟的主要作用是用来同步 xff0c 现代的计算机系统是必然有时钟的 并且 xff0c 对于高级的单片机系统 xff0c 还会存在着不同频率的时
  • 4.中断与串口【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 中断 我们先来看一下什么是中断 xff1a 其实这种就是前后台的程序设计模式 我们来看下CM3内核都有哪些中断 xff0c 如下表 xff1a 对于CM3内核的单片来说
  • APT Hash sum mismatch错误的常见解决方法总结

    APT Hash sum mismatch错误的常见解决方法总结 LINUX报这个错误的时候 xff0c 有很多的原因 xff0c 通常是出现在使用apt get update的时候 xff0c apt 的全称是Advanced Packa
  • 安装Nvidia驱动run文件

    本文系转载 xff0c 出处 xff1a https blog csdn net lhx 998 article details 76135936 下载指定NVIDIA驱动安装包 xff08 run格式 xff09 run格式文件安装有时比
  • 5.AT指令【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 ESP8266 本文要使用的wifi模块为ESP8266 xff0c 我们直接使用官方提供的固件即可 xff0c 无须单独开发 直接通过串口和wifi模块进行通信 xf
  • 6.编写初步程序【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 程序流程回顾 先来回顾下TCP连接的流程 xff1a 下面看下UDP连接的流程 xff1a 整个程序的框架如下 xff1a 2 代码实现 这里我们使用串口2来操作 xf
  • 7.进一步完善程序【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 增加UDP发送函数 再来回顾下UDP发送的流程 xff1a 对于AT指令来说 xff0c 只是使用的具体指令不同而已 和TCP发送函数非常类似 xff0c 代码如下 x